效果图:

代码:

  1 #define GLUT_DISABLE_ATEXIT_HACK
2 #include "gl/glut.h"
3
4 GLfloat AngleX=0.0f; //绕X轴的旋转角度
5 GLfloat AngleY=0.0f; //绕Y轴的旋转角度
6
7
8 void OnDisplay(void);
9 void OnReShape(int,int);
10 void OnKey(int,int,int);
11 void SetupLights();
12
13 void main(int argc,char* argv[])
14 {
15 glutInit(&argc,argv);
16 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
17 glutInitWindowSize(600,480);
18 glutCreateWindow("OpenGL透视投影");
19
20 glutReshapeFunc(OnReShape);
21 glutDisplayFunc(OnDisplay);
22 glutSpecialFunc(OnKey);
23
24
25 SetupLights();
26
27 glutMainLoop();
28 }
29
30 //显示 回调函数
31 void OnDisplay(void)
32 {
33 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
34
35 glEnable(GL_DEPTH_TEST); //启用深度检测
36
37 glMatrixMode(GL_MODELVIEW);
38 glLoadIdentity();
39
40 glTranslatef(0.0f,0.0f,-100.0f); //平移以能够观察到对象
41 glRotatef(30.0f,1.0f,0.0f,0.0f);
42 glRotatef(15.0f,0.0f,1.0f,0.0f);
43
44 glColor3f(0.8f,0.5f,0.7f);
45
46
47 glPushMatrix();
48
49 glRotatef(AngleX,1.0f,0.0f,0.0f);
50 glRotatef(AngleY,0.0f,1.0f,0.0f);
51 glutSolidCube(30.0f);
52
53 glPopMatrix();
54
55 glutSwapBuffers();
56
57 }
58 //窗口尺寸变化后的回调函数
59 void OnReShape(int w,int h)
60 {
61 glViewport(0,0,w,h);
62 glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影模式
63 glLoadIdentity();
64
65 GLfloat aspect =(float)w/(float)h;
66
67 gluPerspective(60.0f,aspect,1.0f,200.0f); //透视投影
68 }
69
70 //特殊按键处理回调函数
71 void OnKey(int key,int x,int y)
72 {
73 if(key==GLUT_KEY_LEFT)
74 AngleY+=10.0f;
75 if(key==GLUT_KEY_RIGHT)
76 AngleY-=10.0f;
77 if(key==GLUT_KEY_DOWN)
78 AngleX+=10.0f;
79 if(key==GLUT_KEY_UP)
80 AngleX-=10.0f;
81
82 glutPostRedisplay();
83 }
84
85 //设置光照
86 void SetupLights()
87 {
88 GLfloat ambientLight[]={0.2f,0.2f,0.2f,1.0f};//环境光
89 GLfloat diffuseLight[]={0.9f,0.9f,0.9f,1.0f};//漫反射
90 GLfloat specularLight[]={1.0f,1.0f,1.0f,1.0f};//镜面光
91 GLfloat lightPos[]={50.0f,80.0f,60.0f,1.0f};//光源位置
92
93 glEnable(GL_LIGHTING); //启用光照
94 glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);//设置环境光源
95 glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);//设置漫反射光源
96 glLightfv(GL_LIGHT0,GL_SPECULAR,specularLight);//设置镜面光源
97 glLightfv(GL_LIGHT0,GL_POSITION,lightPos);//设置灯光位置
98 glEnable(GL_LIGHT0); //打开第一个灯光
99
100 glEnable(GL_COLOR_MATERIAL); //启用材质的颜色跟踪
101 glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); //指定材料着色的面
102 glMaterialfv(GL_FRONT,GL_SPECULAR,specularLight); //指定材料对镜面光的反应
103 glMateriali(GL_FRONT,GL_SHININESS,100); //指定反射系数
104
105
106 }



 posted on 2012-04-07 11:23  xiacl  阅读(1243)  评论(0编辑  收藏  举报