Tutorial 25 – OpenCL Ground Vehicle Physics

Der Ansatz, physikalische Objekte als eine Ansammlung von miteinander wechselwirkenden Massenelementen (bzw. Partikel) zu definieren (Masspoint Model), ist nicht nur hilfreich bei der Parallelisierung von Physik- und Kollisionsberechnungen, sondern bietet darüber hinaus auch eine einfache Möglichkeit für die Implementierung verschiedenster Fahrzeug-Bewegungsmodelle.





Zu diesem Zweck ordnen wir ausgewählten Massenelementen zusätzliche Eigenschaften zu, mit denen sich beispielsweise das physikalische Verhalten eines Autoreifens simulieren lässt:

  • Radius bzw. Durchmesser eines Reifens
  • Traktion (Bodenhaftung)
  • Bremskraft
  • Umwandlung der auf ein Rad einwirkenden Kräfte in eine Roll- und Driftbewegung
  • Unterschiedliche Reibungskräfte in Abhängigkeit von der Bewegungsrichtung (maximale Reibung parallel zur Drehachse, minimale Reibung senkrecht zur Drehachse)

Im heutigen Tutorial befassen wir uns zunächst mit zwei Typen von Bodenfahrzeugen:

  • Wheeled Vehicles (Auto, LKW, etc.)
  • Tracked Vehicles (Kettenfahrzeug, Panzer, etc.)

weitere Fahrzeugtypen wie Schiffe, Unterseeboote, Hovercrafts, Flugzeuge und Hubschrauber werden wir in den nachfolgenden Tutorials behandeln.


// Massenpunkt-Modelle für bereifte Fahrzeuge sowie für Kettenfahrzeuge
// initialisieren:

WheeledVehicleBodyMasspointModel = new CWheeledVehicleBodyMasspointModel;
WheeledVehicleBodyMasspointModel->Init_MasspointModel(
                                  "../Physics/MasspointModels/Car.txt");

TrackedVehicleBodyMasspointModel = new CTrackedVehicleBodyMasspointModel;
TrackedVehicleBodyMasspointModel->Init_MasspointModel(
                          "../Physics/MasspointModels/TrackedVehicle.txt");


// Fahrzeuge initialisieren

if(g_VehiclePhysicsModel == 1)
{
    WheeledVehicleBody = new CWheeledVehicleBody;

    WheeledVehicleBody->Set_MassElementPool(
                        OpenCLPhysicsManager->MassElementPool);
    WheeledVehicleBody->Set_BondingPool(
                        OpenCLPhysicsManager->BondingPool);

    WheeledVehicleBody->Init_Body(0, WheeledVehicleBodyMasspointModel,
                                  &VehicleModel_WorldSpacePosition,
                                  &Velocity, NULL, 0.0f, true);
}
else
{
    TrackedVehicleBody = new CTrackedVehicleBody;

    TrackedVehicleBody->Set_MassElementPool(
                        OpenCLPhysicsManager->MassElementPool);
    TrackedVehicleBody->Set_BondingPool(
                        OpenCLPhysicsManager->BondingPool);

    TrackedVehicleBody->Init_Body(0, TrackedVehicleBodyMasspointModel,
                                  &VehicleModel_WorldSpacePosition,
                                  &Velocity, NULL, 0.0f, true);
}


// Steuerkommandos verarbeiten:

if(g_VehiclePhysicsModel == 1)
{
    [...]

   
WheeledVehicleBody->Consider_ActualSimulationParameter(
                        g_WheeledVehicle_Acceleration, SteeringValue,
                        g_WheeledVehicle_BreakForce,
                        g_WheeledVehicle_ParkingBreakForce,
                        PhysicalSimulationParameter);
}
else
{
    [...]

    TrackedVehicleBody->Consider_ActualSimulationParameter(
                        g_TrackedVehicle_LeftAcceleration,
                        g_TrackedVehicle_RightAcceleration,
                        g_WheeledVehicle_BreakForce,
                        g_WheeledVehicle_ParkingBreakForce,
                        PhysicalSimulationParameter);
}



Hinweise zum Erstellen eines neuen Projekts:

  • Kopieren Sie den Ordner GraphicsAndPhysicsFrameworkImports ins Projektverzeichnis
  • Kopieren sie alle dll-Dateien sowie die Konfigurationsdatei ResolutionAndRendering.txt aus besagtem Ordner ins gleiche Verzeichnis, in dem sich auch die exe-Datei befindet (in unseren Programmbeispielen ist dies das Bin-Verzeichnis)
  • Binden Sie die folgenden Dateien in Ihr Projekt ein: GraphicsAndPhysics_Framework_Imports.h, GraphicsAndPhysics_Framework_Imports.lib, glew32.lib, glew32s.lib, glut32.lib. Die Glew- und Glut-Bibliotheken ermöglichen die Nutzung der aktuellen OpenGL-Spezifikationen unabhängig vom Framework.

GraphicsAndPhysicsFrameworkDemo25.zip