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