好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

计算机图形学_第十三章_隐藏面的消除讲解.ppt

33页
  • 卖家[上传人]:我**
  • 文档编号:116821342
  • 上传时间:2019-11-17
  • 文档格式:PPT
  • 文档大小:359KB
  • / 33 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • Lecture 13 隐藏面的消除 概述 在生成具有真实感的景物时,要考虑的一个重要问题 是如何由选定的视向把画面的不可见部分消去,即隐藏 线及隐藏面的消除问题目前,存在解决此问题的若干 方法,并建立了若干有效的消隐算法 消隐算法及其分类 人不能一眼看到一个三维物体的全部表面从一个视 点去观察一个三维物体时,必然只能看到该物体表面上 的部分点、线、面,而其余部分则被这些可见部分遮挡 住如果观察的是若干个三维物体,则物体之间还可能 彼此遮挡而部分不可见 消隐算法及其分类 按照操作对象的不同表达,消隐算法可以分为两大类 •对象空间方法(Object Space Methods) •图像空间方法(Image Space Methods) 对象空间方法和图像空间方法 •对象空间是对象三维空间,即对象被定义时所处的坐标 空间 对象空间方法是对要显示的各个对象及对象的各个 部分进行相互比较,分析对象的三维特性之间的关系, 以确定不可见的表面或者线条的方法 •图像空间是对象投影后所在的二维空间,即设备坐标系 图像空间方法是将对象投影后分解为像素,按照一 定的规律,比较像素之间的深度(z)值,从而确定其是 否可见的方法。

      消隐算法及其分类 虽然各种消隐方法具体的实现方法不同,但这些方法中大 都采用分类及连贯两种基本方法改进算法效率 •分类方法主要用于深度比较,即按照景物中各个线、面、体 与取景平面的距离分类,以决定取舍 •连贯方法是指利用显示景物具有某些相关特性,可以用来简 化计算 消隐算法及其分类 从消隐对象角度来看,消隐算法可分为两类:线消 隐和面消隐 •线消隐的消隐对象是物体上的边,消除的是物体上不 可见的边 •面消隐的消隐对象是物体上的面,消除的是物体上不 可见的面 画家算法 画家算法是把对象空间方法与图像空间方法结合在一起来消除 隐藏面的方法 画家算法的原理: 先把屏幕置成背景色,再把物体的各个面按其离视点的远近进 行排序,离视点远者在表头,离视点近者在表尾,排序结果存在 一张深度优先级表中 然后按照从表头到表尾的顺序逐个绘制各个面由于后显示的 图形取代先显示的画面,而后显示的图形所代表的面离视点更近 ,所以由远及近的绘制各面,就相当于消除隐藏面 该算法习惯上称为画家算法或深度排序算法 多边形的画家算法 (1)以每一多边形的zmin作为排序关键码,建立初步的 深度排序表,表中第一个多边形是具有最小z值的多边形 ,记为P。

      设视点位于z轴方向的无穷远处,则P为离视点 最远的多边形,表中第二个多边形标为Q (2)检查表中每个多边形与P的关系分为3种关系: 多边形的画家算法 a. 多边形的画家算法 b. 多边形的画家算法 c.所有测试失败: 必须对两个多边形在Oxy平面上的投影作求交运算 计算时不必具体求出重叠部分,在交点处进行深度比较 ,只要能判断出前后顺序即可 深度缓冲算法 Z缓冲区(Z-Buffer)算法在这个算法里,不仅需要有 帧缓存来存放每个像素的颜色值,还需要一个深度缓存 来存放每个像素的深度值 深度缓冲算法 Z缓冲器的深度值越大,说明该点越接近视点 在把显示对象的每个面上每一点的属性(颜色或灰 度)值填入帧缓冲器相应单元前,要把这点的z坐标值和 Z缓冲器中相应单元的值进行比较只有前者大于后者时 才改变帧缓冲器的那一单元的值,同时Z缓冲器中相应单 元的值也要改成这点的z坐标值 深度缓冲算法描述 Z-Buffer算法() { 帧缓存全置为背景色 深度缓存全置为最小z值 for (每一个多边形) {扫描转换该多边形 for (该多边形所覆盖的每个像素(x,y) ) { 计算该多边形在该像素的深度值d(x,y); if (d(x,y)大于Z缓存在(x,y)的值) { 把d(x,y)存入Z缓存中(x,y)处 把多边形在(x,y)处的颜色值存入帧缓存的(x,y)处 } } } 深度缓冲算法 该算法的最大优点在于简单。

      它可轻而易举地处理隐藏面 以及显示复杂曲面之间的交线画面可以任意复杂由于画面 元素可按任意次序写入帧缓冲器和Z缓冲器,故无需按深度优 先级排序,可省去深度排序时间 扫描线算法 如果只对一条扫描线进行Z缓冲器算法,则可以得到扫描线 Z缓冲器算法 扫描线Z缓冲器算法做了两点改进 ①将整个绘图窗口内的消隐问题分解到一条条扫描线上解决, 使所需的Z缓冲器大大减少 ②计算深度值时,利用了面连贯性,只用了一个加法 区间扫描线算法 扫描线Z缓冲器中,被多个多边形覆盖的像素区处还 要进行多次计算,计算量仍然很大 区间扫描线算法克服了这一缺陷,可利用连贯性提 高算法效率,使得在一条扫描线上每个区间只计算一次 深度值,并且不需要Z缓冲器 它是把当前扫描线与各多边形在投影平面的投影的交 点进行排序后,使扫描线分为若干子区间 区间扫描线算法 可以将区间分为三类: ①区间为空 ,区间 [0, a1],此时只要按背景属性显示即可 ; ②区间中只包含一个区段即一条交线或交线的一部分 .如 图中的区间[a1, a2]和[a3, a4],此时按该区段所在多边 形的显示属性进行显示; ③区间中有多条分别属于不同多边形的区段,如图中的区 间[a2, a3],此时必须计算该区间中每个区段的深度,具 有最大z值的区段为该区间中的可见段,按此可见段所在 多边形的属性进行显示 • 区间 区间扫描线算法 算法描述 for (绘图窗口内的每一条扫描线) { 求投影与当前扫描线相交的所有多边形; 求上述多边形中投影与当前扫描线相交的所有边,将它们记录在活化边表AEL中; 求AEL中每条边的投影与扫描线的交点; 按交点的u坐标将AEL中各边从左到右排序两两配对组成一个区间; for (AEL中每个区间) { 求覆盖该区间的所有多边形,将它们记入活性多边形表APL中; 在区间上任取一点,计算APL中各多边形在该点的深度值, 记值最大者为P; 用多边形P的颜色填充该区间; } } BSP树算法 二叉空间剖分(BSP,Binary Space-Partitioning)树 算法是一种判别物体可见性的有效算法。

      它类似于画家 算法,将面片由后往前地在屏幕上绘出 构造BSP树 BSP树取场景中的一个多边形作为分割面,递归地将 空间分为两个子空间这两个子空间再分别选一个多边 形作分割面递归地子分下去,直到每个子空间只剩一个 多边形为止 BSP树遍历 BSP树可见面算法的基本思想是先将离视点最远的多 边形写入帧缓存或进行显示,即按从后到前的顺序对多 边形绘制 如果视点在根结点多边形后侧,最终的显示顺序依次 为3、2a、1、2b、5、4 区域子分算法 区域子分算法又称为Warnack算法 基本思想是:把物体投影到绘图窗口上,然后递归 分割窗口,直到窗口内目标足够简单,可以显示为止 而在显示时进行深度探索 该算法充分利用了区域的连贯性,提高了计算速度 区域子分算法 算法步骤: •初始窗口取作屏幕坐标系的矩形,将场景中的多边形投 影到窗口内如果窗口内没有物体则按背景色显示; •若窗口内只有一个面,则把该面显示出来; •否则,窗口内含有两个以上的面,则把窗口等分成4个 子窗口对每个小窗口再做上述同样的处理 光线投射算法 光线投射算法的思想是:考察由视点出发穿过观察屏幕的一个像素而 射入场景的一条射线,则可确定出场景中与该射线相交的物体 。

      在计算出光线与物体表面的交点之后,离像素最近的交点的所在面片 的颜色为该像素的颜色;如果没有交点,说明没有多边形的投影覆盖此 像素,用背景色显示它即可 算法描述 for(屏幕上的每一像素) {形成通过该屏幕像素(u,v)的射线; for (场景中的每个物体) 将射线与该物体求交; if (存在交点) 以最近的交点所属的颜色显示像素(u,v) else 以背景色显示像素(u,v); } OpenGL中的多边形的消除与消隐 在OpenGL中,多边形分为正面和反面,在使用多边形的过程中可以对多边形的两个面 进行分别操作缺省状态下OpenGL对多边形正反面是以相同的方式绘制的,要改变多 边形的绘制状态,必须调用函数glPolygonMode(),函数说明如下: glPolygonMode(GLenum face,GLenum mode) 功能:该函数控制多边形反面或正面的绘图模式 参数说明: face:指定多边形的面face可能的值是GL_FRONT、GL_BACK和 GL_FRONT_AND_BACK其中GL_GL_FRONT指定多边形的正面,GL_BACK指定多 边形的反面,GL_FRONT_AND_BACK指定多边形的正面和反面。

      mode:指定指定面的模式 OpenGL中的多边形的消除与消隐 g1FrontFace()则用来定义多边形的哪一面被视为正面: g1FrontFace(Glenum mode) 功能:指定多边形的正面 参数说明: 指定选择多边形的面 mode可以为GL_CCW或GL_CWGL_CCW是OpenGL的缺省状 态,有序顶点按逆时针方向出现的为多边形的正面GL_CW 指定所绘制的多边形的顶点按顺时针方向排列的面是多边形的 正面 OpenGL中的多边形的消除与消隐 glCullFace(Glenum mode) 功能:指出在转换成屏幕坐标之前,哪些多边形应该被消除 参数说明: mode:可以是GL_FRONT、GL_BACK和 GL_FRONT_AND_BACK从而指定正向、反向或所有的多边 形缺省状态是GL_BACK 用g1Enable(GL_CULL_FACE)启动消除多边形,用 g1Disable(GL_CULL_FACE)关闭消除多边形 OpenGL中的多边形的消除与消隐 void glClearDepth(GLclmpd depth) 功能:指定在刷新深度缓冲器时,所用的深度值也就是刷新 深度缓冲器后,深度缓冲器中为窗口中的每一个像素点设置的 深度值。

      参数说明: depth:指定刷新深度缓冲器时所用的深度值 在实际操作中,使用消隐要先启动深度测试,即调用函数: glEnable(GL_Depth_Test)取消自动实现三维场景的消隐 要调用函数:glDisable(GL_Depth_Test) OpenGL中的多边形的消除与消隐 在特殊的环境中,对深度的比较会有特殊的要求OpenGL中提供了深度比 较的控制函数 void glDepthFunc(Glenum Func) 功能:在消隐操作中设置比较函数 参数说明: 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.