Les exemples présentés dans ce document et le plugin ont été réalisés dans Unreal Engine 4.14, 4.15, 4.18 et 4.20+. Ils peuvent ne pas fonctionner correctement avec d’autres versions d’Unreal Engine.

Intégration du plugin

Suis les étapes ci-dessous pour inclure le plugin ForceSeatMI dans ton projet.
  1. Créer un projet Unreal Engine C++
  2. Dans le répertoire racine de ton projet, crée un répertoire Plugins
  3. Copie le dossier du plugin ForceSeatMI dans le répertoire Plugins
  4. Lance l’éditeur Unreal Engine
  5. Ajoute la dépendance du plugin ForceSeatMI à ton projet dans YourProject.Build.cs
    PublicDependencyModuleNames.AddRange(new string[] { "Core",  "CoreUObject",  "Engine",  "InputCore",  "ForceSeatMI" });
  6. Utilisateurs UE 4.15+ : ForceSeatMI_VehicleTelemetry nécessite PhysXVehicles, assure-toi donc que ce module est ajouté à ton projet
  7. Une fois que tout est compilé, tu peux commencer à utiliser ForceSeatMI dans ton application !
Le plugin ForceSeatMI utilise une DLL installée dans le cadre du logiciel ForceSeatPM. Assure-toi d’avoir ForceSeatPM installé sur ton ordinateur.

Application : positionnement de la plateforme supérieure

Exemples :
  • TableLogPos_Unreal montre le positionnement en unités abstraites (logiques, pourcentages)
  • TablePhyPos_Unreal montre le positionnement en unités réelles (cinématique inverse)
Pour les deux exemples, utilise 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 :
  1. Crée une variable membre pointeur dans ta classe qui pointera vers une instance de IForceSeatMI_API :
    IForceSeatMI_API*  m_api;
  2. Initialise-la dans le constructeur de la classe :
    m_api(&IForceSeatMI::Get().GetAPI())
  3. Lorsque la simulation démarre, appelle (par exemple dans la méthode BeginPlay() de ton implémentation APawn) :
    m_api->BeginMotionControl();
  4. Le SIM doit envoyer les données de positionnement à intervalles constants en utilisant l’une des fonctions suivantes :
    m_api->SendTopTablePosLog(...);
    m_api->SendTopTablePosPhy(...);
    m_api->SendTopTableMatrixPhy(...);
  5. À la fin de la simulation, appelle :
    m_api->EndMotionControl();
Éditeur Unreal Pos

Code

Le code ci-dessous provient de l’exemple TableLogPos_Unreal.
ATableLogPos_UnrealPawn::ATableLogPos_UnrealPawn()
  :  CurrentDrawingHeave(0)
  , CurrentDrawingPitch(0)
  , CurrentDrawingRoll(0)
{
  // ... code UE4 généré supprimé pour plus de clarté
 
  // ForceSeatMI - DÉBUT
  memset(&PlatformPosition,  0,  sizeof(PlatformPosition));
  PlatformPosition.structSize = sizeof(PlatformPosition);
 
  // Le programme de démonstration peut fournir la pause, la position et la limite de vitesse
  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);
 
  // ... code UE4 généré supprimé pour plus de clarté
 
  // ForceSeatMI - DÉBUT
  SendCoordinatesToPlatform();
  // ForceSeatMI - FIN
}
 
void  ATableLogPos_UnrealPawn::BeginPlay()
{
  Super::BeginPlay();
 
  // ForceSeatMI - DÉBUT
  if (FSMI_True  ==  IForceSeatMI::Get().GetAPI().BeginMotionControl())
  {
  SendCoordinatesToPlatform();
  }
  // ForceSeatMI - FIN
 
  // ... code UE4 généré supprimé pour plus de clarté
}
 
void  ATableLogPos_UnrealPawn::EndPlay(const  EEndPlayReason::Type  EndPlayReason)
{
  Super::EndPlay(EndPlayReason);
 
  // ForceSeatMI - DÉBUT
  IForceSeatMI::Get().GetAPI().EndMotionControl();
  // ForceSeatMI - FIN
}
 
void  ATableLogPos_UnrealPawn::SendCoordinatesToPlatform()
{
  // ForceSeatMI - DÉBUT
  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
}

Application : simulation de véhicule

