Tutorial 21 demonstriert Ihnen den Einsatz unseres OpenCL-Frameworks am Beispiel einer einfachen OpenCL-basierten Bewegungs-Simulation für ein Asteroidenfeld:
- Simulation der Asteroiden-Bewegung (jedem Asteroid ist eine einzelne Punktmasse zugeordnet).
- Berechnung der Gitter-Indices und -Positionen in einem Kollisionsgitter (Collision Hash Grid) für eine effiziente Kollisionsprüfung.
Initialisierungsarbeiten:
// Physiksystem initialisieren (maximal 3000 Partikel/Massenpunkte):
PhysicalSimulationParameter = new CPhysicalSimulationParameter;
PhysicalSimulationParameter->Init_PhysicalSimulationParameter(
"../Physics/SimulationParameter.txt");
OpenCLPhysicsManager = new COpenCLPhysicsManager;
OpenCLPhysicsManager->Init_CollisionGrid(71, 71, 71);
OpenCLPhysicsManager->Init_OpenCL_ParticlePhysicsManager(
"../Physics/SimplePhysicsCalculations.cl",
3000, false);
OpenCLParticleManager = new COpenCLParticleManager;
OpenCLParticleManager->Init_OpenCLParticleManager(3000,
OpenCLPhysicsManager->ParticlePool);
// 2000 Asteroiden generieren:
Asteroids = new CAsteroidPhysicsManager;
Asteroids->Set_PhysicalSimulationParameter(PhysicalSimulationParameter);
Asteroids->Set_OpenCLPhysicsManager(OpenCLPhysicsManager);
Asteroids->Init_Asteroids(OpenCLParticleManager,
InstancedObjectTextureAndMeshDesc,
PhysicalSimulationParameter = new CPhysicalSimulationParameter;
PhysicalSimulationParameter->Init_PhysicalSimulationParameter(
"../Physics/SimulationParameter.txt");
OpenCLPhysicsManager = new COpenCLPhysicsManager;
OpenCLPhysicsManager->Init_CollisionGrid(71, 71, 71);
OpenCLPhysicsManager->Init_OpenCL_ParticlePhysicsManager(
"../Physics/SimplePhysicsCalculations.cl",
3000, false);
OpenCLParticleManager = new COpenCLParticleManager;
OpenCLParticleManager->Init_OpenCLParticleManager(3000,
OpenCLPhysicsManager->ParticlePool);
// 2000 Asteroiden generieren:
Asteroids = new CAsteroidPhysicsManager;
Asteroids->Set_PhysicalSimulationParameter(PhysicalSimulationParameter);
Asteroids->Set_OpenCLPhysicsManager(OpenCLPhysicsManager);
Asteroids->Init_Asteroids(OpenCLParticleManager,
InstancedObjectTextureAndMeshDesc,
SimpleObjectInstanceMemoryManager, 2000);
Bewegungs- und Kollisionsberechnungen:
if(g_FrameTime > g_MaximalAcceptedFrameTimeUsedForPhysicalCalculations)
{
PhysicalSimulationParameter->Calculate_NumTimeSteps(
g_MaximalAcceptedFrameTimeUsedForPhysicalCalculations,
0.33f*g_MaximalAcceptedFrameTimeUsedForPhysicalCalculations);
}
else
{
PhysicalSimulationParameter->Calculate_NumTimeSteps(g_FrameTime,
0.33f*g_FrameTime);
}
Asteroids->Update_Movement();
Asteroids->Update_AsteroidCollisionsThread();
{
PhysicalSimulationParameter->Calculate_NumTimeSteps(
g_MaximalAcceptedFrameTimeUsedForPhysicalCalculations,
0.33f*g_MaximalAcceptedFrameTimeUsedForPhysicalCalculations);
}
else
{
PhysicalSimulationParameter->Calculate_NumTimeSteps(g_FrameTime,
0.33f*g_FrameTime);
}
Asteroids->Update_Movement();
Asteroids->Update_AsteroidCollisionsThread();
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.
GraphicsAndPhysicsFrameworkDemo21.zip