代码:
1 #define GLUT_DISABLE_ATEXIT_HACK
2 #include "gl/glut.h"
3
4 int i;
5 void OnMouse(GLint,GLint,GLint,GLint);
6 void OnDisplay(void);
7 void OnReShape(int,int);
8 void SetupLights();
9
10 void main(int argc,char* argv[])
11 {
12 glutInit(&argc,argv);
13 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
14 glutInitWindowSize(600,480);
15 glutCreateWindow("OpenGL缩放变换");
16
17 glutReshapeFunc(OnReShape);
18 glutDisplayFunc(OnDisplay);
19 glutMouseFunc(OnMouse);
20
21
22
23 SetupLights();
24
25 glutMainLoop();
26 }
27
28 void OnDisplay(void)
29 {
30 GLfloat sizes[]={1.0f,1.0f,1.0f,2.0f,
31 1.0f,1.0f,1.0f,2.0f,
32 1.0f,1.0f,1.0f,2.0f,
33 2.0f,2.0f,1.0f,2.0f,
34 1.0f,2.0f,1.0f,2.0f,
35 2.0f,2.0f,2.0f,2.0f,
36 };
37 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
38
39 glEnable(GL_DEPTH_TEST);
40
41 glMatrixMode(GL_MODELVIEW);
42 glLoadIdentity();
43
44 glRotatef(30.0f,1.0f,0.0f,0.0f);
45 glRotatef(15.0f,0.0f,1.0f,0.0f);
46
47
48 glColor3f(1.0f,1.0f,0.0f);
49 glScalef(sizes[i*3],sizes[i*3+1],sizes[i*3+2]);
50 glutSolidCube(50.f);
51
52
53 glutSwapBuffers();
54
55 }
56
57 void OnReShape(int w,int h)
58 {
59 GLfloat aspect =(GLfloat)w/(GLfloat)h;
60 GLfloat nRange=100.0f;
61
62 glViewport(0,0,w,h);
63
64 glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影模式
65 glLoadIdentity();
66
67 //设置三维投影区
68
69 if (w<=h)
70 {
71 glOrtho(-nRange,nRange,-nRange*aspect,nRange*aspect,-nRange,nRange);
72 }
73 else
74 {
75 glOrtho(-nRange,nRange,-nRange/aspect,nRange/aspect,-nRange,nRange);
76 }
77
78 }
79
80 void OnMouse(GLint button, GLint State, GLint x, GLint y)
81 {
82 if(button==GLUT_LEFT_BUTTON && State==GLUT_UP) //鼠标左键释放
83 i++;
84 if(i==8) //若i的值为8,则重回0
85 i=0;
86 glutPostRedisplay();
87 }
88
89 void SetupLights()
90 {
91 GLfloat ambientLight[]={0.2f,0.2f,0.2f,1.0f};//环境光
92 GLfloat diffuseLight[]={0.9f,0.9f,0.9f,1.0f};//漫反射
93 GLfloat specularLight[]={1.0f,1.0f,1.0f,1.0f};//镜面光
94 GLfloat lightPos[]={50.0f,80.0f,60.0f,1.0f};//光源位置
95
96 glEnable(GL_LIGHTING); //启用光照
97 glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);//设置环境光源
98 glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);//设置漫反射光源
99 glLightfv(GL_LIGHT0,GL_SPECULAR,specularLight);//设置镜面光源
100 glLightfv(GL_LIGHT0,GL_POSITION,lightPos);//设置灯光位置
101 glEnable(GL_LIGHT0); //打开第一个灯光
102
103 glEnable(GL_COLOR_MATERIAL); //启用材质的颜色跟踪
104 glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); //指定材料着色的面
105 glMaterialfv(GL_FRONT,GL_SPECULAR,specularLight); //指定材料对镜面光的反应
106 glMateriali(GL_FRONT,GL_SHININESS,100); //指定反射系数
107
108
109 }
posted on
浙公网安备 33010602011771号