Exemples : Telemetry_Veh_Unreal (utilise le profil ForceSeatPM intégré SDK – Vehicle Telemetry) Pour l’application de simulation de véhicule, l’interface d’aide IForceSeatMI_VehicleTelemetry peut être utilisée. IForceSeatMI_VehicleTelemetry nécessite PhysXVehicles et extrait automatiquement toutes les données nécessaires des objets APawn et UWheeledVehicleMovementComponent. La routine d’opération typique se compose des étapes suivantes :
  1. Crée une variable membre pointeur dans ta classe qui pointera vers une instance de IForceSeatMI_VehicleTelemetry :
    IForceSeatMI_VehicleTelemetry*  m_veh;
  2. Initialise-la dans le constructeur de la classe :
    m_veh(&IForceSeatMI::Get().GetVehicleTelemetry())
  3. Lorsque la simulation démarre, appelle (par exemple dans la méthode BeginPlay() de ton implémentation APawn) :
    m_veh->Begin();();
  4. Le SIM doit envoyer les données de télémétrie à intervalles constants en utilisant la fonction suivante :
    m_veh->Tick(...);
  5. À la fin de la simulation, appelle :
    m_veh->End();
Éditeur Unreal Veh

Code

Le code ci-dessous provient de l’exemple Telemetry_Veh_Unreal.
void  ATelemetry_Veh_UnrealPawn::Tick(float  Delta)
{
  Super::Tick(Delta);
 
  // ... code UE4 généré supprimé pour plus de clarté
 
  // ForceSeatMI - DÉBUT
  IForceSeatMI::Get().GetVehicleTelemetry().Tick(*this,  *GetVehicleMovement(), Delta,  false/* pas de pause */);
  // ForceSeatMI - FIN
}
 
void  ATelemetry_Veh_UnrealPawn::BeginPlay()
{
  Super::BeginPlay();
 
  // ForceSeatMI - DÉBUT
  IForceSeatMI::Get().GetVehicleTelemetry().Begin();
  // ForceSeatMI - FIN
}

Application : simulation de vol

Exemples : Telemetry_Fly_Unreal (utilise le profil ForceSeatPM intégré SDK – Plane Telemetry) Pour la simulation de vol, une API IForceSeatMI_API brute ou l’interface d’aide IForceSeatMI_PlaneTelemetry peut être utilisée. IForceSeatMI_PlaneTelemetry extrait automatiquement toutes les données nécessaires de l’objet APawn, puis calcule les informations manquantes comme les accélérations. La routine d’opération typique se compose des étapes suivantes :
  1. Crée une variable membre pointeur dans ta classe qui pointera vers une instance de IForceSeatMI_PlaneTelemetry :
    IForceSeatMI_PlaneTelemetry*  m_fly;
  2. Initialise-la dans le constructeur de la classe :
    m_fly(&IForceSeatMI::Get().GetPlaneTelemetry())
  3. Lorsque la simulation démarre, appelle (par exemple dans la méthode BeginPlay() de ton implémentation APawn) :
    m_fly->Begin();();
  4. Le SIM doit envoyer les données de télémétrie à intervalles constants en utilisant la fonction suivante :
    m_fly->Tick(...);
  5. À la fin de la simulation, appelle :
    m_fly->End();
Éditeur Unreal Fly

Code

Le code ci-dessous provient de l’exemple Telemetry_Fly_Unreal.
void  ATelemetry_Fly_UnrealPawn::Tick(float  DeltaSeconds)
{
  // ... code UE4 généré supprimé pour plus de clarté
 
  /  Appelle toute implémentation  class  Tick parente
  Super::Tick(DeltaSeconds);
 
  // ForceSeatMI - DÉBUT
  IForceSeatMI::Get().GetPlaneTelemetry().Tick(*this, DeltaSeconds,  false/* pas de pause */);
  // ForceSeatMI - FIN
}
 
void  ATelemetry_Fly_UnrealPawn::BeginPlay()
{
  Super::BeginPlay();
 
  // ForceSeatMI - DÉBUT
  IForceSeatMI::Get().GetPlaneTelemetry().Begin();
  // ForceSeatMI - FIN
}
Sign up to our newsletter
Always be the first to know about new products, updates and company news
  • Ce champ n’est utilisé qu’à des fins de validation et devrait rester inchangé.