Tutorial 21 – OpenCL Masspoint Physics, Collision Hash Grids

Physikalische Simulationen sind mittlerweile zu einem festen Bestandteil moderner Computerspiele geworden. Sollen die zugrunde liegenden Berechnungen wahlweise von der CPU oder GPU durchgeführt werden, dann ist der Einsatz von OpenCL (Open Computing Language) gegenwärtig alternativlos, da andere Schnittstellen wie Cuda oder DirectCompute lediglich GPU-Unterstützung bieten.
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,
                          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();



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