Los ejemplos presentados en este documento y el plugin se han creado en Unreal Engine 4.14, 4.15, 4.18 y 4.20+. Puede que no funcionen correctamente con versiones diferentes de Unreal Engine.

Integración del plugin

Sigue los pasos a continuación para incluir el plugin ForceSeatMI en tu proyecto.
  1. Crea un proyecto de Unreal Engine en C++
  2. Dentro del directorio raíz de tu proyecto, crea el directorio Plugins
  3. Copia la carpeta del plugin ForceSeatMI en el directorio Plugins
  4. Inicia el editor de Unreal Engine
  5. Añade la dependencia del plugin ForceSeatMI a tu proyecto dentro de TuProyecto.Build.cs
    PublicDependencyModuleNames.AddRange(new string[] { "Core",  "CoreUObject",  "Engine",  "InputCore",  "ForceSeatMI" });
  6. Usuarios de UE 4.15+: ForceSeatMI_VehicleTelemetry requiere PhysXVehicles, así que asegúrate de que este módulo esté añadido a tu proyecto
  7. Una vez que todo esté compilado, ¡puedes empezar a usar ForceSeatMI en tu aplicación!
El plugin ForceSeatMI utiliza una DLL que se instala como parte del software ForceSeatPM. Asegúrate de tener ForceSeatPM instalado en tu ordenador.

Aplicación: posicionamiento de la mesa superior

Ejemplos:
  • TableLogPos_Unreal muestra el posicionamiento en unidades abstractas (lógicas, porcentajes)
  • TablePhyPos_Unreal 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 sin procesar de ForceSeatMI. La rutina de operación típica consta de los siguientes pasos:
  1. Crea una variable miembro de puntero dentro de tu clase que apunte a una instancia de IForceSeatMI_API:
    IForceSeatMI_API*  m_api;
  2. Inicialízala en el constructor de la clase:
    m_api(&IForceSeatMI::Get().GetAPI())
  3. Cuando la simulación comience, llama (por ejemplo, en el método BeginPlay() de tu implementación de APawn):
    m_api->BeginMotionControl();
  4. El SIM debe enviar datos de posicionamiento a intervalos constantes utilizando una de las siguientes funciones:
    m_api->SendTopTablePosLog(...);
    m_api->SendTopTablePosPhy(...);
    m_api->SendTopTableMatrixPhy(...);
  5. Al final de la simulación, llama:
    m_api->EndMotionControl();
Unreal Editor Pos

Código

El código a continuación proviene del ejemplo TableLogPos_Unreal.
ATableLogPos_UnrealPawn::ATableLogPos_UnrealPawn()
  :  CurrentDrawingHeave(0)
  , CurrentDrawingPitch(0)
  , CurrentDrawingRoll(0)
{
  // ... código generado por UE4 eliminado para mayor claridad
 
  // ForceSeatMI - INICIO
  memset(&PlatformPosition,  0,  sizeof(PlatformPosition));
  PlatformPosition.structSize = sizeof(PlatformPosition);
 
  // El programa de demostración puede proporcionar pausa, posición y límite de velocidad
  PlatformPosition.maxSpeed =  PLATFORM_MAX_SPEED;
  PlatformPosition.mask     =  FSMI_POS_BIT_STATE  |  FSMI_POS_BIT_POSITION  |  FSMI_POS_BIT_MAX_SPEED;
  // ForceSeatMI - FIN
}
 
void  ATableLogPos_UnrealPawn::Tick(float  DeltaTime)
{
  Super::Tick(DeltaTime);
 
  // ... código generado por UE4 eliminado para mayor claridad
 
  // ForceSeatMI - INICIO
  SendCoordinatesToPlatform();
  // ForceSeatMI - FIN
}
 
void  ATableLogPos_UnrealPawn::BeginPlay()
{
  Super::BeginPlay();
 
  // ForceSeatMI - INICIO
  if (FSMI_True  ==  IForceSeatMI::Get().GetAPI().BeginMotionControl())
  {
  SendCoordinatesToPlatform();
  }
  // ForceSeatMI - FIN
 
  // ... código generado por UE4 eliminado para mayor claridad
}
 
void  ATableLogPos_UnrealPawn::EndPlay(const  EEndPlayReason::Type  EndPlayReason)
{
  Super::EndPlay(EndPlayReason);
 
  // ForceSeatMI - INICIO
  IForceSeatMI::Get().GetAPI().EndMotionControl();
  // ForceSeatMI - FIN
}
 
