- Maak een Unity 3D-project aan
- Maak in de Assets-map van je project een ForceSeatMI-map aan
- Kopieer de volgende bestanden naar de ForceSeatMI-map (ter referentie kun je een van onze Unity 3D-voorbeelden bekijken)
- ForceSeatMI.cs
- ForceSeatMI_Common.cs
- ForceSeatMI_Positioning.cs
- ForceSeatMI_Status.cs
- ForceSeatMI_TactileTranscuders.cs
- ForceSeatMI_Telemetry.cs
- ForceSeatMi_UnityAeroplane.cs
- ForceSeatMi_UnityVehicle.cs
| De ForceSeatMI API maakt gebruik van een DLL die wordt geïnstalleerd als onderdeel van de ForceSeatPM-software. Zorg ervoor dat ForceSeatPM op je computer is geïnstalleerd. |
Applicatie: positiecontrole
Voorbeelden:
- TableLogPos_Unity toont positionering in abstracte (logische, procentuele) eenheden
- TablePhyPos_Unity toont positionering in fysieke eenheden (Inverse Kinematics)
Gebruik voor beide voorbeelden het ingebouwde ForceSeatPM-profiel
SDK – Positioning.
Voor de positioneringsapplicatie is het gebruik van de ruwe ForceSeatMI API vereist. Een typische routine bestaat uit de volgende stappen:
- Importeer ForceSeatMI
- Maak een API-objectvariabele aan in je class:
private ForceSeatMI m_fsmi;
- Initialiseer deze in de Start-methode:
m_fsmi = new ForceSeatMI();
- Als alles is geladen, roep dan het volgende aan:
if (m_fsmi.IsLoaded())
{
m_fsmi.BeginMotionControl();
}
- De simulator moet met constante intervallen positioneringsgegevens verzenden via een van de volgende functies:
m_fsmi.SendTopTablePosLog(...);
m_fsmi.SendTopTablePosPhy(...);
m_fsmi.SendTopTableMatrixPhy(...);
- Roep aan het einde van de simulatie het volgende aan:
if (m_fsmi.IsLoaded())
{
m_fsmi.EndMotionControl();
m_fsmi.Dispose();
}
Code
De onderstaande code is afkomstig uit het voorbeeld
TableLogPos_Unity.
// FSMI-api
private ForceSeatMI m_fsmi;
// Positie in logische coördinaten die naar het platform wordt verzonden
private FSMI_TopTablePositionLogical m_platformPosition = new FSMI_TopTablePositionLogical();
void Start ()
{
// Laad de ForceSeatMI-bibliotheek uit de installatiemap van ForceSeatPM
// ForceSeatMI - BEGIN
m_fsmi = new ForceSeatMI();
if (m_fsmi.IsLoaded())
{
// Zoek de componenten van het platform
m_shaft = GameObject.Find("Shaft");
m_board = GameObject.Find("Board");
SaveOriginPosition();
SaveOriginRotation();
// Bereid de datastructuur voor door deze te wissen en de juiste grootte in te stellen
m_platformPosition.mask = 0;
m_platformPosition.structSize = (byte)Marshal.SizeOf(m_platformPosition);
m_platformPosition.state = FSMI_State.NO_PAUSE;
// Stel velden in die door de demo-applicatie kunnen worden gewijzigd
m_platformPosition.mask = FSMI_POS_BIT.STATE | FSMI_POS_BIT.POSITION;
m_fsmi.BeginMotionControl();
SendDataToPlatform();
// ForceSeatMI - END
}
else
{
Debug.LogError("ForceSeatMI-bibliotheek niet gevonden! Installeer ForceSeatPM.");
}
}
void OnDestroy()
{
// ForceSeatMI - BEGIN
if (m_fsmi.IsLoaded())
{
m_fsmi.EndMotionControl();
m_fsmi.Dispose();
}
// ForceSeatMI - END
}
private void SendDataToPlatform()
{
// Converteer parameters naar logische eenheden
// ForceSeatMI - BEGIN
m_platformPosition.state = FSMI_State.NO_PAUSE;
m_platformPosition.roll = (short)Mathf.Clamp(m_roll / DRAWING_ROLL_MAX * PLATFORM_POSITION_LOGIC_MAX, PLATFORM_POSITION_LOGIC_MIN, PLATFORM_POSITION_LOGIC_MAX);
m_platformPosition.pitch = (short)Mathf.Clamp(m_pitch / DRAWING_PITCH_MAX * PLATFORM_POSITION_LOGIC_MAX, PLATFORM_POSITION_LOGIC_MIN, PLATFORM_POSITION_LOGIC_MAX);
m_platformPosition.heave = (short)Mathf.Clamp(m_heave / DRAWING_HEAVE_MAX * PLATFORM_POSITION_LOGIC_MAX, PLATFORM_POSITION_LOGIC_MIN, PLATFORM_POSITION_LOGIC_MAX);
// Verzend gegevens naar het platform
m_fsmi.SendTopTablePosLog(ref m_platformPosition);
// ForceSeatMI - END
}
Applicatie: voertuigsimulatie
Voorbeelden: Telemetry_Veh_Unity (gebruik het ingebouwde ForceSeatPM-profiel
SDK – Vehicle Telemetry)
Voor voertuigsimulatie-applicaties kan de ForceSeatMI_UnityVehicle helper-interface worden gebruikt. Een typische routine bestaat uit de volgende stappen:
- Maak een API-objectvariabele aan in je class:
private ForceSeatMI_UnityVehicle m_Api;
- Initialiseer deze in de Start-methode:
m_Api = new ForceSeatMI_UnityVehicle();
- Roep aan:
- De simulator moet met constante intervallen telemetriegegevens verzenden via de volgende functie:
- Roep aan het einde van de simulatie het volgende aan:
Code
De onderstaande code is afkomstig uit het voorbeeld
Telemetry_Veh_Unity.
private void Start()
{
m_Rigidbody = GetComponent();
// ForceSeatMI - BEGIN
m_Api = new ForceSeatMI_UnityVehicle();
m_Api.Begin();
// ForceSeatMI - END
}
private void OnDestroy()
{
// ForceSeatMI - BEGIN
m_Api.End();
// ForceSeatMI - END
}
private void Move(float steering, float accel, float footbrake, float handbrake)
{
...
// ForceSeatMI - BEGIN
m_Api.Tick(m_Rigidbody, Time.deltaTime, false, 0, 0, m_CurrentGearNumber);
// ForceSeatMI - END
}
Applicatie: vluchtsimulatie
Voorbeelden: Telemetry_Fly_Unity (gebruik het ingebouwde ForceSeatPM-profiel
SDK – Plane Telemetry)
Voor vluchtsimulatie-applicaties kan de ForceSeatMi_UnityAeroplane helper-interface worden gebruikt. Een typische routine bestaat uit de volgende stappen:
- Maak een API-objectvariabele aan in je class:
private ForceSeatMi_UnityAeroplane m_Api;
- Initialiseer deze in de Start-methode:
m_Api = new ForceSeatMi_UnityAeroplane();
- Roep aan:
- De simulator moet met constante intervallen telemetriegegevens verzenden via de volgende functie:
- Roep aan het einde van de simulatie het volgende aan:
Code
De onderstaande code is afkomstig uit het voorbeeld
Telemetry_Fly_Unity.
private void Start()
{
m_Rigidbody = GetComponent();
m_OriginalDrag = m_Rigidbody.drag;
m_OriginalAngularDrag = m_Rigidbody.angularDrag;
// ForceSeatMI - BEGIN
m_Api = new ForceSeatMI_UnityAeroplane();
m_Api.Begin();
// ForceSeatMI - END
}
private void OnDestroy()
{
// ForceSeatMI - BEGIN
m_Api.End();
// ForceSeatMI - END
}
private void FixedUpdate()
{
...
// ForceSeatMI - BEGIN
m_Api.Tick(m_Rigidbody, Time.deltaTime, false);
// ForceSeatMI - END
}