- Crea un proyecto de Unity 3D
- Dentro del directorio Assets de tu proyecto, crea el directorio ForceSeatMI
- Copia los siguientes archivos en el directorio ForceSeatMI (puedes consultar cualquiera de nuestros ejemplos de Unity 3D como referencia)
- ForceSeatMI.cs
- ForceSeatMI_Common.cs
- ForceSeatMI_Positioning.cs
- ForceSeatMI_Status.cs
- ForceSeatMI_TactileTranscuders.cs
- ForceSeatMI_Telemetry.cs
- ForceSeatMi_UnityAeroplane.cs
- ForceSeatMi_UnityVehicle.cs
| La API de ForceSeatMI utiliza una DLL que se instala como parte del software ForceSeatPM. Asegúrate de tener ForceSeatPM instalado en tu ordenador. |
Aplicación: control de posición
Ejemplos:
- TableLogPos_Unity muestra el posicionamiento en unidades abstractas (lógicas, porcentajes)
- TablePhyPos_Unity muestra el posicionamiento en unidades del mundo real (cinemática inversa)
Para ambos ejemplos, utiliza el perfil integrado de ForceSeatPM
SDK – Positioning.
La aplicación de posicionamiento requiere el uso de la API nativa de ForceSeatMI. La rutina de operación típica consta de los siguientes pasos:
- Importar ForceSeatMI
- Crea una variable de objeto de la API dentro de tu clase:
private ForceSeatMI m_fsmi;
- Inicialízala en el método Start:
m_fsmi = new ForceSeatMI();
- Si todo se ha cargado, llama a:
if (m_fsmi.IsLoaded())
{
m_fsmi.BeginMotionControl();
}
- El simulador debe enviar datos de posicionamiento en intervalos constantes utilizando una de las siguientes funciones:
m_fsmi.SendTopTablePosLog(...);
m_fsmi.SendTopTablePosPhy(...);
m_fsmi.SendTopTableMatrixPhy(...);
- Al final de la simulación, llama a:
if (m_fsmi.IsLoaded())
{
m_fsmi.EndMotionControl();
m_fsmi.Dispose();
}
Código
El siguiente código proviene del ejemplo
TableLogPos_Unity.
// API de FSMI
private ForceSeatMI m_fsmi;
// Posición en coordenadas lógicas que se enviará a la plataforma
private FSMI_TopTablePositionLogical m_platformPosition = new FSMI_TopTablePositionLogical();
void Start ()
{
// Carga la biblioteca ForceSeatMI desde el directorio de instalación de ForceSeatPM
// ForceSeatMI - INICIO
m_fsmi = new ForceSeatMI();
if (m_fsmi.IsLoaded())
{
// Encuentra los componentes de la plataforma
m_shaft = GameObject.Find("Shaft");
m_board = GameObject.Find("Board");
SaveOriginPosition();
SaveOriginRotation();
// Prepara la estructura de datos limpiándola y estableciendo el tamaño correcto
m_platformPosition.mask = 0;
m_platformPosition.structSize = (byte)Marshal.SizeOf(m_platformPosition);
m_platformPosition.state = FSMI_State.NO_PAUSE;
// Establece los campos que pueden ser modificados por la aplicación de demostración
m_platformPosition.mask = FSMI_POS_BIT.STATE | FSMI_POS_BIT.POSITION;
m_fsmi.BeginMotionControl();
SendDataToPlatform();
// ForceSeatMI - FIN
}
else
{
Debug.LogError("¡No se ha encontrado la biblioteca ForceSeatMI! Por favor, instala ForceSeatPM.");
}
}
void OnDestroy()
{
// ForceSeatMI - INICIO
if (m_fsmi.IsLoaded())
{
m_fsmi.EndMotionControl();
m_fsmi.Dispose();
}
// ForceSeatMI - FIN
}
private void SendDataToPlatform()
{
// Convierte los parámetros a unidades lógicas
// ForceSeatMI - INICIO
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);
// Envía los datos a la plataforma
m_fsmi.SendTopTablePosLog(ref m_platformPosition);
// ForceSeatMI - FIN
}
Aplicación: simulación de vehículos
Ejemplos: Telemetry_Veh_Unity (utiliza el perfil integrado de ForceSeatPM
SDK – Vehicle Telemetry)
Para aplicaciones de simulación de vehículos, se puede utilizar la interfaz auxiliar ForceSeatMI_UnityVehicle. La rutina de operación típica consta de los siguientes pasos:
- Crea una variable de objeto de la API dentro de tu clase:
private ForceSeatMI_UnityVehicle m_Api;
- Inicialízala en el método Start:
m_Api = new ForceSeatMI_UnityVehicle();
- Llama a:
- El simulador debe enviar datos de telemetría en intervalos constantes utilizando la siguiente función:
- Al final de la simulación, llama a:
Código
El siguiente código proviene del ejemplo
Telemetry_Veh_Unity.
private void Start()
{
m_Rigidbody = GetComponent();
// ForceSeatMI - INICIO
m_Api = new ForceSeatMI_UnityVehicle();
m_Api.Begin();
// ForceSeatMI - FIN
}
private void OnDestroy()
{
// ForceSeatMI - INICIO
m_Api.End();
// ForceSeatMI - FIN
}
private void Move(float steering, float accel, float footbrake, float handbrake)
{
...
// ForceSeatMI - INICIO
m_Api.Tick(m_Rigidbody, Time.deltaTime, false, 0, 0, m_CurrentGearNumber);
// ForceSeatMI - FIN
}
Aplicación: simulación de vuelo
Ejemplos: Telemetry_Fly_Unity (utiliza el perfil integrado de ForceSeatPM
SDK – Plane Telemetry)
Para aplicaciones de simulación de vuelo, se puede utilizar la interfaz auxiliar ForceSeatMi_UnityAeroplane. La rutina de operación típica consta de los siguientes pasos:
- Crea una variable de objeto de la API dentro de tu clase:
private ForceSeatMi_UnityAeroplane m_Api;
- Inicialízala en el método Start:
m_Api = new ForceSeatMi_UnityAeroplane();
- Llama a:
- El simulador debe enviar datos de telemetría en intervalos constantes utilizando la siguiente función:
- Al final de la simulación, llama a:
Código
El siguiente código proviene del ejemplo
Telemetry_Fly_Unity.
private void Start()
{
m_Rigidbody = GetComponent();
m_OriginalDrag = m_Rigidbody.drag;
m_OriginalAngularDrag = m_Rigidbody.angularDrag;
// ForceSeatMI - INICIO
m_Api = new ForceSeatMI_UnityAeroplane();
m_Api.Begin();
// ForceSeatMI - FIN
}
private void OnDestroy()
{
// ForceSeatMI - INICIO
m_Api.End();
// ForceSeatMI - FIN
}
private void FixedUpdate()
{
...
// ForceSeatMI - INICIO
m_Api.Tick(m_Rigidbody, Time.deltaTime, false);
// ForceSeatMI - FIN
}