效果图如上:
步骤:略
实现代码如下:
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 }