- Erstelle ein Unity 3D-Projekt
- Erstelle im Assets-Verzeichnis deines Projekts ein ForceSeatMI-Verzeichnis
- Kopiere die folgenden Dateien in das ForceSeatMI-Verzeichnis (als Referenz kannst du dir unsere Unity 3D-Beispiele ansehen)
- ForceSeatMI.cs
- ForceSeatMI_Common.cs
- ForceSeatMI_Positioning.cs
- ForceSeatMI_Status.cs
- ForceSeatMI_TactileTranscuders.cs
- ForceSeatMI_Telemetry.cs
- ForceSeatMi_UnityAeroplane.cs
- ForceSeatMi_UnityVehicle.cs
| Die ForceSeatMI API verwendet DLLs, die als Teil der ForceSeatPM-Software installiert werden. Stelle sicher, dass du ForceSeatPM auf deinem Computer installiert hast. |
Anwendung: Positionssteuerung
Beispiele:
- TableLogPos_Unity zeigt die Positionierung in abstrakten (logischen, prozentualen) Einheiten
- TablePhyPos_Unity zeigt die Positionierung in realen Einheiten (Inverse Kinematik)
Verwende für beide Beispiele das integrierte ForceSeatPM-Profil
SDK – Positioning.
Die Positionierungsanwendung erfordert die Verwendung der rohen ForceSeatMI API. Die typische Vorgehensweise besteht aus den folgenden Schritten:
- ForceSeatMI importieren
- Erstelle eine API-Objektvariable in deiner Klasse:
private ForceSeatMI m_fsmi;
- Initialisiere es in der Start-Methode:
m_fsmi = new ForceSeatMI();
- Wenn alles geladen ist, rufe auf:
if (m_fsmi.IsLoaded())
{
m_fsmi.BeginMotionControl();
}
- Der SIM sollte Positionsdaten in konstanten Intervallen mit einer der folgenden Funktionen senden:
m_fsmi.SendTopTablePosLog(...);
m_fsmi.SendTopTablePosPhy(...);
m_fsmi.SendTopTableMatrixPhy(...);
- Am Ende der Simulation aufrufen:
if (m_fsmi.IsLoaded())
{
m_fsmi.EndMotionControl();
m_fsmi.Dispose();
}
Code
Der folgende Code stammt aus dem Beispiel
TableLogPos_Unity.
// FSMI api
private ForceSeatMI m_fsmi;
// Position in logischen Koordinaten, die an die Plattform gesendet werden
private FSMI_TopTablePositionLogical m_platformPosition = new FSMI_TopTablePositionLogical();
void Start ()
{
// Lade die ForceSeatMI-Bibliothek aus dem Installationsverzeichnis von ForceSeatPM
// ForceSeatMI - BEGIN
m_fsmi = new ForceSeatMI();
if (m_fsmi.IsLoaded())
{
// Finde die Komponenten der Plattform
m_shaft = GameObject.Find("Shaft");
m_board = GameObject.Find("Board");
SaveOriginPosition();
SaveOriginRotation();
// Bereite die Datenstruktur vor, indem du sie löschst und die korrekte Größe festlegst
m_platformPosition.mask = 0;
m_platformPosition.structSize = (byte)Marshal.SizeOf(m_platformPosition);
m_platformPosition.state = FSMI_State.NO_PAUSE;
// Setze Felder, die von der Demo-Anwendung geändert werden können
m_platformPosition.mask = FSMI_POS_BIT.STATE | FSMI_POS_BIT.POSITION;
m_fsmi.BeginMotionControl();
SendDataToPlatform();
// ForceSeatMI - END
}
else
{
Debug.LogError("ForceSeatMI-Bibliothek wurde nicht gefunden! Bitte installiere ForceSeatPM.");
}
}
void OnDestroy()
{
// ForceSeatMI - BEGIN
if (m_fsmi.IsLoaded())
{
m_fsmi.EndMotionControl();
m_fsmi.Dispose();
}
// ForceSeatMI - END
}
private void SendDataToPlatform()
{
// Konvertiere Parameter in logische Einheiten
// 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);
// Sende Daten an die Plattform
m_fsmi.SendTopTablePosLog(ref m_platformPosition);
// ForceSeatMI - END
}
Anwendung: Fahrzeugsimulation
Beispiele: Telemetry_Veh_Unity (verwende das integrierte ForceSeatPM-Profil
SDK – Vehicle Telemetry)
Für die Fahrzeugsimulationsanwendung kann die Hilfsschnittstelle ForceSeatMI_UnityVehicle verwendet werden. Die typische Vorgehensweise besteht aus den folgenden Schritten:
- Erstelle eine API-Objektvariable in deiner Klasse:
private ForceSeatMI_UnityVehicle m_Api;
- Initialisiere es in der Start-Methode:
m_Api = new ForceSeatMI_UnityVehicle();
- Aufrufen:
- Der SIM sollte Telemetriedaten in konstanten Intervallen mit der folgenden Funktion senden:
- Am Ende der Simulation aufrufen:
Code
Der folgende Code stammt aus dem Beispiel
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
}
Anwendung: Flugsimulation
Beispiele: Telemetry_Fly_Unity (verwende das integrierte ForceSeatPM-Profil
SDK – Plane Telemetry)
Für die Flugsimulationsanwendung kann die Hilfsschnittstelle ForceSeatMi_UnityAeroplane verwendet werden. Die typische Vorgehensweise besteht aus den folgenden Schritten:
- Erstelle eine API-Objektvariable in deiner Klasse:
private ForceSeatMi_UnityAeroplane m_Api;
- Initialisiere es in der Start-Methode:
m_Api = new ForceSeatMi_UnityAeroplane();
- Aufrufen:
- Der SIM sollte Telemetriedaten in konstanten Intervallen mit der folgenden Funktion senden:
- Am Ende der Simulation aufrufen:
Code
Der folgende Code stammt aus dem Beispiel
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
}