第 7章 消隐
第 7章 消隐
7.1 基本概念
7.1.1 消隐的定义
如果要使一幅图有较强的立体感,必须在视点
确定之后,将对象的隐藏线(面)消去,这一过
程称为消隐;执行这一功能的算法,称为消隐算
法。
经过消隐得到的图形称为物体的消隐图形。
第 7章 消隐
7.1.2 消隐的分类
从消隐的对象,或者从应用的角度来分类:
( 1)线消隐
( 2)面消隐
从消隐的空间来分类:
( 1)物体空间的消隐
( 2)图像空间的消隐
第 7章 消隐
7.1.3 消隐算法的基本原则
1.排序
2.连贯性
?物体连贯性
?面(边)连贯性
?扫描线连贯性
?深度连贯性
第 7章 消隐
7.2 画家算法
7.2.1 算法的基本思想
基本思想:
( 1)先把屏幕置成背景色;
( 2)将物体的各个面按其距观察点的远近进行排序,结
果放在一张深度优先级表中;(深度优先级表是一个线性
表,距观察点远的多边形优先级低,将之放在表头;距观
察点近的多边形优先级高,将之放在表尾。)
( 3)按照从表头到表尾(从远到近)的顺序逐个取出多
边形,投影到屏幕上并显示。
第 7章 消隐
7.2.2 深度优先级表的建立
当两个多边形 P和 Q交叉在一起时,要进行对多边形的
排序。
假设多边形的 z范围是平面 z=zmin和 z=zmax之间的区
域,所以,zmin是所有多边形顶点的最小 z值,zmax是所
有多边形顶点的最大 z值。与此类似定义多边形的 x和 y范
围,则将 x,y和 z范围的交集称为多边形的范围或包围盒。
在投影坐标系 XYZ中,投影方向是 Z轴的负方向,因此 z值
大者离观察点更近。记 zmin(P),zmax(P)分别为多边形 P
的各个顶点 z坐标的最小值与最大值,排序算法如下:
第 7章 消隐
第一步:将场景中所有多边形存入一个线性表(数组或链表)
中,记为 L;
第二步:如果 L中仅有一个多边形,算法结束;
否则,根据每个多边形的 zmin对它们预排序。不妨假定多边
形 P落在表首,即 zmin(P)为最小。再记 Q为 L – {P}(表
中其余多边形)中任意一个;
第三步:判别 P,Q之间的关系,有如下二种:
( 1)如果对所有的 Q,有 zmax(P)<zmin(Q),则多边形 P的
确距观察点最远,它不可能遮挡别的多边形。令 L = L –
{P},返回第二步;
( 2)如果存在某一个多边形 Q,使 zmax(P)>zmin(Q),则需
进一步判别:
第 7章 消隐
① 若 P,Q的投影 P’,Q’的包围盒不相交,则 P,Q在表中的
次序不重要,令 L = L – {P},返回第二步;否则进行下
一步。
② 若 P的所有顶点位于 Q所在平面的不可见的一侧,则当前
的 P,Q关系正确,令 L = L – {P},返回第二步;否则进
行下一步。
③ 若 Q的所有顶点位于 P所在平面的可见的一侧,则当前的 P、
Q关系正确,令 L = L – {P},返回第二步;否则进行下一
步。
④ 对 P,Q的投影 P’,Q’求交,若 P’,Q’不相交,则 P,Q在
表中的次序不重要,令 L = L – {P},返回第二步;
否则,在它们所相交的区域中任取一点,计算 P,Q在该
点的深度值,如果 P的深度小,则 P,Q关系正确,令 L =
L – {P},返回第二步;
否则,交换 P,Q,返回第三步。
第 7章 消隐
7.3 Z缓冲区 (Z-Buffer)算法
7.3.1 算法的基本思想
基本思想:先将 FB(帧缓冲区,用于存贮各像素点的
颜色和亮度值)中全部存放背景色,ZB(深度缓冲区,
用于存贮对应于该像素点的 z座标值)中所有单元的初始
值置为最小值。在把显示对象的每个面上每一点的属性
(颜色或灰度)值填入帧缓冲区相应单元前,要把这点的
z坐标值和 ZB中相应单元的值进行比较,检查当前多边形
的深度值是否大于该像素原来的深度值。如果大于,说明
当前多边形更靠近观察点,用它的颜色替换像素原来的颜
色,同时 ZB中相应单元的值也要改成这点的 z坐标值;否
则,说明在当前像素处,当前多边形被前面所绘制的多边
形遮挡了,是不可见的,像素的颜色值不改变。对显示对
象的每个面上的每个点都做了上述处理后,便可得到消除
了隐藏面的图。
第 7章 消隐
7.3.2 算法的描述
{ for(x<0;x<xmax;x++)
for (y<0;y<ymax;y++)
{ FB(x,y)单元置为背景色;
ZB(x,y)单元置为最小值; }
for(每一个多边形 )
{ 扫描转换该多边形;
for(多边形所覆盖的每个像素 (x,y) )
{ 计算该多边形在该像素的深度值 z(x,y);
if (z(x,y)>ZB(x,y))
{ 用 z(x,y)替换 ZB(x,y)的值 ;
用多边形在 (x,y)处的颜色值替换 FB(x,y)的值;
} } } }
第 7章 消隐
7.4 扫描线 Z缓冲区算法
7.4.1 算法的基本思想
基本思想:依顺序处理每一条扫描线,在处理当前扫
描线时,设计一个一维数组作为当前扫描线的深度缓冲区
( ZB)。首先找出扫描线与投影到屏幕上的所有多边形
的相交区间,对每一个相交区间上的各像素利用连贯性计
算其深度 z值,并与 ZB中的值比较,以决定各区间点的像
素颜色,并将之写入帧缓冲区( FB)。
第 7章 消隐
7.4.2 算法的描述
{ y=yi; for(x<0;x<xmax;x++)
{ FB(x,yi)单元置为背景色;
ZB(x,yi)单元置为最小值; }
for(每一个多边形 )
{ 扫描转换该多边形;
求出多边形的投影与当前扫描线的相交区间;
for(相交区间内的每个像素 (x,yi) )
{ 计算该多边形在该像素的深度值 z(x,yi);
if (z(x,yi)>ZB(x,yi))
{ 用 z(x,yi)替换 ZB(x,yi)的值 ;
用 (x,yi)处的颜色值替换 FB(x,yi)的值;
}}}}
第 7章 消隐
7.5 光线追踪算法
7.5.1 算法的基本思想
基本思想:从视点出发,沿投影方向(光线方向)发
出射线,此射线穿过观察屏幕的像素与场景中的物体相交。
计算该射线与物体表面的交点,离像素最近的交点所在面
的颜色即为该像素的颜色;如果没有交点,说明没有多边
形的投影覆盖此像素,则用背景色作为该像素的颜色。
第 7章 消隐
7.5.2 算法的描述
{ for(x<0;x<xmax;x++)
for (y<0;y<ymax;y++)
{ 形成通过该屏幕像素 (x,y)的射线;
for(每个多边形)
将射线与该多边形求交点;
if (有交点)
以最近交点所属多边形的颜色显示像素 (x,y)
else
以背景色显示像素 (x,y);
}
}