1 #include<windows.h>
2 #include<gl/glut.h>
3 #include<gl/gl.h>
4 #include<gl/glu.h>
5
6 //参数指定正方形的位置和大小
7 GLfloat x1=100.0f;
8 GLfloat y1=150.0f;
9 GLsizei rsize=50;
10
11 //正方形运动变化的步长
12 GLfloat xstep=1.0f;
13 GLfloat ystep=1.0f;
14
15 //窗口的大小
16 GLfloat windowWidth;
17 GLfloat windowHeight;
18
19 //画的物体
20 void DrawDUA();
21 void DrawTR();
22
23 //属性开关
24 void SunShine(void);//光照
25
26 //三维
27 GLfloat rtri;
28 GLfloat rquad;
29
30 //开关
31 BOOL Draw3D=true;//三维动画演示开关
32 BOOL Draw2D=false;//二维动画演示开关
33 BOOL DrawAtoms=false;//原子动画演示开关
34
35
36 //三维属性开关
37 BOOL AS=true;//透视投影开关
38 BOOL OR=false;//正交平行投影
39 BOOL LIGHT=true;//光照开关
40
41
42
43 void RenderScene(void)
44 {
45 if(Draw3D)
46 {
47 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
48 glMatrixMode(GL_MODELVIEW);
49 glLoadIdentity();
50 if(LIGHT)
51 SunShine();
52
53 glTranslatef(-1.5f,0.0f,-6.0f);
54 glRotatef(rtri,0.0f,1.0f,0.0f);
55
56 DrawTR();
57
58 glLoadIdentity();
59 glTranslatef(1.5f,0.0f,-6.0f);
60 glRotatef(rquad,1.0f,0.0f,0.0f);
61 glColor3f(0.5f,0.5f,1.0f);
62
63
64 DrawDUA();
65
66 rtri+=1.0f;
67 rquad-=0.5f;
68 }
69
70 if(Draw2D)
71 {
72 glClear(GL_COLOR_BUFFER_BIT);
73 glColor3f(1.0f,0.0f,0.0f);
74 glRectf(x1,y1,x1+rsize,y1+rsize);
75 }
76
77 if(DrawAtoms)
78 {
79 //绕核旋转角度
80 static float fElect1=0.0f;
81
82 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
83
84 //重置模型视图矩阵
85 glMatrixMode(GL_MODELVIEW);
86 glLoadIdentity();
87 if(LIGHT)
88 SunShine();
89
90 //将图形沿Z轴负向移动
91 glTranslatef(0.0f,0.0f,-250.0f);
92
93 //绘制红色原子核
94 glColor3f(1.0f,0.0f,0.0f);
95 glutWireSphere(10.0f,15,15);
96
97 //绘制颜色变成绿色
98 glColor3f(0.0f,1.0f,0.0f);
99
100 //绘制第一个电子
101 //保存当前的模型视图矩阵
102 glPushMatrix();
103 glRotatef(fElect1,0.0f,1.0f,0.0f);//绕y轴旋转一定角度
104 glTranslatef(90.0f,0.0f,0.0f);//平移一段距离
105 glutSolidSphere(6.0f,15,15);//画出电子
106
107 //恢复矩阵
108 glPopMatrix();
109 glColor3f(0.0f,0.0f,1.0f);//绘制颜色变成蓝色
110 //第二个电子
111 glPushMatrix();
112 glRotatef(45.0f,0.0f,0.0f,1.0f);
113 glRotatef(fElect1,0.0f,1.0f,0.0f);
114 glTranslatef(-70.0f,0.0f,0.0f);
115 glutSolidSphere(6.0f,15,15);
116 glPopMatrix();
117
118 glColor3f(1.0f,1.0f,0.0f);//绘制颜色变成黄色
119 //第三个电子
120 glPushMatrix();
121 glRotatef(-45.0f,0.0f,0.0f,1.0f);
122 glRotatef(fElect1,0.0f,1.0f,0.0f);
123 glTranslatef(0.0f,0.0f,60.0f);
124 glutSolidSphere(6.0f,15,15);
125 glPopMatrix();
126 fElect1+=10.0f;
127 if(fElect1>360.0f)
128 fElect1=10.0f;
129 }
130 glutSwapBuffers();
131 }
132
133 void ChangeSize(GLsizei w,GLsizei h)
134 {
135 if(h==0)
136 h==1;
137
138 //设置视区尺寸
139 glViewport(0,0,w,h);
140 glMatrixMode(GL_PROJECTION);
141 glLoadIdentity();
142
143 if(Draw3D||DrawAtoms)
144 {
145 //修剪空间(透视投影)
146 if(AS)
147 {
148 GLfloat fAspect;
149 fAspect =(float)w/(float)h;
150 gluPerspective(45.0,fAspect,1.0,500.0);
151 }
152
153
154
155 //(正交平行投影)
156 if(OR)
157 {
158 if(w<=h)
159 glOrtho(-2.25,2.25,-2.25*h/w,2.25*h/w,-10.0,10.0);
160 else
161 glOrtho(-2.25*h/w,2.25*h/w,-2.25,2.25,-10.0,10.0);
162 }
163
164
165
166 }
167
168 if(Draw2D)
169 {
170 if(w<=h)
171 {
172 windowHeight=250.0f*h/w;
173 windowWidth=250.0f;
174 }
175 else
176 {
177 windowWidth=250.0f*w/h;
178 windowHeight=250.0f;
179 }
180
181 glOrtho(0.0f,windowWidth,0.0f,windowHeight,1.0f,-1.0f);
182 }
183
184 glMatrixMode(GL_MODELVIEW);
185 glLoadIdentity();
186 }
187
188 void TimerFunction(int value)
189 {
190 if(x1>windowWidth-rsize||x1<0)
191 xstep=-xstep;
192 if(y1>windowHeight-rsize||y1<0)
193 ystep=-ystep;
194
195 x1+=xstep;
196 y1+=ystep;
197
198 glutPostRedisplay();
199 glutTimerFunc(5,TimerFunction,1);
200 }
201
202 void SetupRC(void)
203 {
204 if(Draw3D||DrawAtoms)
205 {
206 glEnable(GL_DEPTH_TEST);//启用深度测试
207 glFrontFace(GL_CCW);
208 }
209 glClearColor(0.0f,0.0f,1.0f,1.0f);
210 }
211 void TimerFunc(int value)
212 {
213 glutPostRedisplay();
214 if(Draw3D)
215 {
216 glutTimerFunc(1,TimerFunc,1);
217 }
218 if(DrawAtoms)
219 {
220 glutTimerFunc(100,TimerFunc,1);
221 }
222
223 }
224 int main(int argc,char* argv[])
225 {
226 if(Draw2D)
227 {
228 glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
229 glutCreateWindow("Bounce");
230 glutDisplayFunc(RenderScene);
231 glutReshapeFunc(ChangeSize);
232 glutTimerFunc(5,TimerFunction,1);
233 }
234 if(Draw3D||DrawAtoms)
235 {
236 glutInit(&argc,argv);
237 glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
238 glutCreateWindow("原子示例");
239 glutReshapeFunc(ChangeSize);
240 glutDisplayFunc(RenderScene);
241 if(DrawAtoms)
242 glutTimerFunc(100,TimerFunc,1);
243 else
244 glutTimerFunc(1,TimerFunc,1);
245 }
246
247 SetupRC();
248 glutMainLoop();
249 }
250 void DrawTR()
251 {
252 glBegin(GL_TRIANGLES);
253 //
254 glColor3f(1.0f,0.0f,0.0f);
255 glVertex3f(0.0f,1.0f,0.0f);
256
257 glColor3f(0.0f,1.0f,0.0f);
258 glVertex3f(-1.0f,-1.0f,1.0f);
259
260 glColor3f(0.0f,0.0f,1.0f);
261 glVertex3f(1.0f,-1.0f,1.0f);
262
263 //
264 glColor3f(1.0f,0.0f,0.0f);
265 glVertex3f(0.0f,1.0f,0.0f);
266
267 glColor3f(0.0f,0.0f,1.0f);
268 glVertex3f(1.0f,-1.0f,1.0f);
269
270 glColor3f(0.0f,1.0f,0.0f);
271 glVertex3f(1.0f,-1.0f,-1.0f);
272
273 //
274 glColor3f(1.0f,0.0f,0.0f);
275 glVertex3f(0.0f,1.0f,0.0f);
276
277 glColor3f(0.0f,1.0f,0.0f);
278 glVertex3f(1.0f,-1.0f,-1.0f);
279
280 glColor3f(0.0f,0.0f,1.0f);
281 glVertex3f(-1.0f,-1.0f,-1.0f);
282
283 //
284 glColor3f(1.0f,0.0f,0.0f);
285 glVertex3f(0.0f,1.0f,0.0f);
286
287 glColor3f(0.0f,0.0f,1.0f);
288 glVertex3f(-1.0f,-1.0f,-1.0f);
289
290 glColor3f(0.0f,1.0f,0.0f);
291 glVertex3f(-1.0f,-1.0f,1.0f);
292
293 glEnd();
294 }
295
296 void DrawDUA()
297 {
298 glBegin(GL_QUADS);
299
300 glColor3f(0.0f,1.0f,0.0f);
301 glVertex3f(1.0f,1.0f,-1.0f);
302 glVertex3f(-1.0f,1.0f,-1.0f);
303 glVertex3f(-1.0f,1.0f,1.0f);
304 glVertex3f(1.0f,1.0f,1.0f);
305
306 glColor3f(1.0f,0.5f,0.0f);
307 glVertex3f(1.0f,-1.0f,1.0f);
308 glVertex3f(-1.0f,-1.0f,1.0f);
309 glVertex3f(-1.0f,-1.0f,-1.0f);
310 glVertex3f(1.0f,-1.0f,-1.0f);
311
312 glColor3f(1.0f,0.0f,0.0f);
313 glVertex3f(1.0f,1.0f,1.0f);
314 glVertex3f(-1.0f,1.0f,1.0f);
315 glVertex3f(-1.0f,-1.0f,1.0f);
316 glVertex3f(1.0f,-1.0f,1.0f);
317
318 glColor3f(1.0f,1.0f,0.0f);
319 glVertex3f(1.0f,-1.0f,-1.0f);
320 glVertex3f(-1.0f,-1.0f,-1.0f);
321 glVertex3f(-1.0f,1.0f,-1.0f);
322 glVertex3f(1.0f,1.0f,-1.0f);
323
324 glColor3f(0.0f,0.0f,1.0f);
325 glVertex3f(-1.0f,1.0f,1.0f);
326 glVertex3f(-1.0f,1.0f,-1.0f);
327 glVertex3f(-1.0f,-1.0f,-1.0f);
328 glVertex3f(-1.0f,-1.0f,1.0f);
329 glEnd();
330 }
331
332 void SunShine(void)
333 {
334
335 GLfloat sun_light_position[]={0.0f,0.0f,0.0f,1.0f};
336 GLfloat sun_light_ambient[]={0.0f,0.0f,0.0f,1.0f};
337 GLfloat sun_light_diffuse[]={1.0f,1.0f,1.0f,1.0f};
338 GLfloat sun_light_specular[]={1.0f,1.0f,1.0f,1.0f};
339
340 glLightfv(GL_LIGHT0,GL_POSITION,sun_light_position);
341 glLightfv(GL_LIGHT0,GL_AMBIENT,sun_light_ambient);
342 glLightfv(GL_LIGHT0,GL_DIFFUSE,sun_light_diffuse);
343 glLightfv(GL_LIGHT0,GL_SPECULAR,sun_light_specular);
344
345 glEnable(GL_LIGHT0);
346 glEnable(GL_LIGHTING);
347 glEnable(GL_DEPTH_TEST);
348 }