




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、gluLookAt 函数详解 void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez, GLdouble centerx,GLdouble centery,GLdouble centerz,
2、0; GLdouble upx,GLdouble upy,GLdouble upz);该函数定义一个视图矩阵,并与当前矩阵相乘。第一组eyex, eyey,eyez 相机在世界坐标的位置第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置第三组upx,upy,upz 相机向上的方向在世界坐标中的方向你把相机想象成为你自己的脑袋:第一组数据就是脑袋的位置第二组数据就是眼
3、睛看的物体的位置第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)。 cpp view plaincopy1. #include "stdafx.h" 2. #include <GL/glut.h> 3. #include <stdlib.h> 4. 5. void init(void) 6. 7. gl
4、ClearColor (0.0, 0.0, 0.0, 0.0); /背景黑色 8. 9. 10. void display(void) 11. 12. glClear (GL_COLOR_BUFFER_BIT); 13. glColor3f (1.0, 1.0, 1.0); /画
5、笔白色 14. 15. glLoadIdentity(); /加载单位矩阵 16. 17. gluLookAt(0.0,0.0,5.0, 0.0,0.0,0.0, 0.0,1.0,0.0); 18. glutWireTeapot(2); 19. glut
6、SwapBuffers(); 20. 21. 22. void reshape (int w, int h) 23. 24. glViewport (0, 0, (GLsizei) w, (GLsizei) h); 25. glMatrixMode (GL_
7、PROJECTION); 26. glLoadIdentity (); 27. gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); 28. glMatrixMode(GL_MODELVIEW); 29. glLoadIdentity();
8、60; 30. gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 31. 32. int main(int argc, char* argv) 33. 34. glutInit(&argc, argv);
9、; 35. glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 36. glutInitWindowSize (500, 500); 37. glutInitWindowPosition (100, 100); 38. glutCreateWindow
10、60;(argv0); 39. init (); 40. glutDisplayFunc(display); 41. glutReshapeFunc(reshape); 42. glutMainLoop(); 43. return 0; 44.
11、; 一、上面的display()函数中:gluLookAt(0.0,0.0,5.0, 0.0,0.0,0.0, 0.0,1.0,0.0); 相当于我们的脑袋位置在(0.0,0.0,5.0)处,眼睛望向(0.0,0.0,0.0),即原点。后面的三个参数(0.0,1.0,0.0),y轴为1,其余为0,表示脑袋朝上,就是正常的情况。看到的情况如下图:壶嘴在右,壶柄在坐,壶底在下,壶盖在上。 二、若将gluLookAt的后三个参数设置为(0.0,-1.0,0.0),即y轴为-1,其余为0。这样表示脑袋向下,即人眼倒着看,看到的效果如下图: 三、再次修改gluLookAt的
12、后三个参数为(1.0,0.0,0.0);x轴为1,其余为0.即人的脑袋像右歪90度来看,即顺时针转90度(换个角度思考就是壶逆时针转90度),猜想看到的结果应该是壶嘴在上,壶盖在右,壶底在左,壶柄在下。如下图: 如果并没有调用gluLookAt(),那么照相机就被设置为默认的位置和方向。在默认情况下,照相机位于原点,指向z轴的负方向,朝上向量为(0,1,0)。 可以修改原来的代码。把视图变换函数gluLookAt()函数,改为模型变换函数glTranslatef(),
13、并使用参数(0.0,0.0,-5.0)。这个函数的效果和使用gluLookAt()函数的效果是完全相同的,原因:gluLookAt()函数是通过移动照相机(使用试图变换)来观察这个立方体,而glTranslatef()函数是通过移动茶壶(使用模型变换)。另外注意:视图变换要在模型变换之前进行。glDepthFunc参数func:指定深度缓冲比较函数参数取值范围GL_NEVER,GL_LESS,GL_EQUAL,GL_LEQUAL,GL_GREATER,GL_NOTEQUAL,GL_GEQUAL,GL_ALWAYS,缺省值GL_LESS。GL_NEVER,不通过(输入的深度值不取代参考值)GL_
14、LESS,如果输入的深度值小于参考值,则通过GL_EQUAL,如果输入的深度值等于参考值,则通过GL_LEQUAL,如果输入的深度值小于或等于参考值,则通过GL_GREATER,如果输入的深度值大于参考值,则通过GL_NOTEQUAL,如果输入的深度值不等于参考值,则通过GL_GEQUAL,如果输入的深度值大于或等于参考值,则通过GL_ALWAYS,总是通过(输入的深度值取代参考值)glLoadIdentity()加载glLoadIdentity(),等于是将之前矩阵变换导致变化过的栈顶矩阵重新归位,置为单位矩阵!等于是之前的矩阵变换带来的影响到此为止了glBeginglEnd函数原型:voi
15、d glBegin(GLenummode)void glEnd(void)参数说明:mode:创建图元的类型。可以是以下数值(点的绘制方向决定了面的法向量逆时针为正)GL_POINTS:把每一个顶点作为一个点进行处理,顶点n即定义了点n,共绘制N个点GL_LINES:把每一个顶点作为一个独立的线段,顶点2n1和2n之间共定义了n条线段,总共绘制N/2条线段GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,总共绘制n1条线段GL_LINE_LOOP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶点相连,第n
16、和n+1个顶点定义了线段n,总共绘制n条线段GL_TRIANGLES:把每个顶点作为一个独立的三角形,顶点3n2、3n1和3n定义了第n个三角形,总共绘制N/3个三角形GL_TRIANGLE_STRIP:绘制一组相连的三角形,对于奇数n,顶点n、n+1和n+2定义了第n个三角形;对于偶数n,顶点n+1、n和n+2定义了第n个三角形,总共绘制N-2个三角形GL_TRIANGLE_FAN:绘制一组相连的三角形,三角形是由第一个顶点及其后给定的顶点确定,顶点1、n+1和n+2定义了第n个三角形,总共绘制N-2个三角形GL_QUADS:绘制由四个顶点组成的一组单独的四边形。顶点4n3、4n2、4n1和
17、4n定义了第n个四边形。总共绘制N/4个四边形GL_QUAD_STRIP:绘制一组相连的四边形。每个四边形是由一对顶点及其后给定的一对顶点共同确定的。顶点2n1、2n、2n+2和2n+1定义了第n个四边形,总共绘制N/2-1个四边形GL_POLYGON:绘制一个凸多边形。顶点1到n定义了这个多边形。用法: glBegin GL_TRIANGLES '开始绘图,绘制一个三角形 glVertex2f -0.5, -0.5 '三角形的3个顶点 glVertex2f -0.5, 0.5 glVertex2f 0.5, -0.5 glEndglClear需要清除的缓冲/函数原型glCle
18、arThe glClear function clears buffers to preset values.void glClear(GLbitfield mask);/参数Parametersmask当前可写的颜色缓冲GL_DEPTH_BUFFER_BIT 深度缓冲GL_ACCUM_BUFFER_BIT 累积缓冲GL_STENCIL_BUFFER_BIT 模板缓冲常用:glClear (GL_COLOR_BUFFER_BIT) '刷新窗口的缓冲区glTranslatefglTranslatef(0.0,-20.0,-40.0)表示将当前画图坐标系向x轴平移0,向y轴平移-20,向z
19、轴平移-40(放在画图的前面起效)glTranslatefglScaled(10.0,10.0,10.0)表示将当前画图坐标系沿x,y,z轴分别放大为原来的10倍glRotatefglRotatef(-80.0,10.0,1.0,0.0)表示将当前画图坐标系沿方向向量(-10,1,0)顺时针旋转80度。glEnable GL_DEPTH_TEST作用glEnable GL_DEPTH_TEST: 用来开启更新深度缓冲区的功能,也就是,如果通过比较后深度值发生变化了,会进行更新深度缓冲区的操作。启动它,OpenGL就可以跟踪再Z轴上的像素,这样,它只会再那个像素前方没有东西时,才会绘画这个像素。
20、在做绘画3D时,这个功能最好启动,视觉效果比较真实。glViewportglViewport(0, 0, width, height);/ 重置当前的视口glOrthoglOrtho是创建一个正交平行的视景体。 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况。比如,常用的工程中的制图等。需要比较精确的显示。 而作为它的对立情况, glFrustum则产生一个透视投影。这是一种模拟真是生活中,人们视野观测物体的真实情况。例如:观察两条平行的火车到,在过了很远之后,这两条铁轨是会相交于一处的。还有,离眼睛近的物体看起来大一些,远的物体看起来小一些。glOrtho(left, right,
21、bottom, top, near, far), left表示视景体左面的坐标,right表示右面的坐标,bottom表示下面的,top表示上面的。这个函数简单理解起来,就是一个物体摆在那里,你怎么去截取他。这里,我们先抛开glViewport函数不看。先单独理解glOrtho的功能。 假设有一个球体,半径为1,圆心在(0, 0, 0),那么,我们设定glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽高都是3的框框把这个球体整个都装了进来。 如果设定glOrtho(0.0, 1.5, -1.5, 1.5, -10, 10);就表示用一个宽是
22、1.5, 高是3的框框把整个球体的右面装进来;如果设定glOrtho(0.0, 1.5, 0.0, 1.5, -10, 10);就表示用一个宽和高都是1.5的框框把球体的右上角装了进来。上述三种情况可以见图:关于光照:如果没有环境光,未被漫射光照到的地方会变得十分黑暗。如果没有漫射光,得不到较好的阴影效果。镜面光(Specular light)则是来自于同一方向,也沿同一个方向反射。在OpenGL中,用材料对光的三原色(红绿蓝)的反射率大小来定义材料的颜色。与光源相对应,材料的颜色,也分为环境色,漫反射色和镜面反射色,由此决定该材料对应不同的光呈现出不同的反射率。由于人所看到物体的颜
23、色是光源发出的光经物体反射后进入眼睛的颜色。所以,物体的颜色是光源的环境光,漫反射光和镜面反射光与材料的环境色,漫反射色和镜面反射色的综合。例如:OpenGL 的光源色是(LR,LG,LB),材质色为(MR,MG,MB),那么,在忽略其他反射效果的情况下,最终进入眼睛的颜色是(LR*MR,LG*MG,LB*MB)。glNormal3f我们加入一个特殊的函数调用告诉OpenGL在我们场景中不同形状的标准(normal)。一个面的标准(normal)是垂直于这个面的向量(法向量)。OpenGL需要知道法向量来计算一个光源照射一个面上的角度。OpenGL不自己计算这个面的法向量的原因是提前
24、计算出会提高速度。现在还不允许我们将阴影平缓,本课后面将实现。我们在指出这个面的坐标之前调用glNormal3f(0.0f,0.0f,1.0f)告诉OpenGL这个面的法向量。注意法向量必须指向面的外面,因为如果一束光同一个物体面对的那个方向是同方向的话,那这个物体并不能照射。无论如何,对于封闭的表面就这样处理的。光线会在到达这个面之前找到表面的其他部分glMatrixMode - 指定哪一个矩阵是当前矩阵参数mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标,可选值: GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE.说明glMatrixMode设置当前矩阵模式:G
25、L_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作.GL_PROJECTION,对投影矩阵应用随后的矩阵操作.GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作.与glLoadIdentity()一同使用glLoadIdentity():将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作在glLoadIdentity()之后我们为场景设置了透视图。glMatrixMode(GL_MODELVIEW)设置当前矩阵为模型视图矩阵,模型视图矩阵储存了有关物体的信息。OpenGL函数思考-gluPerspective函数原型:
26、60; void gluPerspective(GLdouble fovy, GLdouble aspect,GLdouble zNear,GLdouble zFar)参数说明: fovy: 指定视景体的视野的角度,以度数为单位,y轴的上下方向aspect:指定你的视景体的宽高比(x 平面上)zNear: 指定观察者到视景体的最近的裁剪面的距离(必须为正数)zFar: 指定观察者到视景体的最远的裁剪面的距离(必须为正数)
27、; 如图 函数说明: gluPerspective()这个函数设置透视投影矩阵,一般在执行命令glMatrixMode(GL_PROJECTION)和glLoadidentity()之后使用;它指定了观察的视景体在世界坐标系中的具体大小,一般而言,其中的参数aspect应该与窗口的宽高比大小相同。比如说,aspect=2.0表示在观察者的角度中物体的宽度是高度的两倍,在视口中宽度也是高度的两倍,这样显示出的物体才不会被扭曲。 由gluPerspective()产生的矩阵是当前矩阵与指定的矩阵相乘得到的,就好像是调用glMatrix()产生的矩阵一样。为了使透视矩阵替代当前矩阵,在调用gluPerspective()之前要先调用glLoadidentity()这个函数(就是把当前矩阵重置为单位矩阵)。透视原理:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年白山道路运输从业人员从业资格考试
- 房产买卖未过户合同二零二五年
- 酒店经营管理委托协议范例
- 二零二五电商运营合作的协议书范例
- 种植业劳务分包合同二零二五年
- 贸易采购业务管理制度
- 陶瓷产区仓储管理制度
- 超市仓库理货管理制度
- 印务公司销售管理制度
- 保安管理制度与要求
- 五星级物业标准
- 小学劳动教育四年级下册第三单元-1《收取快递》教学设计
- 宇电温控器ai 500 501用户手册s 6中文说明书
- 城市发展史-中国矿业大学中国大学mooc课后章节答案期末考试题库2023年
- 公共实训基地信息调查报告
- 升降平台车安全操作规程
- 广东醒狮(文化创意)
- GB/T 498-2014石油产品及润滑剂分类方法和类别的确定
- 人物志学习撒迦利亚201509
- GB/T 31765-2015高密度纤维板
- 学生宿舍带班领导及值班教师巡查登记表
评论
0/150
提交评论