当前位置:文档之家› 《计算机图形学》08消隐技术

《计算机图形学》08消隐技术


A B
D
C
投影方向
其夹角为锐角,则为后向面或背面。
剔除依据: 物体表面是封闭的,背面总是被前向面所遮挡,从 而始终是不可见的。
4. 将透视投影转换成平行投影 消隐与透视关系密切,体现有: 1)消隐必须在投影之前完成; 2)物体之间的遮挡关系与投影中心(视点)的选 取有关; 3)物体之间的遮挡关系与投影方式有关
ai + bj + d c
若 c = 0,则多边形Fk的法线方向与 Z 轴垂直, Fk在投影面
上的投影为一条直线,可不予考虑。
4. 算法的特点 ① 简单 不需要将所有的多边形按离视点的远近排序,其算法的复
杂度只与多边形的个数成正比。
② 需要有一个较大容量的 Z—Buffer 。
5. 算法的改进
① 采用包围框技术,提高算法的效率。 ② 采用硬件 Z—Buffer 来实现。
视点位置
视线方向
z值
视点
按观察方向上离视点(投影参考点) 的远近(通常用 z 值来表示)排序。
u(x)
2. 测试 用以判断点与面、线与面、面与面之间的关系。
包含测试: 测试空间点的投影是否在某个空间多边形的投影内,若在, 则可能存在遮挡关系;若不在,则不存在遮挡关系。 测试方法: 从空间点的投影开始向与 -y 轴平行的方向作射线,计算 该射线与空间多边形的投影的交点个数,若为奇数,则点的投
假定场景中有 k 个物体,平均每个物体的表面由 h 个多 边形构成,其计算复杂度为 O((kh)2)。
算法描述如下:
for (场景中的每一个物体) { 将该物体与场景中的其它物体进行比较,确定其表面的可 见部分; 显示该物体表面的可见部分;
}
第二种方法是以窗口内的每个像素为处理单元,确定在每
一个像素处,场景中的物体哪一个距离观察点最近(可见
第八章
消隐技术
8.1 基本概念
一.为什么要消隐 因为计算机图形处理的过程中,不会自动消去隐藏部分,
相反会将所有的线和面都显示出来。
问题: ① 对于线画图形会出现多义性。
对于光栅扫描着色的面图形则会导致图形错误。
② 要增强图形的真实感必须进行消隐处理。
二. 消隐的分类 1.消除隐藏线 对于采用物体的棱线或轮廓线表示的线画图形,应消去物
目的求交运算,减少计算量,提高效率。
一个好的包围盒要具有两个条件:
(1)包围盒充分紧密包围着形体; (2)对其的测试比较简单。 二维图形 ----- 包围框(重叠测试); 三维物体 ----- 包围盒、包围球。
3. 背面剔除 一个平面多面体的表面由若干个 平面多边形构成,若一个多边形表面 的外法线方向与投影方向(观察方向) 的夹角为钝角,则该面为前向面;若
for ( i=1; i<= m ; i+点 */
for ( k=1; k<=p ; k++ ) /* 共有 p 个多边形 */ { 判断像素点( i, j )是否在多边形Fk在投影面上的投影内; 若( i, j )在多边形Fk的投影内,计算多边形Fk上对应于 像素点( i, j )处的深度值 Zi, j ;
影在多边形的投影内;若为偶数,则点的投影不在多边形的投
影内。 y 特殊情况 左闭右开
x
重叠测试: 测试两个空间多边形的投影是否重叠,若重叠,则可能存 在遮挡关系;若不重叠,则不存在遮挡关系。
测试方法:
四. 提高消隐算法效率的常用方法 利用连贯性 包围盒技术 背面剔除
将透视投影转换成平行投影
空间分割技术
复杂度比较
物体分层表示
1. 利用相关性(连贯性) 物体的相关性:若物体 A 与物体 B 是完全相互分离的,消 隐时只需比较 A 、 B 两物体之间的遮挡关系,而不需对其表面 多边形逐一进行测试。 面的相关性:一个面内的各种属性值(坐标值、灰度值等) 一般都是缓慢变化的,可采用简单增量方式进行计算。
6. 算法的进一步改进
① 采用分区处理方法。 ② 利用相关性。
8.3 列表优先算法(画家算法)
基本思路:根据物体上各个面(多边形)距离视点的远 近进行排序,建立一张优先级表。约定距离视点近的优先级高, 距离视点远的优先级低。 生成图象时,优先级低的多边形先画,优先级高的多边形
后画。
关键问题:在深度方向上对多边形进行正确的排序。
体本身看不见的棱线和轮廓线部分,以及因物体间的互相遮挡
而被隐藏的棱线和轮廓线。 2.消除隐藏面 对于采用光栅扫描着色方法(即采用物体表面不同的明暗 度)绘制的图形,应消除物体上看不见的面以及因物体间的互
相遮挡而被隐藏的面。
与此相对应,消隐的算法也可分为两种:
第一种方法是以场景中的物体为处理单元,将一个物体与 其余的 k-1 个物体逐一比较,仅显示它可见的表面以达到消 隐的目的。此类算法通常用于消除隐藏线。
者的子节点做进一步测试。
父节点之间的遮挡关系可以用它们之间的包围盒进行预测 试。
8.2 深度缓存算法 ( Z—buffer算法)
1. Z—Buffer 用于存放与屏幕上像素点对应的物体上点的深度值。 y
投影面
z
视线方向
不可见点 可见点
视点位置
x
屏幕像素
F — Buffer
Z—Buffer
2. 算法 初始化:ZB( i, j )=机器最大值 ;FB( i, j )=背景色。 for ( j=1; j<= n ; j++ ) /* 共有 n 根扫描线 */
5. 空间分割技术 依据:场景中的物体,它们的投影在投影平面上是否有重 叠部分?(是否存在相互遮挡的可能?)对于根本不存在相互
遮挡关系的物体,应避免这种不必要的测试。
方法:将投影平面上的窗口分成若干小区域;为每个小区
域建立相关物体表,表中物体的投影于该区域有相交部分;则
在小区域中判断那个物体可见时,只要对该区域的相关物体表 中的物体进行比较即可。
z
D A o C B
空中小三 角形面片
y
E
x o
y
分离面 P
x
8.4 光线投射算法
算法思路 将通过绘图窗口内每一个像素的投影线与 场景中的所有多边形求交。如果有交点,用深 度值最大的交点(最近的)所属的多边形的颜 色显示相应的像素;如果没有交点,说明没有 多边形的投影覆盖此像素,用背景色显示即可。
算法描述:
for ( v= 0;v<vmax;v++) for (u= 0; u<umax; u++) { 形成通过像素(u,v)的投影线; for (场景中每一个多边形) 将投影线与多边形求交; if (有交点) 以最近交点所属多边形的颜色显示像素(u,v) else 以背景色显示像素(u,v); }
6. 复杂度比较: 不妨假定每个小区域的相关物体表中平均有h个物体,场 景中有k个物体,由于物体在场景中的分布是分散的,显然h远 小于k。根据第二种消隐方法所述,其算法复杂度为O(h*h),远 小于O(k*k)。
7. 物体分层表示 表示形式:模型变换中的树形表示方式 原理:减少场景中物体的个数,从而降低算法复杂度。 方法: 将父节点所代表的物体看成子节点所代表物体的包 围盒,当两个父节点之间不存在遮挡关系时,就没有必要对两
if ( Zi, j < ZB( i, j ) )
{ ZB( i, j ) = Zi, j ; FB( i, j ) =多边形Fk的颜色 } else 不作处理 }
3. 算法实现中的关键问题 ①判断点( i, j )是否在多边形Fk在投影面上的投影内 解决办法:采用包含测试。
②计算多边形Fk在点( i, j )处的深度值 Zi, j 若多边形Fk的平面方程为: ax + by + cz + d = 0 若 c ≠ 0,则 Zi, j = —
区域相关性:一个区域是指屏幕上一组相邻的像素,它们
通常属于同一个可见面。区域相关性表现在一条扫描线上时,即 为扫描线上的每个区间内只有一个面可见。 扫描线相关性:在相邻的两条扫描线上,可见面的分布情 况相似。
深度相关性:物体的同一表面上的相邻部分深度是相近的。
2. 包围盒技术
用于对物体间的某些关系进行比较和测试,从而可避免盲
的),从而用它的颜色来显示该像素。此类算法通常用于消除 隐藏面。
若显示区域中有 m×n 个像素,则其计算复杂度为O(mnkh)。
算法描述如下:
for (窗口内的每一个像素) {确定距观察点最近的物体,以该物体表面的颜色来显示像素; }
三.消隐算法中常用的处理技术 1. 排序 确定物体间遮挡关系的要素: v(y) n(z)
相关主题