OpenGL变换观察点

效果图:

 

代码:

  1 #define GLUT_DISABLE_ATEXIT_HACK
2 #include "gl/glut.h"
3
4 typedef struct EyePoint{
5 GLfloat x;
6 GLfloat y;
7 GLfloat z;
8 } EYEPOINT;
9 EYEPOINT Eye;
10 GLint WinWidth;
11 GLint WinHeight;
12
13 void OnDisplay(void);
14 void OnReShape(int,int);
15 void OnKeyboard(int,int,int);
16 void SetupLights();
17
18 void main(int argc,char* argv[])
19 {
20 glutInit(&argc,argv);
21 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
22 glutInitWindowSize(600,480);
23 glutCreateWindow("OpenGL变换观察点");
24
25 glutReshapeFunc(OnReShape);
26 glutDisplayFunc(OnDisplay);
27 glutSpecialFunc(OnKeyboard); //设置处理特殊击键的回调函数
28
29 Eye.x=0.0f; //初始化眼睛的坐标
30 Eye.y=0.0f;
31 Eye.z=10.0f;
32
33 SetupLights();
34
35 glutMainLoop();
36 }
37
38 void OnDisplay(void)
39 {
40 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
41
42 glEnable(GL_DEPTH_TEST);
43
44 glMatrixMode(GL_MODELVIEW);
45
46 glColor3f(1.0f,0.0f,0.0f);
47 glutSolidCube(50.0f);
48
49
50 glutSwapBuffers();
51
52 }
53
54 void OnReShape(int w,int h)
55 {
56 GLfloat aspect =(GLfloat)w/(GLfloat)h;
57 GLfloat nRange=100.0f;
58
59 glViewport(0,0,w,h);
60 WinWidth=w;
61 WinHeight=h;
62
63 glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影模式
64 glLoadIdentity();
65
66 //设置三维投影区
67
68 if (w<=h)
69 {
70 glOrtho(-nRange,nRange,-nRange*aspect,nRange*aspect,-nRange,nRange);
71 }
72 else
73 {
74 glOrtho(-nRange,nRange,-nRange/aspect,nRange/aspect,-nRange,nRange);
75 }
76 gluLookAt(Eye.x, Eye.y, Eye.z, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
77
78 }
79
80 void OnKeyboard(int key,int x,int y)
81 {
82 switch(key){
83 case GLUT_KEY_LEFT:
84 Eye.x-=2.0f;
85 break;
86 case GLUT_KEY_RIGHT:
87 Eye.x+=2.0f;
88 break;
89 case GLUT_KEY_DOWN:
90 Eye.y-=2.0f;
91 break;
92 case GLUT_KEY_UP:
93 Eye.y+=2.0f;
94 break;
95 case GLUT_KEY_PAGE_DOWN:
96 Eye.z-=2.0f;
97 break;
98 case GLUT_KEY_PAGE_UP:
99 Eye.z+=2.0f;
100 }
101 OnReShape(WinWidth,WinHeight);
102 glutPostRedisplay();
103 }
104
105 void SetupLights()
106 {
107 GLfloat ambientLight[]={0.2f,0.2f,0.2f,1.0f};//环境光
108 GLfloat diffuseLight[]={0.9f,0.9f,0.9f,1.0f};//漫反射
109 GLfloat specularLight[]={1.0f,1.0f,1.0f,1.0f};//镜面光
110 GLfloat lightPos[]={50.0f,80.0f,60.0f,1.0f};//光源位置
111
112 glEnable(GL_LIGHTING); //启用光照
113 glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);//设置环境光源
114 glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);//设置漫反射光源
115 glLightfv(GL_LIGHT0,GL_SPECULAR,specularLight);//设置镜面光源
116 glLightfv(GL_LIGHT0,GL_POSITION,lightPos);//设置灯光位置
117 glEnable(GL_LIGHT0); //打开第一个灯光
118
119 glEnable(GL_COLOR_MATERIAL); //启用材质的颜色跟踪
120 glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); //指定材料着色的面
121 glMaterialfv(GL_FRONT,GL_SPECULAR,specularLight); //指定材料对镜面光的反应
122 glMateriali(GL_FRONT,GL_SHININESS,100); //指定反射系数
123
124
125 }



转载于:https://www.cnblogs.com/xiacl/archive/2012/04/02/2429643.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值