Tutorial 19 – Sonnensystem Simulation

Zentraler Bestandteil von realistischen Weltraumspielen ist eine glaubhafte Simulation der Bewegungen von Planeten, Monden und Asteroiden. Tutorial 19 zeigt Ihnen, wie sich solche Sonnensystem-Simulationen mithilfe des Graphics And Physics Frameworks realisieren lassen. Verantwortlich für die Initialisierung der einzelnen Himmelskörper (Sonne, Planeten, Monde, Sonden, sowie Asteroiden) sowie für die Bewegungs-Simulation ist die Framework-Klasse CSolarSystemPhysicsObject:



class GRAPHICS_AND_PHYSICS_API CSolarSystemPhysicsObject
{
public:

    long        GravitationCenterID;
    float       Mass;
    float       RotationVelocity;
    D3DXVECTOR3 RotationAxis;
    D3DXVECTOR3 Velocity;
    D3DXVECTOR3 Position;
    D3DXVECTOR3 VelocitySimulationStart;
    D3DXVECTOR3 PositionSimulationStart;

    D3DXMATRIXA16 Orientation;
    D3DXMATRIXA16 FrameRotation;

    float OrbitalEccentricity;

    D3DXVECTOR3 Apoapsis;
    D3DXVECTOR3 Periapsis;

    float ApoapsisDistance;
    float PeriapsisDistance;

    D3DXVECTOR3 OrbitalAxis;

    CSolarSystemPhysicsObject();
    ~CSolarSystemPhysicsObject();

    void Init_Object(D3DXVECTOR3* pRotationAxis, float rotationVelocity,
                     float mass, long gravitationCenterID,
                     D3DXVECTOR3* pGravitationCenterPos,
                     float gravitationCenterMass, D3DXVECTOR3* pApoapsis,
                     D3DXVECTOR3* pPeriapsis, bool usePeriapsisAsPosition,
                     bool clockwiseOrbitalMovement);

    void Init_Object_UseApoapsis(D3DXVECTOR3* pRotationAxis,
                                 float rotationVelocity, float mass,
                                 long gravitationCenterID,
                                 D3DXVECTOR3* pGravitationCenterPos,
                                 float gravitationCenterMass,
                                 D3DXVECTOR3* pOrbitalAxis,
                                 D3DXVECTOR3* pApoapsis,
                                 float orbitalEccentricity);

    void Init_Object_UsePeriapsis(D3DXVECTOR3* pRotationAxis,
                                  float rotationVelocity, float mass,
                                  long gravitationCenterID,
                                  D3DXVECTOR3* pGravitationCenterPos,
                                  float gravitationCenterMass,
                                  D3DXVECTOR3* pOrbitalAxis,
                                  D3DXVECTOR3* pPeriapsis,
                                  float orbitalEccentricity);

    void Init_Object(long gravitationCenterID, D3DXVECTOR3* pRotationAxis,
                     float rotationVelocity, D3DXVECTOR3* pVelocity,
                     D3DXVECTOR3* pPosition, float mass);


    void Calculate_OrbitalParameter(CSolarSystemPhysicsObject*
                                    pOtherSolarSystemObject,
                                    float simulationTimeStep,
                                    long NumSimulationStepsMax = 10000);

    void Update_Rotation(float simulationTime);

    void Update_GravitySimulation(CSolarSystemPhysicsObject*
                                  pOtherSolarSystemObject,
                                  float simulationTimeStep,
                                  long numSimulationSteps);

    void Reset_GravitySimulation(void);
};



Verantwortlich für die Darstellung der Umlaufbahnen ist die COrbitalCurve-Klasse:

class GRAPHICS_AND_PHYSICS_API COrbitalCurve
{
public:

    bool ExternalShaderUsed;
    CGLSLShader* OrbitalCurveShader;

    long NumVertices;

    GLuint VertexBufferId;
    GLuint IndexBufferId;

    COrbitalCurve(long numVertices, CGLSLShader* pShader);
    COrbitalCurve(long numVertices, char* pVertexShaderFile,
                  char* pFragmentShaderFile);

    ~COrbitalCurve();

    void Start_Rendering(void);
    void Stop_Rendering(void);

    void Render_OrbitalCurve(D3DXMATRIXA16* pWorldViewProjectionMatrix,
                             D3DXVECTOR4* pColor);

    void Render_Circle(float radius, D3DXVECTOR3* pCameraSpaceCenterPos,
                       D3DXMATRIXA16* pViewProjectionMatrix,
                       D3DXVECTOR4* pColor);

    void Render_Ellipse(float PeriapsisDistance, float ApoapsisDistance,
                        float eccentricity, D3DXVECTOR3* pAxis,
                        D3DXVECTOR3* pFocus, D3DXVECTOR3* pPeriapsis,
                        D3DXVECTOR3* pCameraPosition,
                        D3DXMATRIXA16* pViewProjectionMatrix,
                        D3DXVECTOR4* pColor);
};


Simulation der Bewegung der einzelnen Himmelskörper:

// 5 Simulationsschritte pro Frame:
for(j = 0; j < 5; j++)
{
    // Sonnenbewegung (i := 0) vernachlässigen
    for(i = 1; i <
SolarSystemObjects; i++)
    {
        SolarSystemPhysicsObject[i].Update_GravitySimulation(
            &SolarSystemPhysicsObject[SolarSystemPhysicsObject[i].
            GravitationCenterID], g_FrameTime, 1);

        SolarSystemPhysicsObject[i].Update_Rotation(g_FrameTime);
    }
}


Darstellung eines Planeten-Orbits:

SolarSystemOrbit->Render_Ellipse(
    SolarSystemPhysicsObject[i].PeriapsisDistance,
    SolarSystemPhysicsObject[i].ApoapsisDistance,
    SolarSystemPhysicsObject[i].OrbitalEccentricity,
    &SolarSystemPhysicsObject[i].OrbitalAxis,
    &SolarSystemPhysicsObject[0].Position, /* Fokus; Pos. der Sonne*/
    &SolarSystemPhysicsObject[i].Periapsis,
    &g_CameraPosition, &g_ViewProjectionMatrix,
    &D3DXVECTOR4(0.0f, 0.5f, 0.75f, 1.0f) /*Farbe*/);



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.

GraphicsAndPhysicsFrameworkDemo19.zip