OpenGL3基本图形绘制.ppt

上传人:sh****n 文档编号:6392323 上传时间:2020-02-24 格式:PPT 页数:53 大小:421KB
返回 下载 相关 举报
OpenGL3基本图形绘制.ppt_第1页
第1页 / 共53页
OpenGL3基本图形绘制.ppt_第2页
第2页 / 共53页
OpenGL3基本图形绘制.ppt_第3页
第3页 / 共53页
点击查看更多>>
资源描述
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 为向上向量的方向 模型变换 平移变换放缩变换旋转变换 viodglTranslate fd TYPEdeltax TYPEdeltay TYPEdeltaz voidglScale fd TYPEsx TYPEsy TYPEsz voidglRotate fd 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 矩阵相乘 voidglMultiMatrix fd 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个4 4的矩阵 初始状态 最顶层的矩阵为单位阵 用户可以通过函数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 GLenumface GLenummode 参数face用于指定多边形的哪一个面受到模式改变的影响 GL FRONT GL BACK或GL FRONT AND BACK 参数mode用于指定新的绘图模式 GL FILL是默认值 生成填充的多边形 GL LINE生成多边形的轮廓 而GL POINT只画出顶点 50 利用函数glCullFace 选择剔除正面或背面多边形 在这之前需利用glEnable 激活剔除处理 voidglCullFace GLenummode mode的取值分别为 GL FRONT 剔除正面GL BACK 剔除背面 缺省值 GL FRONT AND BACK 剔除全部利用下面函数激活或去激活多边形剔除 glEnable GL CULL FACE glDisable GL CULL FACE 剔除多边形的面 多边形面的属性 多边形面的填充多边形面既可以用纯色填充 也可以用32 32的模板位图来填充 voidglPolygonStipple constGLubyte mask glEnable GL POLYGON STIPPLE 52 多边形面的属性 多边形面的法向量法向量是垂直于面的方向上点的向量 它确定了几何对象在空间中的方向 在OpenGL中 可以为每个顶点指定法向量 voidglNormal3 bsidf TYPEnx TYPEny TYPEnz voidglNormal3 bsidf v constTYPE v 53
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!