280 likes | 482 Views
第 9 章 可见面判别算法. 可见面判别算法. 遮挡关系 物体自身 景物之间 消隐算法分类 物空间 物体的各个面,判别可见性 象空间 投影平面上各象素比较 效率. 后向判别算法(凸多面体). 内外测试法 平面方程: F(x,y,z)=Ax+By+Cz+D, 点 (x,y,z) 使 Ax+By+Cz+D<0( 顶点顺序右手螺旋) 则 该点在多边形面的后面。“内侧” 对凹多面体不适用. 后向面判别法的局限性(凹多面体).
E N D
可见面判别算法 • 遮挡关系 • 物体自身 • 景物之间 • 消隐算法分类 • 物空间 物体的各个面,判别可见性 • 象空间 投影平面上各象素比较 • 效率
后向判别算法(凸多面体) • 内外测试法 • 平面方程:F(x,y,z)=Ax+By+Cz+D, 点(x,y,z)使Ax+By+Cz+D<0(顶点顺序右手螺旋) 则 该点在多边形面的后面。“内侧” • 对凹多面体不适用
后向面判别法的局限性(凹多面体) C A E D B F G H
深度缓冲器算法 Z-buffer method 深度缓冲器 存储当前显示点深度值 刷新缓冲器 存储当前显示点光强 ①初始化所有单元使 depthBuffer(x,y)=最大值(最远深度) frameBuffer(x,y)=I背景 ②对每一多边形计算每一点的深度与光强 如 z<depthBuffer (x,y) 则 depthBuffer (x,y)=z, frameBuffer(x,y)=I(x,y) 所有多边形处理完毕,按frameBuffer(x,y)中的I(x,y)着色。 算法结束。 ·各多边形以任意次序处理 ·同一多边形可用扫描线法 • 缺点:较大的内存需求。 • 改进:扫描线算法
A缓冲区算法Accumulation-Buffer • Z-buffer算法无法处理表面光强的累计问题(透明) 对多边形每一个像素信息: • 深度域 • 强度域 • 透明度 • 其他参数 链表结构
强度域数据 • A-buffer算法 • 对多边形 按y排序, 对每根扫描线上x,按z排序, • 对每个象素 由前到后,若多边形不透明,着此处象素光强值; 若多边形透明,计算下一个多边形累计光强值,直到 背景色 • 反走样技术
扫描线算法scan-line method 原理:一条扫描线对应的各面片间使用深度缓冲器算法 • 数据准备:一行的深度缓冲器 • 边表--多边形号,Ymax,Xc,1/m,交点X值,多边形指针 • 多边形表--表面方程 A,B,C,D,表面光强度,边表指针 ,标识,标志位(on,off)
······ 多边形号 Ymax Xc 1/m • 从最低扫描线开始,建立活化边表 按x升序排序 处理 • 从最左的边,X交点处,S1-on,当遇到另一条边时, S1-off,到达下一条边时,S2-on,离开时 off; • 如果某象素只有一个多边形on,则强度值计入; • 如果某象素加入一个多边形,累计其光强度值,前面任一个多边形off,不再计算它的作用(光强) • 删除多边形中到达另一端的边,更新活化边表 (参考多边形填充算法)
深度排序算法(画家算法)depth-sorting method • 按表面深度zmin排序;(每个面计算: zmin 、zmax) • 由深度最大的表面开始,与每个表面进行比较,若深度无重叠,进行扫描转换。(Z方向无重叠图13.12) • 对深度有重叠的表面进行以下测试,若其中一项成立,无需进行重新比较:(顺序进行)
分别检查x,y方向的重叠,只要 某方向无重叠,两表面无遮挡; 图13.13 ,z方向重叠,x方向不重叠 2. 图13.14 内外测试法,成功 • 图13.15,2不成功,3成功 • 图13.16
1-4都不成立,调换S,S’,图13.17 • 仍不成功 • 调换S,S” • 若S’,S”有遮挡,调换S’,S” • 解决循环遮挡问题
BSP树算法Binary Space-patitioning • 以多边形作为分割面, 将场景划分为两个子空间(以视点和分割平面的内外侧判定) • 遇多边形将其分为两部分,归入相应的子空间,建立BSP树 • 继续分割,直到每个子空间只有一个多边形 • 遍历BSP树(右序),以画家算法对各表面着色
区域细分算法 Warnock 算法area-subdivision method • 原理 将观察平面区域细分,直至此区域:只有一个表面、或不含表面、只有一个像素(10次)。 • 多边形表面与区域相互关系 • ①包围面片 • ②重迭面片 • ③内含面片 • ④分离面片 ②重叠面片 ③内含面片 ④分离面片 ①包围面片
以下条件之一成立,无须进行分割 • 所有多边形均为它的分离面片④ • 在区域内只有一个①包围面片②重迭面片③内含面片 • 有几个多边形属前三种但最前一个是第①种 • 其它 再分割后判断 • 分割的终止 • 出现前三种情况之一 • 子区域仅一象素 按中心取最前多边形 • 测试1 用包围盒方法(分离 ④) • 测试2 用包围盒方法判断内含表面③ 若包围盒与区域边界有交点, 还需判断是否为①② ④ 若是,光强计入Buffer • 测试3.按Z排序,确定遮挡关系(如图) • 建立四叉树 测试3测试4个角点的深度 ·
八叉树算法 • 由前往后将八叉树结点映射到观察面 • 按0,1,2 … 5,6,7顺序处理八叉树节点; 6 5 4 1 0 2 7 3 • 透明时 观察方向 0----0,4 1----1,5 2----2,6 3----3,7 下页
0 1 2 3 观察平面四分面 • 深度优先遍历:对于某层结点按,0,1,2,3,…… 检查对应结点未着色,着色 • 四叉可见区域映射算法
光线投射算法ray casting • 考查由视点出发穿过观察平面上一象素进入场景的射线到达最近物体为止 • 深度缓冲器算法的一种变形 • 光线跟踪算法的特例 象素
曲面的消隐 • 用光线投射算法 ,八叉树算法 • 曲面的多边形网格逼进 • 曲面表示 隐式 f(x,y,z)=0 参数方程 Bézier曲面 B-样条曲面等 • 曲面的层位面显示: x,z平面上的高度函数 y=f(x,z) • 对于Z的取值范围,设定△z,Zmin<=Zi<=Zmax i=0.1,…n ,从Z的最大值开始生成n+1条曲线 • 对Zi,,对x的取值范围Xmin<=X<=Xmax ,计算y=f(x, Zi),生成一组曲线 • 判定可见性: • 首先建一张表,保存x像素的ymin与ymax坐标,初值为y最大值与最小值 • 若ymin≤y≤ymax,则该点不可见,否则,可见。重置ymin,ymax
Y X Z
曲面的消隐的实现 • 消隐 设显示器水平方向(X)有M个象素,竖直方向有N个象素 建立 YMIN[1..m], YMAX[1..m] 初值 YMIN[I]=maxY, YMAX[I]=minY 由近及远,对每个zi, Xmin<=X<=Xmax求Y=f(x,zi) (顺序) • 如 y<YMIN[x] 则 YMIN[x]=y 且显示该点 • 如 y>YMAX[x] 则 YMAX[x]=y 且显示该点 • 一条曲线完成,绘制另一条曲线,完成一组曲线 • 一组曲线完成,可绘出另一组与前一组正交的曲线。 对x的取值范围,设定△x,Xmin<=Xi<=Xmax i=0.1,…n, 生成另一组正交的曲线
曲面扫描线算法 • 层位线算法 • 层位线算法 • xy平面网格上一组离散的z值,可以用层位线算法得到层位线路径。 • 每条层位线投影到观察平面显示。
线框可见性算法 • 对线框模型,仅对边界与表面进行可见性测试 • 显示方法: ⑴不可见 ⑵用不同线型不同颜色 如:虚线、浅颜色 算法: ⑴完全消隐 线段投影与平面投影交点间的线段,若深度都大于表面交点的深度,此线段不可见 ⑵交点处 一个交点处有较大的深度,另一端有较小的深度,此时直线与平面必相交,计算交点,将直线分成两段,继续测试 • 某些算法适合线消隐 • 后向面判别算法 • 深度排序算法 • 区域细分算法
可见性判别函数 后向面判别算法 Z-buffer算法