void  ATableLogPos_UnrealPawn::SendCoordinatesToPlatform()
{
  // ForceSeatMI - INICIO
  PlatformPosition.state =  FSMI_STATE_NO_PAUSE;
  PlatformPosition.roll = static_cast(FMath::Clamp(CurrentDrawingRoll  /  DRAWING_ROLL_MAX  *  PLATFORM_POSITION_LOGIC_MAX, PLATFORM_POSITION_LOGIC_MIN, PLATFORM_POSITION_LOGIC_MAX));
  PlatformPosition.pitch = static_cast(FMath::Clamp(CurrentDrawingPitch  /  DRAWING_PITCH_MAX  *  PLATFORM_POSITION_LOGIC_MAX, PLATFORM_POSITION_LOGIC_MIN, PLATFORM_POSITION_LOGIC_MAX));
  PlatformPosition.heave = static_cast(FMath::Clamp(CurrentDrawingHeave  /  DRAWING_HEAVE_MAX  *  PLATFORM_POSITION_LOGIC_MAX, PLATFORM_POSITION_LOGIC_MIN, PLATFORM_POSITION_LOGIC_MAX));
 
  IForceSeatMI::Get().GetAPI().SendTopTablePosLog(&PlatformPosition);
  // ForceSeatMI - FIN
}

Aplicación: simulación de vehículos

Ejemplos: Telemetry_Veh_Unreal (utiliza el perfil integrado de ForceSeatPM SDK – Vehicle Telemetry) Para la aplicación de simulación de vehículos se puede utilizar la interfaz auxiliar IForceSeatMI_VehicleTelemetry. IForceSeatMI_VehicleTelemetry requiere PhysXVehicles y extrae automáticamente todos los datos necesarios de los objetos APawn y UWheeledVehicleMovementComponent. La rutina de operación típica consta de los siguientes pasos:
  1. Crea una variable miembro de puntero dentro de tu clase que apunte a una instancia de IForceSeatMI_VehicleTelemetry:
    IForceSeatMI_VehicleTelemetry*  m_veh;
  2. Inicialízala en el constructor de la clase:
    m_veh(&IForceSeatMI::Get().GetVehicleTelemetry())
  3. Cuando la simulación comience, llama (por ejemplo, en el método BeginPlay() de tu implementación de APawn):
    m_veh->Begin();();
  4. El SIM debe enviar datos de telemetría a intervalos constantes utilizando la siguiente función:
    m_veh->Tick(...);
  5. Al final de la simulación, llama:
    m_veh->End();
Unreal Editor Veh

Código

El código a continuación proviene del ejemplo Telemetry_Veh_Unreal.
void  ATelemetry_Veh_UnrealPawn::Tick(float  Delta)
{
  Super::Tick(Delta);
 
  // ... código generado por UE4 eliminado para mayor claridad
 
  // ForceSeatMI - INICIO
  IForceSeatMI::Get().GetVehicleTelemetry().Tick(*this,  *GetVehicleMovement(), Delta,  false/* sin pausa */);
  // ForceSeatMI - FIN
}
 
void  ATelemetry_Veh_UnrealPawn::BeginPlay()
{
  Super::BeginPlay();
 
  // ForceSeatMI - INICIO
  IForceSeatMI::Get().GetVehicleTelemetry().Begin();
  // ForceSeatMI - FIN
}

Aplicación: simulación de vuelo

Ejemplos: Telemetry_Fly_Unreal (utiliza el perfil integrado de ForceSeatPM SDK – Plane Telemetry) Para la simulación de vuelo, se puede utilizar una API sin procesar IForceSeatMI_API o la interfaz auxiliar IForceSeatMI_PlaneTelemetry. IForceSeatMI_PlaneTelemetry extrae automáticamente todos los datos necesarios del objeto APawn y luego calcula la información que falta, como las aceleraciones. La rutina de operación típica consta de los siguientes pasos:
  1. Crea una variable miembro de puntero dentro de tu clase que apunte a una instancia de IForceSeatMI_PlaneTelemetry:
    IForceSeatMI_PlaneTelemetry*  m_fly;
  2. Inicialízala en el constructor de la clase:
    m_fly(&IForceSeatMI::Get().GetPlaneTelemetry())
  3. Cuando la simulación comience, llama (por ejemplo, en el método BeginPlay() de tu implementación de APawn):
    m_fly->Begin();();
  4. El SIM debe enviar datos de telemetría a intervalos constantes utilizando la siguiente función:
    m_fly->Tick(...);
  5. Al final de la simulación, llama:
    m_fly->End();
Unreal Editor Fly

Código

El código a continuación proviene del ejemplo Telemetry_Fly_Unreal.
void  ATelemetry_Fly_UnrealPawn::Tick(float  DeltaSeconds)
{
  // ... código generado por UE4 eliminado para mayor claridad
 
  /  Llama a cualquier implementación de Tick de la  clase  padre
  Super::Tick(DeltaSeconds);
 
  // ForceSeatMI - INICIO
  IForceSeatMI::Get().GetPlaneTelemetry().Tick(*this, DeltaSeconds,  false/* sin pausa */);
  // ForceSeatMI - FIN
}
 
void  ATelemetry_Fly_UnrealPawn::BeginPlay()
{
  Super::BeginPlay();
 
  // ForceSeatMI - INICIO
  IForceSeatMI::Get().GetPlaneTelemetry().Begin();
  // ForceSeatMI - FIN
}
Sign up to our newsletter
Always be the first to know about new products, updates and company news
  • Este campo es un campo de validación y debe quedar sin cambios.