480 likes | 640 Views
第八章 隐藏线和隐藏面的消除. 可见面判断的有效技术. 多面体隐藏线消除算法. 基于窗口的子分算法. 隐藏线和隐藏面的消除. 基于多边形的子分算法. z 缓冲器算法和扫描线算法. 优先级排序表算法. 光线投射算法. 曲面隐藏线的消除. 消隐的效果图. 隐藏线或 隐藏面消除. 相对于投影方向 平行投影. 相对于投影中心 透视投影. 确定线或 面可见 性. 在和投影点到像素连线相交的表面中,找到离观察点最近的表面; 用该表面上交点处的颜色填充该像素;. 判定场景中的所有可见表面; 用可见表面的颜色填充相应的像素以构成图形;. 两种基本算法.
E N D
可见面判断的有效技术 多面体隐藏线消除算法 基于窗口的子分算法 隐藏线和隐藏面的消除 基于多边形的子分算法 z缓冲器算法和扫描线算法 优先级排序表算法 光线投射算法 曲面隐藏线的消除
隐藏线或 隐藏面消除 相对于投影方向 平行投影 相对于投影中心 透视投影 确定线或 面可见性
在和投影点到像素连线相交的表面中,找到离观察点最近的表面;在和投影点到像素连线相交的表面中,找到离观察点最近的表面; 用该表面上交点处的颜色填充该像素; 判定场景中的所有可见表面; 用可见表面的颜色填充相应的像素以构成图形; 两种基本算法 以三维场景中的物体对象为处理单元,在所有对象之间进行比较,除去完全不可见的物体和物体上不可见的部分 以构成图像的每一个像素为处理单元,对场景中的所有表面,确定相对于观察点是可见的表面,用该表面的颜色填充该像素
后向面消除 非垂直投影转换成垂直投影 边界盒 8.1 可见面判断的有效技术 场景有N个面,所有的面两两求交判定可见面,O(N2) 减少可见线和可见面判定 计算量的常用的技术
边的边界盒 Q1Q2边界盒 Q5Q6的边界盒 8.1.1 边界盒
后向面总是看不见的,而且别的棱也不会由于后向面的遮挡而成为不可见,因此,把后向面全部去掉并不影响消隐结果后向面总是看不见的,而且别的棱也不会由于后向面的遮挡而成为不可见,因此,把后向面全部去掉并不影响消隐结果 IJFGH,FABG,HCDI和IDEJ 前向面 其余为后相面 8.1.2 后向面消除 后向面 表面的法向指向与观察者相背离 多边形表面 前向面 外法线方向指向观察者
8.1.2 后向面消除 多边形F 沿着顶点序列 走时,其内部 始终在他的右侧 若构成凸的多边形 是F内法线方向 顶点 ,顶点的坐标 前向面 大于零,外法线和 z轴正向的夹角大于90度,后向面 后向面
BC,BA,BG,EA为隐藏线 8.2 多面体隐藏线消除算法 用线框方式来表示多面体,在这种表示方式下,多面体用棱边来表示 隐藏线便是不可见的棱边或棱边中不可见的部分 多面体的各棱边投影到oxy 平面上 找到各棱边上可见和不可见部分的分界点 在oxy平面上求棱边和棱边之间的交点 单击看例子
A的每个多边形G,要从B中找出可能遮挡它的所有多边形的集合CA的每个多边形G,要从B中找出可能遮挡它的所有多边形的集合C 对多边形G的每一条边L,从集合C中找出可能遮挡它的所有多边形E 求L和多边形E中的边的交点,确定L的可见部分 确定可能遮挡体A的那些体集合B (包括体A本身)。 8.2.1 算法的基本思想 • 隐藏线消除实际计算过程 : Step3 Step2 Step4 Step1
Step4的处理技术: • 设边L的两端点是vi和vj,对边L 和每一个可能遮挡它的多边形E,都要做下列计算和判断以确定其隐藏关系。 • (1) 边L的两端点都在E所在平面靠近观察者的一侧,则E不能遮挡直线 • (2) vi和vj中至少有一个不在E所在平面靠 近观察者的一侧,且边L 和E在oxy平面的 投影相交,求出其交点。对每一个交点还 要判断它在L上的对应点是在多边形E的前 面还是后面,只保留在多边形后面的交点。 • (3) L和多边形E在oxy平面的投影之间没 有交点,这时要判断点vi或vj在oxy平 面上的投影是否在E的投影的内部,若是, 则边整个被E所遮挡 • 边v1v2和多边形ABCD在Oxy平面上的投影虽然有交点Q,但它在v1v2上的对应点v却在多边形的前方,这种交点可不考虑
8.2.2 确定边L和多边形E关系的技术 1. 确定L的顶点与遮挡多边形的前后位置关系 任意取多边形E不在一条直线上的三个顶点,设为 记向量 ,则多边形E所在的平面方程为 (8.5) 设点的坐标为若 ,则在多边形所在平 面的前面,否则认为在多边形所在平面的后面。
2. 确定L与遮挡多边形的交点和遮挡多边形的前后位置关系 • 判断边vivj和多边形E在oxy平面的投影之间是否有交点,可通过求边vivj和E的边界在oxy平面上投影是否相交实现 • 在 vivj平面的投影线段的参数方程为(8.6) • 多边形上任一边vkvk+1在oxy平面上的投影为(8.7) • 联立(8.6)和(8.7),解方程得 边和线段vivj在oxy平面上的投影才有交点 上对应的交点在多边形所在平面的前面,否则在后面。
当 时, 由多边形外进入多 边形内(该交点称为进点) 当 时, 由多边形内离开多边形到多边形外(该交点称为出点)。 QiQj进入或走出多边形 3. 确定交点和多边形的关系:是进点还是出点 • 由式(8.9)可知,其中表示向量在z轴上的投影。 满足右手系
4. 确定点和多边形的关系 • 判断点在多边形内或外,可以从点出发沿x轴的正向作一条射线 • 若该射线和多边形边界的交点个数是奇数,则在多边形内 • 若该射线和多边形边界的交点个数是偶数,就在多边形外 • 由于舍入误差,可得到完全不同的结果 无交点 把 代入 的方程 奇交点 得 若 说明 单处理 有一个交点。 偶交点
1 2 确定边 与遮挡多边形各交点处的不可见阶。 交点为进点则 不可见阶加1, 交点为出点则 不可见阶减1 确定边起始顶点处的不可见阶。将阶置为覆盖该点的多边形的个数。 8.2.3 确定L的可见部分 • 不可见阶 • 它是一个数字,代表了边上从该点到下一个交点的部分被几个多边形遮挡 与所有多边形的交点进行由小到大的顺序排序 不可见阶的确定 原则:若 处不可见阶为0,则由参数 和 所对应的直线段是可见的,否则为不可见
8.3 基于窗口的子分算法 多边形与窗口的关系:
8.3 基于窗口的子分算法 所有多边形均和窗口分离,这时 只要把窗口内所有的像素填上背景色 只有一个多边形和窗口相交,或这个 多边形包含在窗口内。这时,先对窗 口内每一像素填上背景颜色,再对窗 口内多边形部分用扫描线算法填色 不成立的窗口将再一分为四 窗口分割的结束条件 只有一个包围窗口的多边形,则 窗口用包围多边形的颜色填充。 多个多边形和窗口的关系分别是相交、内含或包围,但是有一个包围窗口的多边形在其他多边形前面,整个窗口用该包围多边形的颜色填充
排序 细分 • 每次细分窗口后,用边界盒的办法判断多边形序列中的多边形是否和四个子窗口相交,不相交的多边形可从多边形序列中排除 对所有的多边形按其顶点的z坐标最大值来排序 窗口 D zmax C E G F zmin A H B 图8.12 确定被遮的挡多边形 8.3 基于窗口的子分算法 • 提高效率的有效的处理技术 CD被AB遮挡 AB遮挡了EF • 若窗口被多边形G包含,被G遮挡的多边形要从窗口的多边形序列中去掉
8.4 基于多边形的子分算法 • 算法描述: 各多边形在深度方向作初步的排序 多边形序列中的第一个多边形(裁剪多边形)作为裁剪窗口 区域内 多边形 区域外 多边形 裁剪过程要 重复到外部表 中不再有多 边形为止 确定内部表中 多边形的前 后顺序 外部表中 同样的工作
2i 3i 4i a) ni为窗口内的多边形表,n=2,3,4; b) no为窗口外的多边形表,n=3,4 图8.14 消隐多边形的裁剪 3o 4o y 4 2 3 1 x z 8.4 基于多边形的子分算法 例子
v vmax u umax n 8.5 z缓冲器算法和扫描线算法 • 基本思想:
8.5 z缓冲器算法和扫描线算法 • 具体实现此算法需要z缓冲器数组和帧 • 缓冲器数组,分别设为Zdepth [ ][ ] • 与Frame [ ][ ]: • 对屏幕上每个点(x,y),令Zdepth [x][y] • 为z的极小值,Frame [x][y]为背景颜色。 • 对所有多边形做如下工作:对多边形上 • 每一点(x,y),计算其z值。 • 若z> Zdepth [x][y],则Zdepth [x][y]=z, • 并将此点属性值赋给Frame[x][y],否则 • 说明此点离观察者较远,两个数组的值 • 都不用改变
扫描线z缓冲器算法 • 算法思想
8.5z缓冲器算法和扫描线算法 • 每处理一条扫描线,都要检查各多边形是否和该线相交,还要计算多边形所在平面上很多点的z值,需要花费很大的计算 • 采取类似多边形扫描转换的扫描线算法处理,提高效率
4 3 1 多边形Y筒 边活化表 多边形活化表. 8.5z缓冲器算法和扫描线算法 数据结构 2 边Y筒 系数a,b,c和d Δy 属性color 编号IP 多边形活化表中记 录了在 平面上的投 影和当前考虑的扫 描线相交的多边形 上端点x坐标的值 Δy Δx 编号IP 边活化表中存放多 边形的边和当前扫 描线相交的边对
11 9 8 7 Ⅰ Ⅱ 3 o x 图 8.15 要消隐的物体 10 7 2 1/7 8 2 1 2 1 3 6 7 8 10 11 多边形y筒 多边形活化表 边活化表 边y筒
算法如下 6 5 2 4 3 1 TEXT 对边活化表中的每个边对,令 ,对每一个满足 的坐标为 的像素从左到右依次进行处理。 检查多边形Y筒 若有新的多边形涉及当前扫描线,则把它放入多边形活化表中。若有新的多边形加入多边形活化表,则要把该多边形在 平面上的投影和扫描线相交的边对加入边活化表中。 若所有扫描线都已经处理完,则算法结束,否则选下一条扫描线为当前扫描线,转步骤3 建立多边形Y筒和边Y筒,初始化多边形和边的活化表为空。 以最上面的扫描线为当前扫描线。 对当前扫描线y,把帧缓冲器相应行置成底色,z缓冲器的各单元放z的极小值
对边活化表和多边形活化表修改 算法步骤:--对边活化表修改 1)、修改边活化表,对每一边做如下计算 若Δyl或Δyr小于0,相应的边就要从一个边对中去掉,并从y筒中找到合适的边来代替。若这两条边同时结束于某一点,则去掉这一边对。若Δyl和Δyr都不小于0,则修改 为 修改后的表便是新扫描线的边活话表。 2)、修改多边形活化表。令 ,若 ,则将该多边形从多边形活化表中删除。
8.6 优先级排序表算法 • 模拟示例
8.6 优先级排序表算法 • 算法思想 • 优先级排序表算法按多边形离观察者的远近来建立一个多边形排序表,距观察者远的优先级低,近的优先级高 • 从优先级低的多边形开始,依次把多边形的颜色填入帧缓冲存储器中 • 表中距观察者近的元素覆盖帧缓冲存储器中原有的内容 • 当优先级最高的多边形的图形送入帧缓冲器后,整幅图形就形成了
8.6 优先级排序表算法 • 优先级排序表算法的关键在于对多边形做正确的排序 • 动态的算法: • 根据每个多边形顶点z坐标的极小值zmin的大小,按由小到大对它们做初步排序,并把它们组成一个链表 • 若链表中只有一个多边形,则算法结束。否则取表头多边形为P。 • 设Q为链表中P之外的任一多边形。若对所有Q都有 > ,则P不会遮挡其它多边形,为优先级最低的多边形,在链表中去除P,转(2);否则,若所有Q都满足下面四项条件中的一项,则在链表中去除P,转(2)。若不满足此四项条件中任何一个的Q,交换P和Q,转(3)。
四项条件 P和Q在oxy平面上投影的边界盒在x或y方向上不相交 P 的各顶点均在Q的远离视点的一侧 Q 的各顶点均在P的近视点的一侧 P和Q在平面 oxy 上的投影不相交
特殊情况 • 解决:图8.22,把多边形序列中原多边形P从序列中去掉,而把P分成的两个多边形加入链表中,这样可避免使多边形P和Q不断地循环进行交换 图8.21 互相遮挡 图8.22 用Q所在平面把P一分为二
视点所在区域 A B C D 优先级表 ① ② ③ ② ① ③ ③ ② ① ③ ① ② 用来解决动态显示问题时,可大大提高效率 • 对飞机驾驶员着陆进行模拟训练时要显示消隐后的跑道周围情况,这时景物是不变的,仅视点发生变化。 • 可对不同的视点位置把景物的优先级排序表预先算好,然后再用油画家算法显示图形,这样便可使消隐过程加速,实现动态显示 优先级表 图8.23 视点在不同区域有不同的优先级
8.7 光线投射算法 • 原理: 要处理的场景中有无限多条光线,从采样的角度讲我们仅对穿过像素的光线感兴趣,因此,可考虑从像素出发,逆向追踪射入场景的光线路径
具体做法是: • 由视点出发穿过观察平面上一像素向场景发射一条射线(如图8.25) • 求出射线与场景中各物体表面的交点 • 离视点最近的交点的颜色即为像素要填的颜色。 • 光线投射算法对于包含曲面,特别是包含球面的场景有很高的效率。 图8.25 一条由象素点射入场景的视线
光线投射算法可看作 是z缓冲器算法的一 种变形 z缓冲器算法: 每次处理一个面片,对面片上的每个投影点计算z值,计算出来的值与以前保存的z值进行比较,从而确定每个像素所对应的可见面片 光线投射算法:每次处理一个像素,并沿光线的投射路径计算出该像素所对应的所有面片的z值。
8.8 曲面的隐藏线消除 • 由方程表示曲面 • 曲面可以由 • 和 产生的 条曲线来表示 即由 和 两组平面和曲面的交线来表示 • 隐藏线消除就是要去掉这两 族交线中被遮挡的部分 (a)未消隐的曲面表示 (b)消隐的曲面表示
8.8 曲面的隐藏线消除 • 参考文献[6]中,简单的算法 • 先考虑对应z=zi=const的一族曲线的消隐算法。 • 如果图形显示器在水平方向有M个象素,则建立M 个内存单元 ,在这些单元是先放上初值,初值应取成小于 M 初值
8.8 曲面的隐藏线消除 • 设 • 平面 是最靠近观察者的,从平面 对应的曲线 开始,对水平方向每个像素的对应 坐标值 • 平面对应的曲线上的点都是可见的. • 处理完 平面对应的曲线后,然后对平面 对应的曲线做如下处理 • 若 是可见点,并把 内容换成 • 若 是不可见点, 内容不变。 • 一条一条曲线进行处理,就得到一组消除隐藏线的曲线族
图 8.27 一组曲线族的消隐过程 8.8 曲面的隐藏线消除 • 左边的图是没有经过消隐的三条曲线,右边的图是经过消隐后的三条曲线。
8.8 曲面的隐藏线消除 • 上述方法对图8.26中的曲面的凹下部分是不适用的(图中c处)。 • 解决办法: • 建立M个单元 。它的初值取成大于 , c 图8.26 M
y x z 视点 8.8 曲面的隐藏线消除 • 每次求出若 或 则 可见 否则不可见 • 若 则 • 若 则 • 用 和 两族曲线表示曲面 时实现消隐的正确做法: 对两族曲线一起做即处理好平面 上 至 一段曲线后,立即处理平 面 上 至 的一段曲线, 如图8.28所示 图8.26