10.4.3 編程實例-太陽系動畫

clip_image002

  1 #include <gl/glut.h>
  2 
  3 float fEarth = 2.0f; //地球繞太陽的旋轉角度
  4 
  5 float fMoon = 24.0f; //月球繞地球的旋轉角度
  6 
  7 void Init()
  8 
  9 {
 10 
 11 glEnable(GL_DEPTH_TEST); //啓用深度測試
 12 
 13 glClearColor(0.0f, 0.0f, 0.0f, 0.8f); //背景爲黑色
 14 
 15 }
 16 
 17 void Reshape(int w, int h)
 18 
 19 {
 20 
 21 if (0 == h)
 22 
 23 h = 1;
 24 
 25 glViewport(0, 0, w, h); //設置視區尺寸
 26 
 27 glMatrixMode(GL_PROJECTION); //指定當前操做投影矩陣堆棧
 28 
 29 glLoadIdentity(); //重置投影矩陣
 30 
 31 //指定透視投影的觀察空間
 32 
 33 gluPerspective(45.0f, (float)w / (float)h, 1.0f, 1000.0f);
 34 
 35 glMatrixMode(GL_MODELVIEW);
 36 
 37 glLoadIdentity();
 38 
 39 }
 40 
 41 void Display(void)
 42 
 43 {
 44 
 45 //清除顏色和深度緩衝區
 46 
 47 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 48 
 49 glMatrixMode(GL_MODELVIEW); //指定當前操做模型視圖矩陣堆棧
 50 
 51 glLoadIdentity(); //重置模型視圖矩陣
 52 
 53 glTranslatef(0.0f, 0.0f, -500.0f); //將圖形沿z軸負向移動
 54 
 55 glColor3f(1.0f, 0.0f, 0.0f); //畫太陽
 56 
 57 glutSolidSphere(50.0f, 20, 20);
 58 
 59 glColor3f(0.0f, 0.0f, 1.0f);
 60 
 61 glRotatef(23.27,0.0,0.0,1.0); //地球與太陽的黃赤交角
 62 
 63 glRotatef(fEarth, 0.0f, 1.0f, 0.0f);
 64 
 65 glTranslatef(200.0f, 0.0f, 0.0f);
 66 
 67 glutSolidSphere(20.0f, 20, 20); //畫地球
 68 
 69 glPopMatrix();
 70 
 71 glPopMatrix();
 72 
 73 glRotatef(6.0f, 1.0f, 1.0f, 1.0f);
 74 
 75 glRotatef(fMoon, 0.0f, 1.0f, 0.0f);
 76 
 77 glColor3f(1.0f, 1.0f, 0.0f);
 78 
 79 glTranslatef(30.0f, 0.0f, 0.0f);
 80 
 81 glutSolidSphere(5.0f, 20, 20); //畫月球
 82 
 83 glLoadIdentity();
 84 
 85 glFlush();
 86 
 87 glutSwapBuffers();
 88 
 89 }
 90 
 91 void myIdle(void) //在空閒時調用,達到動畫效果
 92 
 93 {
 94 
 95 fEarth += 0.03f; //增長旋轉步長,產生動畫效果
 96 
 97 if (fEarth > 360.0f)
 98 
 99 fEarth = 2.0f;
100 
101 fMoon += 0.24f;
102 
103 if (fMoon > 360.0f)
104 
105 fMoon = 24.0f;
106 
107 Display();
108 
109 }
110 
111 int main(int argc, char *argv[])
112 
113 {
114 
115 glutInit(&argc, argv);
116 
117 //窗口使用RGB顏色,雙緩存和深度緩存
118 
119 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
120 
121 glutInitWindowPosition(100,100);
122 
123 glutInitWindowSize(600, 400);
124 
125 glutCreateWindow("太陽系動畫");
126 
127 glutReshapeFunc(Reshape);
128 
129 glutDisplayFunc(Display);
130 
131 glutIdleFunc(&myIdle);
132 
133 Init();
134 
135 glutMainLoop();
136 
137 return 0;
138 
139 }

附上本實驗的VC++工程代碼(VC++2008)緩存

相關文章
相關標籤/搜索