《OpenGL编程4.ppt》由会员分享,可在线阅读,更多相关《OpenGL编程4.ppt(37页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、OpenGL编程编程河南科技大学电信学院河南科技大学电信学院主讲:刘刚主讲:刘刚FaceOpenGL编程 Ls1Chap4 基本的三维程序设计基本的三维程序设计Chap4OpenGL编程 Ls2顶点变换OpenGL编程 Ls3Opengl的变换过程OpenGL对图形进行变换与照相机拍摄物体的过对图形进行变换与照相机拍摄物体的过程相似。程相似。分为以下四步:分为以下四步:支起三角架,把照相机放在场景中,相当于支起三角架,把照相机放在场景中,相当于OpenGL的取景变换。的取景变换。把要拍摄的场景固定在要拍摄的物体上,相当于把要拍摄的场景固定在要拍摄的物体上,相当于OpenGL的模型的模型变换。变
2、换。选择照相机镜头或调节焦距,相当于选择照相机镜头或调节焦距,相当于OpenGL的投影变换。的投影变换。确定照片的大小,可以放大照片的某一部分,相当于确定照片的大小,可以放大照片的某一部分,相当于OpenGL的的视见区变换视见区变换。OpenGL编程 Ls4相机类比OpenGL编程 Ls5相机类比OpenGL编程 Ls6投影变换就是要确定一个取景体积,其作用有两个:就是要确定一个取景体积,其作用有两个:确定物体投影到屏幕的方式,即是透视投影还是确定物体投影到屏幕的方式,即是透视投影还是正交投影。正交投影。确定从图象上裁剪掉哪些物体或物体的某些部分。确定从图象上裁剪掉哪些物体或物体的某些部分。投
3、影变换包括透视投影和正交投影(平行投影)。投影变换包括透视投影和正交投影(平行投影)。OpenGL编程 Ls7透视投影透视投影其取景体积是一个截头锥体,再这个体积内的其取景体积是一个截头锥体,再这个体积内的物体投影到锥的顶点,有物体投影到锥的顶点,有glFrustum命令定义这命令定义这个截头锥体,这个取景体积可以是不对称的。个截头锥体,这个取景体积可以是不对称的。void glFrustum(Gldouble left,Gldouble right,Gldouble bottom,Gldouble top,Gldouble near,Gldouble far);OpenGL编程 Ls8透视投
4、影示意图OpenGL编程 Ls9平行投影平行投影void glOrtho()GLdoubleGLdouble left,left,GLdoubleGLdouble right,right,GLdoubleGLdouble bottom,bottom,GLdoubleGLdouble top,top,GLdoubleGLdouble near,near,GLdoubleGLdouble far far建立一个平等投影矩阵建立一个平等投影矩阵建立一个平等投影矩阵建立一个平等投影矩阵定义一个观视体(正平行六面体)定义一个观视体(正平行六面体)定义一个观视体(正平行六面体)定义一个观视体(正平行六面体
5、)OpenGL编程 Ls10平行投影示意图OpenGL编程 Ls11视图变换和模型变换视图变换和模型变换OpenGL编程 Ls12模型变换模型变换 1 1 平移变换平移变换平移变换平移变换 OpenGL编程 Ls13模型变换模型变换1 1 平移变换平移变换平移变换平移变换glTranslatefd(typeglTranslatefd(type dxdx,type,type dydy,type,type dzdz)对象移动了相距于默认照相机的距离对象移动了相距于默认照相机的距离对象移动了相距于默认照相机的距离对象移动了相距于默认照相机的距离 dxdx 0 0 向右向右向右向右 dydy 0 0
6、向上向上向上向上 dzdz 0 0 向外向外向外向外 注意:默认照相机位置固定于原点,朝向注意:默认照相机位置固定于原点,朝向注意:默认照相机位置固定于原点,朝向注意:默认照相机位置固定于原点,朝向Z Z轴负向。轴负向。轴负向。轴负向。gluLookAt(0.0,0.0,0.0,0.0,0.0,-100.0,0.0,1.0,0.0)gluLookAt(0.0,0.0,0.0,0.0,0.0,-100.0,0.0,1.0,0.0)OpenGL编程 Ls14模型变换模型变换2 2 旋转变换旋转变换旋转变换旋转变换 OpenGL编程 Ls15模型变换模型变换2 2 旋转变换旋转变换旋转变换旋转变换g
7、lRotateglRotate fd(typefd(type angle,type angle,type dxdx,type,type dydy,type,type dzdz)以原点为固定点,对象绕轴以原点为固定点,对象绕轴以原点为固定点,对象绕轴以原点为固定点,对象绕轴OPOP旋转角度旋转角度旋转角度旋转角度angleangleO(0.0.0.0.0.0)O(0.0.0.0.0.0)P(dx,dy,dzP(dx,dy,dz)旋转方向:从旋转方向:从旋转方向:从旋转方向:从P P向向向向OO看为逆时针方向。看为逆时针方向。看为逆时针方向。看为逆时针方向。OpenGL编程 Ls16模型变换模型变
8、换3 3 缩放变换缩放变换缩放变换缩放变换 OpenGL编程 Ls17模型变换模型变换3 3缩放变换缩放变换缩放变换缩放变换glScalefd(typeglScalefd(type dxdx,type,type dydy,type,type dzdz)以原点为固定点,以原点为固定点,以原点为固定点,以原点为固定点,dxdx、dydy、dzdz为缩放因子:为缩放因子:为缩放因子:为缩放因子:缩放因子大于缩放因子大于缩放因子大于缩放因子大于1 1 放大;放大;放大;放大;缩放因子大于缩放因子大于缩放因子大于缩放因子大于0 0且小于且小于且小于且小于1 1 缩小;缩小;缩小;缩小;OpenGL编程
9、Ls18模型变换模型变换4 4 复合变换复合变换复合变换复合变换 OpenGL编程 Ls19视图变换视图变换改变视点的位置和方向,两种方法:1.使用一个或多个模型变换函数。glTranslate(0.0,0.0,-5.0)OpenGL编程 Ls20视图变换视图变换2.在任意角度进行观察。gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);默认情况下,照相机是位于原
10、点的位置,方向朝向Z轴负方向,并且直接指向y轴的正方向。确定一个矩阵,三个内容:视点,视点瞄准的点,确定一个矩阵,三个内容:视点,视点瞄准的点,确定一个矩阵,三个内容:视点,视点瞄准的点,确定一个矩阵,三个内容:视点,视点瞄准的点,upup向量向量向量向量从而确定照相机的位置和方向。从而确定照相机的位置和方向。从而确定照相机的位置和方向。从而确定照相机的位置和方向。OpenGL编程 Ls21视口变换视口变换相当于选择照片的大小。glViewport(GLint x,GLint y,GLsizei width,GLsizei height);OpenGL编程 Ls22矩阵栈及其操作矩阵栈及其操作
11、(1/8)三种矩阵栈三种矩阵栈模型观察变换矩阵栈模型观察变换矩阵栈投影变换矩阵栈投影变换矩阵栈纹理变换矩阵栈纹理变换矩阵栈矩阵栈的初始状态矩阵栈的初始状态包含一个单位矩阵包含一个单位矩阵确定当前矩阵栈确定当前矩阵栈OpenGL编程 Ls23矩阵栈及其操作矩阵栈及其操作(2/8)(2/8)清矩阵栈栈顶清矩阵栈栈顶void glLoadIdentity(void);将栈顶矩阵替换为单位矩阵将栈顶矩阵替换为单位矩阵取消之前变换的作用取消之前变换的作用IMglLoadIdentity()OpenGL编程 Ls24矩阵栈及其操作(矩阵栈及其操作(3/83/8)压栈压栈void glPushMatrix(
12、void);复制栈顶矩阵并压入栈复制栈顶矩阵并压入栈记住位置记住位置MMglPushMatrix()M坐标系1坐标系2坐标系1坐标系2坐标系3OpenGL编程 Ls25矩阵栈及其操作矩阵栈及其操作(4/8)(4/8)出栈出栈void glPopMatrix(void);弹出栈顶矩阵弹出栈顶矩阵回到记住的位置回到记住的位置M1glPopMatrix()M1M2坐标系1坐标系2坐标系3坐标系1坐标系2OpenGL编程 Ls26矩阵栈及其操作(矩阵栈及其操作(5/85/8)设置栈顶矩阵设置栈顶矩阵void glLoadMatrix(const TYPE*matrix);将栈顶矩阵替换为将栈顶矩阵替换
13、为matrix实现任意变换实现任意变换M2M1glLoadMatrix(M2)OpenGL编程 Ls27矩阵栈及其操作(矩阵栈及其操作(6/86/8)矩阵相乘矩阵相乘void glMultiMatrixfd(const TYPE*matrix);以矩阵以矩阵matrix右乘栈顶矩阵并替换栈顶矩阵右乘栈顶矩阵并替换栈顶矩阵实现任意变换实现任意变换M1*M2M1glMultiMatrix(M2)OpenGL编程 Ls28矩阵栈及其操作(矩阵栈及其操作(7/87/8)基本几何变换的作用基本几何变换的作用平移变换平移变换放缩变换放缩变换M*TglTranslatefd()MM*SglScalefd()
14、MOpenGL编程 Ls29矩阵栈及其操作矩阵栈及其操作旋转变换旋转变换M*RglRotatefd()MOpenGL编程 Ls30组合变换组合变换代码片段:glMatrixMode(MODEL_VIEW);glLoadIdentity();glTranslatef(0.1,0.1,0.1);TglRotatef(angle,0,1,0);RglScalef(0.5,0.5,0.5);SglutWireCube(1);OpenGL编程 Ls31模型视图矩阵堆栈的变化情况模型视图矩阵堆栈的变化情况II*TI*T*RI*T*R*SI*T*R*S*v说明:变换的实际执行次序与代码书写的顺序相反。说明:
15、变换的实际执行次序与代码书写的顺序相反。OpenGL编程 Ls32 组合变换举例组合变换举例-太阳系模型太阳和行星的绘制函数太阳和行星的绘制函数 glutWireSphere();glRotate()函数实现行星绕太阳的公转和自转;函数实现行星绕太阳的公转和自转;投影变换投影变换 glFrustum();视图变换视图变换 gluLookAt()或或glTranslate();模型变换的次序:模型变换的次序:确定行星一天中的位置确定行星一天中的位置-确定一年中的位置确定一年中的位置OpenGL编程 Ls33组合变换举例组合变换举例-太阳系模型初始的行星球体各个顶点初始的行星球体各个顶点绕绕Y轴旋
16、转轴旋转day度度(R1)平移到平移到X轴轴正向的某一位置正向的某一位置(T)绕绕Y轴旋转轴旋转year度度(R2)以坐标原点为圆以坐标原点为圆心绘制太阳球体心绘制太阳球体I*R2*T*R1*vMODELVIEW矩阵堆栈矩阵堆栈OpenGL编程 Ls34三维图形的变换流程三维图形的变换流程模型变换模型变换观察变换观察变换投影变换投影变换窗口至视窗口至视区的变换区的变换屏幕显示屏幕显示顶点顶点OpenGL编程 Ls35深度缓存深度缓存 glutInitDisplayModeglutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|(GLUT_SINGLE|GLUT_RGB
17、|GLUT_DEPTHGLUT_DEPTH););初始化时请求一个深度缓存初始化时请求一个深度缓存初始化时请求一个深度缓存初始化时请求一个深度缓存 glEnable(GL_DEPTH_TESTglEnable(GL_DEPTH_TEST););启用深度缓存启用深度缓存启用深度缓存启用深度缓存glClear(GL_COLOR_BUFFER_BITglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BITGL_DEPTH_BUFFER_BIT););清空深度缓存清空深度缓存清空深度缓存清空深度缓存分析运行:分析运行:分析运行:分析运行:Depth.cDepth.c 存储了每个象素的深度值,深度是空间点离视点的距存储了每个象素的深度值,深度是空间点离视点的距离,启动深度缓存后,深度值大的点会被小的点所覆离,启动深度缓存后,深度值大的点会被小的点所覆盖。盖。OpenGL编程 Ls36End谢谢!谢谢!OpenGL编程 Ls37