Die in diesem Dokument und im Plugin vorgestellten Beispiele wurden in Unreal Engine 4.14, 4.15, 4.18 und 4.20+ erstellt. Sie funktionieren möglicherweise nicht korrekt mit anderen Versionen der Unreal Engine.

Plugin-Integration

Bitte befolge die folgenden Schritte, um das ForceSeatMI-Plugin in dein Projekt einzubinden.
  1. Erstelle ein C++ Unreal Engine-Projekt
  2. Erstelle im Stammverzeichnis deines Projekts ein Verzeichnis namens Plugins
  3. Kopiere den ForceSeatMI-Plugin-Ordner in das Plugins-Verzeichnis
  4. Starte den Unreal Engine-Editor
  5. Füge die ForceSeatMI-Plugin-Abhängigkeit zu deinem Projekt in YourProject.Build.cs hinzu
    PublicDependencyModuleNames.AddRange(new string[] { "Core",  "CoreUObject",  "Engine",  "InputCore",  "ForceSeatMI" });
  6. UE 4.15+ Nutzer: ForceSeatMI_VehicleTelemetry erfordert PhysXVehicles, stelle also sicher, dass dieses Modul deinem Projekt hinzugefügt wurde
  7. Sobald alles erstellt und kompiliert ist, kannst du ForceSeatMI in deiner Anwendung nutzen!
Das ForceSeatMI-Plugin verwendet eine DLL, die als Teil der ForceSeatPM-Software installiert wird. Stelle sicher, dass ForceSeatPM auf deinem Computer installiert ist.

Anwendung: Positionierung der oberen Plattform

Beispiele:
  • TableLogPos_Unreal zeigt die Positionierung in abstrakten (logischen, prozentualen) Einheiten
  • TablePhyPos_Unreal 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. Der typische Ablauf besteht aus folgenden Schritten:
  1. Erstelle eine Pointer-Membervariable in deiner Klasse, die auf eine Instanz von IForceSeatMI_API zeigt:
    IForceSeatMI_API*  m_api;
  2. Initialisiere sie im Klassenkonstruktor:
    m_api(&IForceSeatMI::Get().GetAPI())
  3. Wenn die Simulation startet, rufe Folgendes auf (z. B. in der BeginPlay()-Methode deiner APawn-Implementierung):
    m_api->BeginMotionControl();
  4. Die Simulation sollte Positionierungsdaten in konstanten Intervallen mit einer der folgenden Funktionen senden:
    m_api->SendTopTablePosLog(...);
    m_api->SendTopTablePosPhy(...);
    m_api->SendTopTableMatrixPhy(...);
  5. Am Ende der Simulation rufe Folgendes auf:
    m_api->EndMotionControl();
Unreal Editor Pos

Code

Der folgende Code stammt aus dem Beispiel TableLogPos_Unreal.
ATableLogPos_UnrealPawn::ATableLogPos_UnrealPawn()
  :  CurrentDrawingHeave(0)
  , CurrentDrawingPitch(0)
  , CurrentDrawingRoll(0)
{
  // ... generierter UE4-Code zur besseren Übersichtlichkeit entfernt
 
  // ForceSeatMI - BEGIN
  memset(&PlatformPosition,  0,  sizeof(PlatformPosition));
  PlatformPosition.structSize = sizeof(PlatformPosition);
 
  // Das Demoprogramm kann Pause, Position und Geschwindigkeitsbegrenzung bereitstellen
  PlatformPosition.maxSpeed =  PLATFORM_MAX_SPEED;
  PlatformPosition.mask     =  FSMI_POS_BIT_STATE  |  FSMI_POS_BIT_POSITION  |  FSMI_POS_BIT_MAX_SPEED;
  // ForceSeatMI - END
}
 
void  ATableLogPos_UnrealPawn::Tick(float  DeltaTime)
{
  Super::Tick(DeltaTime);
 
  // ... generierter UE4-Code zur besseren Übersichtlichkeit entfernt
 
  // ForceSeatMI - BEGIN
  SendCoordinatesToPlatform();
  // ForceSeatMI - END
}
 
void  ATableLogPos_UnrealPawn::BeginPlay()
{
  Super::BeginPlay();
 
  // ForceSeatMI - BEGIN
  if (FSMI_True  ==  IForceSeatMI::Get().GetAPI().BeginMotionControl())
  {
  SendCoordinatesToPlatform();
  }
  // ForceSeatMI - END
 
  // ... generierter UE4-Code zur besseren Übersichtlichkeit entfernt
}
 
void  ATableLogPos_UnrealPawn::EndPlay(const  EEndPlayReason::Type  EndPlayReason)
{
  Super::EndPlay(EndPlayReason);
 
  // ForceSeatMI - BEGIN
  IForceSeatMI::Get().GetAPI().EndMotionControl();
  // ForceSeatMI - END
}
 
