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");
// 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);
}
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);
}
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