OpenGL正交投影

代码:

  1 #define GLUT_DISABLE_ATEXIT_HACK
2 #include "gl/glut.h"
3
4 GLboolean Large=GL_FALSE; //坐标单位变大或变小
5 GLint Width; //视区宽度
6 GLint Height; //视区高度
7
8 void OnDisplay(void);
9 void OnReShape(int,int);
10 void OnMouse(GLint,GLint,GLint,GLint);
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 glutMouseFunc(OnMouse);
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 glRotatef(30.0f,1.0f,0.0f,0.0f);
41 glRotatef(15.0f,0.0f,1.0f,0.0f);
42
43 glColor3f(0.7f,0.5f,0.3f);
44 glutSolidTeapot(50.0f);
45
46 glutSwapBuffers();
47
48 }
49 //窗口尺寸变化后的回调函数
50 void OnReShape(int w,int h)
51 {
52 glViewport(0,0,w,h);
53 Width=w;
54 Height=h;
55 glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影模式
56 glLoadIdentity();
57
58 GLfloat aspect =(float)w/(float)h;
59
60 //设置三维投影区
61 if(!Large)
62 if (w<=h) //较小的坐标单位
63 {
64 glOrtho(-100.0f,100.0f,-100.0f/aspect,100.0f/aspect,-100.0f,100.0f);
65 }
66 else
67 {
68 glOrtho(-100.0f*aspect,100.0f*aspect,-100.0f,100.0f,-100.0f,100.0f);
69 }
70 else
71 if (w<=h) //较大的坐标单位
72 {
73 glOrtho(-60.0f,60.0f,-60.0f/aspect,60.0f/aspect,-60.0f,60.0f);
74 }
75 else
76 {
77 glOrtho(-60.0f*aspect,60.0f*aspect,-60.0f,60.0f,-60.0f,60.0f);
78 }
79
80
81
82 }
83
84 void OnMouse(GLint button,GLint state,GLint x, GLint y)
85 {
86 if(button==GLUT_LEFT_BUTTON && state==GLUT_UP) //鼠标左键释放
87 Large= !Large; //逻辑变量取反
88
89 OnReShape(Width,Height);
90 glutPostRedisplay();
91 }
92
93 void SetupLights()
94 {
95 GLfloat ambientLight[]={0.2f,0.2f,0.2f,1.0f};//环境光
96 GLfloat diffuseLight[]={0.9f,0.9f,0.9f,1.0f};//漫反射
97 GLfloat specularLight[]={1.0f,1.0f,1.0f,1.0f};//镜面光
98 GLfloat lightPos[]={50.0f,80.0f,60.0f,1.0f};//光源位置
99
100 glEnable(GL_LIGHTING); //启用光照
101 glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);//设置环境光源
102 glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);//设置漫反射光源
103 glLightfv(GL_LIGHT0,GL_SPECULAR,specularLight);//设置镜面光源
104 glLightfv(GL_LIGHT0,GL_POSITION,lightPos);//设置灯光位置
105 glEnable(GL_LIGHT0); //打开第一个灯光
106
107 glEnable(GL_COLOR_MATERIAL); //启用材质的颜色跟踪
108 glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); //指定材料着色的面
109 glMaterialfv(GL_FRONT,GL_SPECULAR,specularLight); //指定材料对镜面光的反应
110 glMateriali(GL_FRONT,GL_SHININESS,100); //指定反射系数
111
112
113 }



转载于:https://www.cnblogs.com/xiacl/archive/2012/04/07/2435739.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值