void  ATableLogPos_UnrealPawn::SendCoordinatesToPlatform()
{
  // ForceSeatMI - BEGIN
  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 - END
}

Anwendung: Fahrzeugsimulation

Beispiele: Telemetry_Veh_Unreal (verwende das integrierte ForceSeatPM-Profil SDK – Vehicle Telemetry) Für Fahrzeugsimulationsanwendungen kann das Hilfs-Interface IForceSeatMI_VehicleTelemetry verwendet werden. IForceSeatMI_VehicleTelemetry erfordert PhysXVehicles und extrahiert automatisch alle notwendigen Daten aus APawn- und UWheeledVehicleMovementComponent-Objekten. Der typische Ablauf besteht aus folgenden Schritten:
  1. Erstelle eine Pointer-Membervariable in deiner Klasse, die auf eine Instanz von IForceSeatMI_VehicleTelemetry zeigt:
    IForceSeatMI_VehicleTelemetry*  m_veh;
  2. Initialisiere sie im Klassenkonstruktor:
    m_veh(&IForceSeatMI::Get().GetVehicleTelemetry())
  3. Wenn die Simulation startet, rufe Folgendes auf (z. B. in der BeginPlay()-Methode deiner APawn-Implementierung):
    m_veh->Begin();();
  4. Die Simulation sollte Telemetriedaten in konstanten Intervallen mit der folgenden Funktion senden:
    m_veh->Tick(...);
  5. Am Ende der Simulation rufe Folgendes auf:
    m_veh->End();
Unreal Editor Veh

Code

Der folgende Code stammt aus dem Beispiel Telemetry_Veh_Unreal.
void  ATelemetry_Veh_UnrealPawn::Tick(float  Delta)
{
  Super::Tick(Delta);
 
  // ... generierter UE4-Code zur besseren Übersichtlichkeit entfernt
 
  // ForceSeatMI - BEGIN
  IForceSeatMI::Get().GetVehicleTelemetry().Tick(*this,  *GetVehicleMovement(), Delta,  false/* keine Pause */);
  // ForceSeatMI - END
}
 
void  ATelemetry_Veh_UnrealPawn::BeginPlay()
{
  Super::BeginPlay();
 
  // ForceSeatMI - BEGIN
  IForceSeatMI::Get().GetVehicleTelemetry().Begin();
  // ForceSeatMI - END
}

Anwendung: Flugsimulation

Beispiele: Telemetry_Fly_Unreal (verwende das integrierte ForceSeatPM-Profil SDK – Plane Telemetry) Für Flugsimulationen kann die rohe IForceSeatMI_API oder das Hilfs-Interface IForceSeatMI_PlaneTelemetry verwendet werden. IForceSeatMI_PlaneTelemetry extrahiert automatisch alle notwendigen Daten aus dem APawn-Objekt und berechnet dann fehlende Informationen wie Beschleunigungen. Der typische Ablauf besteht aus folgenden Schritten:
  1. Erstelle eine Pointer-Membervariable in deiner Klasse, die auf eine Instanz von IForceSeatMI_PlaneTelemetry zeigt:
    IForceSeatMI_PlaneTelemetry*  m_fly;
  2. Initialisiere sie im Klassenkonstruktor:
    m_fly(&IForceSeatMI::Get().GetPlaneTelemetry())
  3. Wenn die Simulation startet, rufe Folgendes auf (z. B. in der BeginPlay()-Methode deiner APawn-Implementierung):
    m_fly->Begin();();
  4. Die Simulation sollte Telemetriedaten in konstanten Intervallen mit der folgenden Funktion senden:
    m_fly->Tick(...);
  5. Am Ende der Simulation rufe Folgendes auf:
    m_fly->End();
Unreal Editor Fly

Code

Der folgende Code stammt aus dem Beispiel Telemetry_Fly_Unreal.
void  ATelemetry_Fly_UnrealPawn::Tick(float  DeltaSeconds)
{
  // ... generierter UE4-Code zur besseren Übersichtlichkeit entfernt
 
  /  Rufe eine beliebige Tick-Implementierung der  Klasse  der Eltern auf
  Super::Tick(DeltaSeconds);
 
  // ForceSeatMI - BEGIN
  IForceSeatMI::Get().GetPlaneTelemetry().Tick(*this, DeltaSeconds,  false/* keine Pause */);
  // ForceSeatMI - END
}
 
void  ATelemetry_Fly_UnrealPawn::BeginPlay()
{
  Super::BeginPlay();
 
  // ForceSeatMI - BEGIN
  IForceSeatMI::Get().GetPlaneTelemetry().Begin();
  // ForceSeatMI - END
}
Sign up to our newsletter
Always be the first to know about new products, updates and company news
  • Dieses Feld dient zur Validierung und sollte nicht verändert werden.