- Crea un progetto Unity 3D
- All’interno della directory Assets del tuo progetto, crea la directory ForceSeatMI
- Copia i seguenti file nella directory ForceSeatMI (come riferimento puoi consultare uno qualsiasi dei nostri esempi 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 utilizza una DLL che viene installata come parte del software ForceSeatPM. Assicurati di avere ForceSeatPM installato sul tuo computer. |
Applicazione: controllo della posizione
Esempi:
- TableLogPos_Unity mostra il posizionamento in unità astratte (logiche, percentuali)
- TablePhyPos_Unity mostra il posizionamento in unità del mondo reale (Cinematica Inversa)
Per entrambi gli esempi, utilizza il profilo integrato di ForceSeatPM
SDK – Positioning.
L’applicazione di posizionamento richiede l’uso dell’API ForceSeatMI grezza. La routine operativa tipica consiste nei seguenti passaggi:
- Importa ForceSeatMI
- Crea una variabile oggetto API all’interno della tua classe:
private ForceSeatMI m_fsmi;
- Inizializzala nel metodo Start:
m_fsmi = new ForceSeatMI();
- Se tutto è caricato, chiama:
if (m_fsmi.IsLoaded())
{
m_fsmi.BeginMotionControl();
}
- Il simulatore dovrebbe inviare i dati di posizionamento a intervalli costanti utilizzando una delle seguenti funzioni:
m_fsmi.SendTopTablePosLog(...);
m_fsmi.SendTopTablePosPhy(...);
m_fsmi.SendTopTableMatrixPhy(...);
- Al termine della simulazione, chiama:
if (m_fsmi.IsLoaded())
{
m_fsmi.EndMotionControl();
m_fsmi.Dispose();
}
Codice
Il codice seguente proviene dall’esempio
TableLogPos_Unity.
// API FSMI
private ForceSeatMI m_fsmi;
// Posizione in coordinate logiche che verrà inviata alla piattaforma
private FSMI_TopTablePositionLogical m_platformPosition = new FSMI_TopTablePositionLogical();
void Start ()
{
// Carica la libreria ForceSeatMI dalla directory di installazione di ForceSeatPM
// ForceSeatMI - INIZIO
m_fsmi = new ForceSeatMI();
if (m_fsmi.IsLoaded())
{
// Trova i componenti della piattaforma
m_shaft = GameObject.Find("Shaft");
m_board = GameObject.Find("Board");
SaveOriginPosition();
SaveOriginRotation();
// Prepara la struttura dati svuotandola e impostando la dimensione corretta
m_platformPosition.mask = 0;
m_platformPosition.structSize = (byte)Marshal.SizeOf(m_platformPosition);
m_platformPosition.state = FSMI_State.NO_PAUSE;
// Imposta i campi che possono essere modificati dall'applicazione demo
m_platformPosition.mask = FSMI_POS_BIT.STATE | FSMI_POS_BIT.POSITION;
m_fsmi.BeginMotionControl();
SendDataToPlatform();
// ForceSeatMI - FINE
}
else
{
Debug.LogError("Libreria ForceSeatMI non trovata! Installa ForceSeatPM.");
}
}
void OnDestroy()
{
// ForceSeatMI - INIZIO
if (m_fsmi.IsLoaded())
{
m_fsmi.EndMotionControl();
m_fsmi.Dispose();
}
// ForceSeatMI - FINE
}
private void SendDataToPlatform()
{
// Converti i parametri in unità logiche
// ForceSeatMI - INIZIO
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);
// Invia i dati alla piattaforma
m_fsmi.SendTopTablePosLog(ref m_platformPosition);
// ForceSeatMI - FINE
}
Applicazione: simulazione di veicoli
Esempi: Telemetry_Veh_Unity (utilizza il profilo integrato di ForceSeatPM
SDK – Vehicle Telemetry)
Per l’applicazione di simulazione di veicoli è possibile utilizzare l’interfaccia helper ForceSeatMI_UnityVehicle. La routine operativa tipica consiste nei seguenti passaggi:
- Crea una variabile oggetto API all’interno della tua classe:
private ForceSeatMI_UnityVehicle m_Api;
- Inizializzala nel metodo Start:
m_Api = new ForceSeatMI_UnityVehicle();
- Chiama:
- Il simulatore dovrebbe inviare i dati di telemetria a intervalli costanti utilizzando la seguente funzione:
- Al termine della simulazione, chiama:
Codice
Il codice seguente proviene dall’esempio
Telemetry_Veh_Unity.
private void Start()
{
m_Rigidbody = GetComponent();
// ForceSeatMI - INIZIO
m_Api = new ForceSeatMI_UnityVehicle();
m_Api.Begin();
// ForceSeatMI - FINE
}
private void OnDestroy()
{
// ForceSeatMI - INIZIO
m_Api.End();
// ForceSeatMI - FINE
}
private void Move(float steering, float accel, float footbrake, float handbrake)
{
...
// ForceSeatMI - INIZIO
m_Api.Tick(m_Rigidbody, Time.deltaTime, false, 0, 0, m_CurrentGearNumber);
// ForceSeatMI - FINE
}
Applicazione: simulazione di volo
Esempi: Telemetry_Fly_Unity (utilizza il profilo integrato di ForceSeatPM
SDK – Plane Telemetry)
Per l’applicazione di simulazione di volo è possibile utilizzare l’interfaccia helper ForceSeatMi_UnityAeroplane. La routine operativa tipica consiste nei seguenti passaggi:
- Crea una variabile oggetto API all’interno della tua classe:
private ForceSeatMi_UnityAeroplane m_Api;
- Inizializzala nel metodo Start:
m_Api = new ForceSeatMi_UnityAeroplane();
- Chiama:
- Il simulatore dovrebbe inviare i dati di telemetria a intervalli costanti utilizzando la seguente funzione:
- Al termine della simulazione, chiama:
Codice
Il codice seguente proviene dall’esempio
Telemetry_Fly_Unity.
private void Start()
{
m_Rigidbody = GetComponent();
m_OriginalDrag = m_Rigidbody.drag;
m_OriginalAngularDrag = m_Rigidbody.angularDrag;
// ForceSeatMI - INIZIO
m_Api = new ForceSeatMI_UnityAeroplane();
m_Api.Begin();
// ForceSeatMI - FINE
}
private void OnDestroy()
{
// ForceSeatMI - INIZIO
m_Api.End();
// ForceSeatMI - FINE
}
private void FixedUpdate()
{
...
// ForceSeatMI - INIZIO
m_Api.Tick(m_Rigidbody, Time.deltaTime, false);
// ForceSeatMI - FINE
}