openGL+VS2010的例程--太阳地球月球运动模型(三维)

时间:2022-09-10 16:56:34

openGL+VS2010的例程--太阳地球月球运动模型(三维)

效果图如上:

步骤:略

实现代码如下:

  1 #include "windows.h"
  2 #include <gl\glut.h>
  3 
  4 #define SunSize 0.4
  5 #define EarthSize 0.06
  6 #define MoonSize 0.016
  7 
  8 GLfloat SpeedMultiplicator = 1.0;
  9 GLfloat DaysPerYear = 50.0; //OK, ok... but it is soo slow with 360!
 10 GLfloat year = 0.0; //degrees
 11 GLfloat day = 0.0;
 12 GLfloat moonAroundEarth = 0.0;
 13 GLfloat moonItsSelf = 0.0;
 14 GLfloat EarthOrbitRadius = 1.0;
 15 GLfloat MoonOrbitRadius = 0.1;
 16 GLfloat daySpeed = 5.0 * SpeedMultiplicator;
 17 GLfloat yearSpeed = DaysPerYear / 360.0 * daySpeed * SpeedMultiplicator;
 18 GLfloat moonAroundEarthSpeed = 10 * SpeedMultiplicator;
 19 GLfloat moonItsSelfSpeed = 5 * SpeedMultiplicator;
 20 void RenderScene(void)
 21 {
 22     glPushMatrix();
 23         gluLookAt(    0.0,0.0,-4.0,
 24                     0.0,0.0,1.0,
 25                     0.0,-3.0,0.0);
 26         glColor3f(1.0,1.0,0.6);
 27         glutWireSphere(SunSize,50,50);
 28         glPushMatrix();
 29             glRotatef(year,0.0,1.0,0.0);
 30             glTranslatef(EarthOrbitRadius,0.0,0.0);
 31             glRotatef(-year,0.0,1.0,0.0);
 32             glPushMatrix();
 33                 glRotatef(day,0.25,1.0,0.0);
 34                 glColor3f(0.0,0.5,0.8);
 35                 glutWireSphere(EarthSize,10,10);  //Draw earth
 36                 //Draw earth rotation axis
 37                 glBegin(GL_LINES);
 38                     glVertex3f(-0.0625,-0.25,0.0);
 39                     glVertex3f(0.0625,0.25,0.0);
 40                 glEnd();
 41             glPopMatrix();
 42             glRotatef(moonAroundEarth,0.0,1.0,0.0);
 43             glTranslatef(MoonOrbitRadius,0.0,0.0);
 44             //The following 2 lines should be combined, but it is better to understand this way
 45             glRotatef(-moonAroundEarth,0.0,1.0,0.0);
 46             glRotatef(moonItsSelf,0.0,1.0,0.0);
 47             glColor3f(0.8,0.8,0.75);
 48             glutWireSphere(MoonSize,8,8);
 49         glPopMatrix();
 50                 
 51     glPopMatrix();
 52 }
 53 
 54 void Init(void)
 55 {
 56     glClearColor(0.0,0.0,0.0,0.0);
 57     glClearDepth(10.0);
 58     glMatrixMode(GL_MODELVIEW);
 59     glLoadIdentity();
 60 }
 61 
 62 void Display(void)
 63 {
 64     glClear(GL_COLOR_BUFFER_BIT);
 65     RenderScene();
 66     glFlush();
 67     glutSwapBuffers();
 68 }
 69 
 70 void Reshape(int x, int y)
 71 {
 72     if (y == 0) return;
 73     glMatrixMode(GL_PROJECTION);
 74     glLoadIdentity();
 75     gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0);
 76     glMatrixMode(GL_MODELVIEW);
 77     glViewport(0,0,x,y);
 78     Display();
 79 }
 80 static long long times = 0;
 81 void Idle(void)
 82 {
 83     times++;
 84     if(times>1000000)
 85         times =0;
 86     if(times% 1000000== 0)
 87     {
 88         day += daySpeed;
 89         year += yearSpeed;
 90         moonItsSelf += moonItsSelfSpeed;
 91         moonAroundEarth += moonAroundEarthSpeed;
 92         Display();
 93     }
 94 }
 95 
 96 
 97 int main(int argc, char* argv[])
 98 {
 99     glutInit(&argc, argv);
100     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
101     glutInitWindowSize(600,600);
102     glutCreateWindow(argv[0]);
103     Init();
104     glutReshapeFunc(Reshape);
105     glutDisplayFunc(Display);
106     glutIdleFunc(Idle);
107     glutMainLoop();
108     return 0;
109 }