- Créez un projet Unity 3D
- Dans le répertoire Assets de votre projet, créez le répertoire ForceSeatMI
- Copiez les fichiers suivants dans le répertoire ForceSeatMI (pour référence, vous pouvez consulter n’importe lequel de nos exemples Unity 3D)
- ForceSeatMI.cs
- ForceSeatMI_Common.cs
- ForceSeatMI_Positioning.cs
- ForceSeatMI_Status.cs
- ForceSeatMI_TactileTranscuders.cs
- ForceSeatMI_Telemetry.cs
- ForceSeatMi_UnityAeroplane.cs
- ForceSeatMi_UnityVehicle.cs
| L’API ForceSeatMI utilise une DLL qui est installée dans le cadre du logiciel ForceSeatPM. Assurez-vous que ForceSeatPM est installé sur votre ordinateur. |
Application : contrôle de position
Exemples :
- TableLogPos_Unity montre le positionnement en unités abstraites (logiques, pourcentages)
- TablePhyPos_Unity montre le positionnement en unités du monde réel (cinématique inverse)
Pour les deux exemples, utilisez le profil ForceSeatPM intégré
SDK – Positioning.
L’application de positionnement nécessite l’utilisation de l’API ForceSeatMI brute. La routine d’opération typique se compose des étapes suivantes :
- Importez ForceSeatMI
- Créez une variable d’objet API dans votre classe :
private ForceSeatMI m_fsmi;
- Initialisez-la dans la méthode Start :
m_fsmi = new ForceSeatMI();
- Si tout est chargé, appelez :
if (m_fsmi.IsLoaded())
{
m_fsmi.BeginMotionControl();
}
- Le SIM doit envoyer les données de positionnement à intervalles constants en utilisant l’une des fonctions suivantes :
m_fsmi.SendTopTablePosLog(...);
m_fsmi.SendTopTablePosPhy(...);
m_fsmi.SendTopTableMatrixPhy(...);
- À la fin de la simulation, appelez :
if (m_fsmi.IsLoaded())
{
m_fsmi.EndMotionControl();
m_fsmi.Dispose();
}
Code
Le code ci-dessous provient de l’exemple
TableLogPos_Unity.
// API FSMI
private ForceSeatMI m_fsmi;
// Position en coordonnées logiques qui sera envoyée à la plateforme
private FSMI_TopTablePositionLogical m_platformPosition = new FSMI_TopTablePositionLogical();
void Start ()
{
// Charge la bibliothèque ForceSeatMI depuis le répertoire d'installation de ForceSeatPM
// ForceSeatMI - DÉBUT
m_fsmi = new ForceSeatMI();
if (m_fsmi.IsLoaded())
{
// Trouve les composants de la plateforme
m_shaft = GameObject.Find("Shaft");
m_board = GameObject.Find("Board");
SaveOriginPosition();
SaveOriginRotation();
// Prépare la structure de données en la nettoyant et en définissant la taille correcte
m_platformPosition.mask = 0;
m_platformPosition.structSize = (byte)Marshal.SizeOf(m_platformPosition);
m_platformPosition.state = FSMI_State.NO_PAUSE;
// Définit les champs qui peuvent être modifiés par l'application de démonstration
m_platformPosition.mask = FSMI_POS_BIT.STATE | FSMI_POS_BIT.POSITION;
m_fsmi.BeginMotionControl();
SendDataToPlatform();
// ForceSeatMI - FIN
}
else
{
Debug.LogError("La bibliothèque ForceSeatMI n'a pas été trouvée ! Veuillez installer ForceSeatPM.");
}
}
void OnDestroy()
{
// ForceSeatMI - DÉBUT
if (m_fsmi.IsLoaded())
{
m_fsmi.EndMotionControl();
m_fsmi.Dispose();
}
// ForceSeatMI - FIN
}
private void SendDataToPlatform()
{
// Convertit les paramètres en unités logiques
// ForceSeatMI - DÉBUT
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);
// Envoie les données à la plateforme
m_fsmi.SendTopTablePosLog(ref m_platformPosition);
// ForceSeatMI - FIN
}
Application : simulation de véhicule
Exemples : Telemetry_Veh_Unity (utilisez le profil ForceSeatPM intégré
SDK – Vehicle Telemetry)
Pour l’application de simulation de véhicule, l’interface d’aide ForceSeatMI_UnityVehicle peut être utilisée. La routine d’opération typique se compose des étapes suivantes :
- Créez une variable d’objet API dans votre classe :
private ForceSeatMI_UnityVehicle m_Api;
- Initialisez-la dans la méthode Start :
m_Api = new ForceSeatMI_UnityVehicle();
- Appelez :
- Le SIM doit envoyer les données de télémétrie à intervalles constants en utilisant la fonction suivante :
- À la fin de la simulation, appelez :
Code
Le code ci-dessous provient de l’exemple
Telemetry_Veh_Unity.
private void Start()
{
m_Rigidbody = GetComponent();
// ForceSeatMI - DÉBUT
m_Api = new ForceSeatMI_UnityVehicle();
m_Api.Begin();
// ForceSeatMI - FIN
}
private void OnDestroy()
{
// ForceSeatMI - DÉBUT
m_Api.End();
// ForceSeatMI - FIN
}
private void Move(float steering, float accel, float footbrake, float handbrake)
{
...
// ForceSeatMI - DÉBUT
m_Api.Tick(m_Rigidbody, Time.deltaTime, false, 0, 0, m_CurrentGearNumber);
// ForceSeatMI - FIN
}
Application : simulation de vol
Exemples : Telemetry_Fly_Unity (utilisez le profil ForceSeatPM intégré
SDK – Plane Telemetry)
Pour l’application de simulation de vol, l’interface d’aide ForceSeatMi_UnityAeroplane peut être utilisée. La routine d’opération typique se compose des étapes suivantes :
- Créez une variable d’objet API dans votre classe :
private ForceSeatMi_UnityAeroplane m_Api;
- Initialisez-la dans la méthode Start :
m_Api = new ForceSeatMi_UnityAeroplane();
- Appelez :
- Le SIM doit envoyer les données de télémétrie à intervalles constants en utilisant la fonction suivante :
- À la fin de la simulation, appelez :
Code
Le code ci-dessous provient de l’exemple
Telemetry_Fly_Unity.
private void Start()
{
m_Rigidbody = GetComponent();
m_OriginalDrag = m_Rigidbody.drag;
m_OriginalAngularDrag = m_Rigidbody.angularDrag;
// ForceSeatMI - DÉBUT
m_Api = new ForceSeatMi_UnityAeroplane();
m_Api.Begin();
// ForceSeatMI - FIN
}
private void OnDestroy()
{
// ForceSeatMI - DÉBUT
m_Api.End();
// ForceSeatMI - FIN
}
private void FixedUpdate()
{
...
// ForceSeatMI - DÉBUT
m_Api.Tick(m_Rigidbody, Time.deltaTime, false);
// ForceSeatMI - FIN
}