OpenGL3基本图形绘制.ppt_第1页
OpenGL3基本图形绘制.ppt_第2页
OpenGL3基本图形绘制.ppt_第3页
OpenGL3基本图形绘制.ppt_第4页
OpenGL3基本图形绘制.ppt_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,第3章,OpenGL基本图形绘制,3.1OpenGL的数据类型,3.1OpenGL的数据类型,所有的数据类型都以GL开头,表示是OpenGL。紧跟在后面的大多是它们相应的C数据类型。一些开始有个u表示是无符号的数据类型,如:ubyte表示是无符号的字节。也给出了更多的描述名字的方法,如:size表示一个值的长度。GLsizei表示是一个GL变量,且参数的大小是一个整型。Clamp是用于颜色的。这种数据类型以f和d结尾表示实型或双精度型数据类型。GLboolean变量用于标示True和False;GLenum用于枚举型变量;GLbitfield用于包含二进制位的区域的变量。,3.2函数命名的语法,OpenGL函数都遵循一个命名约定,即采用以下格式:函数glColor3f(1.0,0,0),gl表示这个函数来自库gl.h,color表示该函数用于颜色设定,3f表示这个函数采用了三个浮点数参数。GLfloatcolor=1.0,0,0;glColor3fv(color);,函数格式示例:定义点函数,3.2函数命名的语法,3.3OpenGL是一种状态机,OpenGL的工作方式是一种状态机制,它可以进行各种状态或模式设置,这些状态或模式在重新改变它们之前一直有效。状态变量可以通过glEnable()、glDisable()这两个函数来设置成有效或无效状态。另外可以用下列四个函数来获取某个状态变量的值:glGetBooleanv()、glGetDoublev()、glGetFloatv()和glGetIntegerv()。,3.4OpenGL变换,OpenGL就是实现将物体的各个顶点通过各种变换矩阵的作用映射到屏幕的过程。下图是顶点变换过程。注意:在模型视图变换过程中,顶点的法向量也自动地进行变换。,3.4OpenGL变换,视点变换(视图变换)模型变换投影变换视口变换裁剪变换,OpenGL的变换过程,OpenGL的坐标变换过程类似于用照相机拍摄照片的过程。使用照相机与坐标变换的步骤比较如下:。分为以下四步:支起三角架,把照相机放在场景中(视图变换)。将要拍的场景置于所要求的位置上(模型变换)。选择照相机镜头或调节焦距(投影变换)。确定照片的大小,可以放大照片的某一部分(视口变换)。其中(1)、(2)顺序可看成照相馆中的照相过程;而在室外摄影时,由于先有景物,再选择照相机的位置与方向,因此照相顺序可看成(2)、(1)。,模型-视图变换,模型-视图变换过程就是一个将顶点坐标从世界坐标变换到视觉坐标的过程。这里很重要的是对两个坐标系的认识。世界坐标系也称为全局坐标系。它是一个右手坐标系,可以认为该坐标系是固定不变的,在初始态下,其x轴为沿屏幕水平向右,y轴为沿屏幕垂直向上,z轴则为垂直屏幕面向外指向用户。视觉坐标系(即观察坐标系)也称为局部坐标系。它是一个左手坐标系,该坐标系是可以活动的。在初始态下,其原点及x、y轴分别与世界坐标系的原点及x、y轴重合,而z轴则正好相反,即为垂直屏幕面向内。默认:视点在原点,视线沿Z轴负方向。,坐标系,右手坐标系,缺省的观察坐标系,视点变换,View变换可以改变视点的位置和方向,要在Model变换之前调用。设置任意观察坐标点。,voidgluLookAt(GLdoubleeyex,GLdoubleeyey,GLdoubleeyez,Gldoublecenterx,GLdoublecentery,GLdoublecenterz,Gldoubleupx,GLdoubleupy,GLdoubleupz);(eyex,eyey,eyez)为视点位置(centerx,centery,centerz)为观察参考点的位置(upx,upy,upz)为向上向量的方向,模型变换,平移变换放缩变换旋转变换,viodglTranslatefd(TYPEdeltax,TYPEdeltay,TYPEdeltaz);,voidglScalefd(TYPEsx,TYPEsy,TYPEsz);,voidglRotatefd(TYPEangle,TYPEx,TYPEy,TYPEz);,(x,y,z),o,逆时针为旋转正向,投影变换,就是要确定一个视景体,其作用有两个:确定物体投影到屏幕的方式,即是透视投影还是正交投影。确定从图象上裁剪掉哪些物体或物体的某些部分。投影变换包括透视投影和正交投影(平行投影),透视投影,其视景体是一个截头锥体,再这个体积内的物体投影到锥的顶点,有glFrustum命令定义这个截头锥体,这个取景体积可以是不对称的voidglFrustum(Gldoubleleft,Gldoubleright,Gldoublebottom,Gldoubletop,Gldoublenear,Gldoublefar);,透视投影的示意图,透视投影:“近大远小”,类似与人眼的视觉机制,透视投影,voidgluPerspective(GLdoublefovy,GLdoubleaspect,GLdoublenear,GLdoublefar);,w,坐标原点,h,aspect=w/h,near,far,fovy,正交投影,其视景体是一个各面均为矩形的六面体,用glOrtho命令创建正交平行的取景体积voidglOrtho(Gldoubleleft,Gldoubleright,Gldoublebottom,Gldoubletop,Gldoublenear,Gldoublefar);,正交投影的示意图,正交投影,对于二维图形向二维屏幕的投影,则应使用实用库中的如下函数:voidgluOrtho2D(Gldoubleleft,Gldoubleright,Gldoublebottom,Gldoubletop);前面提到过,用二维顶点命令绘制的二维物体的z坐标均为零,而gluOrtho2D()命令假定场景中的z坐标介于-1.0和1.0之间。,视口变换,voidglViewport(GLintx,GLinty,GLintwidth,GLintheight);(x,y):视区左下角位置width,height:视区的宽和高,三维图形的变换流程,视图变换,模型变换,投影变换,窗口至视区的变换,OpenGL中的多种变换(几何变换、投影变换等)是由矩阵的乘积实现的。OpenGL提供了一系列矩阵操作函数。(1)确定当前矩阵栈,voidglMatrixMode(Glenummode);参数取值:GL_MODELVIEW:模型视图矩阵GL_PROJECTION:投影矩阵GL_TEXTURE:纹理矩阵默认的选定矩阵为模型-视图变换。,矩阵栈及其操作(1/8),矩阵栈及其操作(2/8),清矩阵栈栈顶,voidglLoadIdentity(void);将栈顶矩阵替换为单位矩阵取消之前变换的作用,glLoadIdentity(),矩阵栈及其操作(3/8),压栈,voidglPushMatrix(void);复制栈顶矩阵并压入栈记住位置,坐标系1,坐标系2,坐标系1,坐标系2,坐标系3,矩阵栈及其操作(4/8),出栈,voidglPopMatrix(void);弹出栈顶矩阵回到记住的位置,坐标系1,坐标系2,坐标系3,坐标系1,坐标系2,矩阵栈及其操作(5/8),设置栈顶矩阵,voidglLoadMatrix(constTYPE*matrix);将栈顶矩阵替换为matrix实现任意变换,glLoadMatrix(M2),矩阵栈及其操作(6/8),矩阵相乘,voidglMultiMatrixfd(constTYPE*matrix);以矩阵matrix右乘栈顶矩阵并替换栈顶矩阵实现任意变换,M1*M2,glMultiMatrix(M2),矩阵栈及其操作(7/8),基本几何变换的作用平移变换放缩变换,矩阵栈及其操作(8/8),旋转变换,变换的顺序:glMatrixMode(GL_MODELVIEW);glLoadIdentity();glMultMatrixf(N);/*applytransformationN*/glMultMatrixf(M);/*applytransformationM*/glMultMatrixf(L);/*applytransformationL*/glBegin(GL_POINTS);glVertex3f(v);/*drawtransformedvertexv*/glEnd();在这个过程中,在GL_MODELVIEW状态下,相继引入了I(单位阵),N,M,L矩阵。变换后的顶点为NMLv(顶点取列向量)。因此,顶点的变换为N(M(Lv),即是先作变换L,然后是变换M,最后才是N。这里,顶点v的实际变换顺序正好与指定的顺序相反。,在调用投影变换命令前必须先在程序中加入下述语句:glMatrixMode(GL_PROJECTION);glLoadIdentity();这两条命令一方面指定接下来的变换命令只影响投影矩阵,同时也将当前投影矩阵设置为单位阵。,矩阵ModelView矩阵:描述了物体的旋转、平移、缩放等变换Projection矩阵:描述了从三维空间到二维屏幕的变换,OpenGL中的ModelView变换机制,OpenGL中的ModelView变换机制,ModelView矩阵保存着视点变换和模型变换矩阵的累积乘积,每一次的视点变换或模型变换矩阵与当前的ModelView矩阵相乘就生成一个新的ModelView矩阵。ModelView矩阵堆栈至少包含32个44的矩阵,初始状态,最顶层的矩阵为单位阵。用户可以通过函数glGetIntegerv()得到系统所允许的最大矩阵数目:glGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH);,OpenGL中的ModelView变换机制,Projection矩阵保存着描述视景体的投影变换矩阵。一般情况下,Projection矩阵不需要复合,因此在进行投影前需要调用函数glLoadIdentity()。用户可以通过函数glGetIntegerv()得到系统所允许的最大矩阵数目:glGetIntegerv(GL_MAX_PROJECTION_STACK_DEPTH);,矩阵堆栈用于保存和恢复矩阵的状态,OpenGL提供了函数glPushMatrix()和glPopMatrix()进行堆栈操作。优势:可以保存指定的矩阵状态,并在需要时进行恢复,从而避免通过逆变换进行状态恢复时带来的大量的矩阵运算,提高了绘图的效率。,OpenGL中的ModelView变换机制,OpenGL中的ModelView变换机制,ModelView变换:Model变换、View变换Model变换可以改变物体的位置和尺寸,相当于几何变换。View变换改变相机的位置和观察方向,相当于坐标变换。由于两者的等价性,OpenGL中Model变换和View变换用同一个矩阵表示:ModelView矩阵。,3.5OpenGL基本图形的绘制,OpenGL提供了描述点、线、多边形的绘制机制。它们通过glBegin()函数和glEnd()函数配对来完成。voidglBegin(Glenummode);mode取值见下表。glEnd()函数标志着形状的结束,该函数没有参数。,OpenGL基本图形的绘制,点的绘制,点的绘制glBegin(GL_POINTS);glVertex3f(0.0f,0.0f,0.0f);glVertex3f(10.0f,0.0f,0.0f);glEnd();点的属性(大小)voidglPointSize(GLfloatsize);,(a)GL_LINES画线模式(b)GL_LINE_STRIP画线模式(c)GL_LINE_LOOP画线模式,直线的绘制,直线的绘制模式GL_LINESGL_LINE_STRIPGL_LINE_LOOP,直线的绘制,直线的属性线宽voidglLineWidth(GLfloatwidth)线型glEnable(GL_LINE_STIPPLE);glLineStipple(GLintfactor,GLushortpattern);,直线的绘制,pattern是一个16位值,每一位代表线段的一部分是开还是关。默认情况下,每一位对应一个象素,但factor参数充当倍数可以增加模式的宽度。在应用模式时,pattern是逆向使用的,即模式的最低有效位最先作用于指点线段。,多边形面的绘制,三角形面的绘制GL_TRIANGLESGL_TRIANGLE_STRIPGL_TRIANGLE_FAN四边形面的绘制GL_QUADSGL_QUADS_STRIP多边形面的绘制(GL_POLYGON),多边形面的绘制,多边形面的绘制规则所有多边形都必须是平面的。多边形的边缘决不能相交,而且多边形必须是凸的。解决:对于非凸多边形,可以把它分割成几个凸多边形(通常是三角形),再将它绘制出来。,多边形面的绘制,问题:轮廓图形状态会看到组成大表面的所有小三角形。处理OpenGL提供了一个特殊标记来处理这些边缘,称为边缘标记。glEdgeFlag(True)glEdgeFlag(False),47,多边形面的属性,多边形面的正反属性(绕法)对于三维多边形,OpenGL认为多边形是由正面和反面组成。在绘制时,需要控制反转多边形面和剔除不绘制的面。缺省时,在屏幕上以逆时针方向出现顶点的多边形称为正面,反之为背面。设置正反面的函数voidglFrontFace(Glenummode);mode的取值GL_CW(顺时针方向为正面)、GL_CCW(逆时针方向为正面,缺省值),多边形面的属性,多边形面的颜色glShadeModel(GL_FLAT)用指定多边形最后一个顶点时的当前颜色作为填充多边形的纯色,唯一例外是GL_POLYGON图元,它采用的是第一个顶点的颜色。glShadeModel(GL_SMOOTH)从各个顶点给三角形投上光滑的阴影,为各个顶点指定的颜色之间进行插值。,多边形面的属性,多边形面的显示模式glPolygonMode

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论