OpenGL三维与光照

  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 }
原文地址:https://www.cnblogs.com/mxdmxdmxd78/p/5491941.html