计算机图形学简明教程_第7章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
场景可见部分的判断过程称为可见线判定或可见 面判定,也可称为隐藏线消除或隐藏面消除。
前提:把物体看成是由一个或多个多边形(或更复杂的面片)组成
窗口
1
以构成图像的每一个像素 为处理单元,确定场景中 的所有在该像素上有投影 的表面,相对于观察点可 见的表面。适于面消隐。 以三维场景中的物体对象 为处理单元,在所有对象 之间进行比较,除去完全 不可见的物体和物体上不 可见的部分。 适于面消隐 也适于线消隐。
紫色 橙色
2
3
具体分析-分割结束条件
对不满足上述三种情况的窗口,重复细分过程,并对细 分后的各子窗口重复做同样的处理。细分若干次后,窗 口的面积就小于或等于一个像素的面积了,此时细分结 束,该窗口对应的像素的颜色可取成最靠近观察者的多 边形的颜色。
紫色
橙色
基本思想
用多边形的边界对区域作划分,其目的是尽量减少对 区域划分的次数。该算法是对上节基于窗口细分算法 的改进。由于算法在景物空间中以任意指定的精度进 行运算,其输出结果仍为多边形,所以算法不仅可用 来处理隐藏面消除,也可用来处理多面体隐藏线消除
y
z
A 不相交
x (a)边界盒和投影均重
叠
(b) 边界盒重叠,投影不重叠
举例: 用边界盒技术判断两条直线是否相交。
y ymax Q1 Q3 ymin Q5 Q2
Q4
Q6
记点vi在oxy面上的投影为Qi ( xi , yi ) 。 直线段 Q1Q2的边界盒是包含该直线且 边平行于坐标轴的最小矩形,这个矩
子立方体;重复上述过程,直到每个小立方体所包含的表
面片少于一个给定的值,分割即告终止。
具体分析
1)每一终端结点对应一个求交面片表,该表中包含的是与终端结点对 对从后向前排 应的立方体中所包含的景物表面片。 列算 2)八叉树由于其不相交立方体之间的规则结构,可以很方便的进行空 法,先显示最 间预排序,然后再根据列表优先级算法便可以很容易对平行投影给 远的八 出正确的显示顺序。 分体,然后
y
4 1 z 2 3 x 要消隐的多边形 4
1 2
3
x
算法描述
Step6:内部表中多边形的按前后顺序排好序后,接下来是对外部表中 的各多边形进行排序。对外部表中各多边形的排序和对内部表中各 多边形的处理方法相同,即把外部表中第一个多边形作为裁剪多边 形(假定外部表中的多边形也是按原来的多边形次序排序),对外部 表中的其它多边形作裁剪并确定遮挡关系,这一过程又形成新的外 部表。裁剪过程要重复到外部表中不再有多边形为止。
v2 v1
v5
v7
v6
2、判断后向面的方法
3)(a ) z可以看作是三角形v1vk vk+1在平面oxy上投影的 有向面积的二倍。 1 S AB * AC 顶点为A,B,C的三角形面积:
2
3)可以通过计算多边形在平面上投影的有向面积判断F 是否为后向面。有向面积sp可如下计算
1 L 1 sp (v1vk ) (v1vk 1 ) 2 K 2 z
当它们满足: 表明两个边界盒不相交,则边界盒中的两条直线段也不相交。
进一步简化判断
用球代替长方体作为边界盒可以简化判断直线同边界盒是 否相交的计算过程,即若边界球的球心到直线的距离大于 球的半径,那么直线与边界球不相交,也就与球内的物体 不相交。一个有效的确定边界球的方法是取球的中心为:
xmax xmin ymax ymin z max z min xc yc zc 2 2 2
问题。
算法描述
Step1:对各多边形在深度方向作初步的排序 Step2:把多边形序列中的第一个多边形(裁剪多边形)取为窗 口。 多边形序列中的其它的多边形都要被此窗口裁剪。 Step3:裁剪结果要建立两个多边形序列表 -内部表:放入位于窗口内的部分 -外部表:放入位于窗口外的部分
y y 4 1 z 2 3 4 1 2 3 4i 3o 4o
y y 4 1 z 2 3 4 1 2 3 3o x 4o
x
要消隐的多边形
基本思想
将能够包含整个场景的立方体,即八叉树的根结点,按照 x,y,z三个方向中的剖面分割成八个子立方体,称为根结
点的八个子结点。对每一个子立方体,如果它包含的表面
片少于一个给定的值(例如3),则该子立方体为八叉树 的终端结点,否则为非终端结点并将其进一步分割成八个
如何把透视投影变为垂直投影,其本质是把棱台变成长方体。
投影平面
( x , y , 0)
( x , y , 0)
( x , y , z )
( x , y , z )
B
A
由棱台到长方体的变换
Pc ( xc , yc , zc )
把左边的棱台A变换成右边长方体B。设 (x’,y’z’ )是棱台A中任意一点, 它在投影平面的投影为 (x,y,0) ,事实上透视投影是把线段 (x’,y’z’ )和 (x,y,0)之间的点都变换成 (x,y,0),如果能把 (x’,y’z’ )和(x,y,0)之间的点指定 一个相应的Z值,且该值不改变原线段上点之间的前后关系,就可把棱台 A变为长方体B。
1 L 1 ((xk x1 )( yk 1 y1 ) ( xk 1 x1 )( yk y1 )) 2 K 2 注意:如果多边形是凸的,则可只取一个三角形计算有向面积sp。如 果多边形不是凸的,只取一个三角形计算有向面积sp可能会出现错误, 即F所在的面为前向面也可能出现sp≥0的情况,因此,需按上式计算多 边形F的有向面积。
y
注意选取适当的边界盒: 不可太小,也不可太大。 一种简单的求边界盒的方法: 计算多边形顶点坐标的最大值和 最小值得到(即采用矩形边界盒)
x z
边界盒应用原则
A边界盒不相交:在Oxy平面投影的边界盒,两个边界盒不
相交,所以两个多边形不相交。 B 边界盒相交:相交的情况可分为两种,投影相交或投影 不相交。无论哪种情况都需要做进一步的 处理,以判断两物体的投影是否相交。
是F的内法线方向,如果 a 的z分量
a v1vk v1vk 1, 2 k L 1
(a ) z 0
v3 v4
说明向量和z轴正方向的夹角大于90度, F的外法线方向和z轴正方向的夹角小于 90度,F为前向面。否则,即a的z分量 大于0 即 (a ) z 0 ,则F的内法向z轴正方 向的夹角大于90度,外法线方向和z轴正方向 的夹角小于90度,F为前向面。
1
多边形和窗口相交(图中情况2) 窗口包围了多边形(图中情况3) 多边形包围了窗口(图中情况4)
2 3
3
4
4
多边形和窗口的关系
具体分析-可见性判断
对以下的三种情况,窗口中多边形的可见性容易判定,不需要再对 窗口进行分割:
1
所有多边形均和窗口分离,则窗口内只需 显示背景色; 只有一个多边形和窗口相交,或这个多边 形包含在窗口内。这时,先对窗口内每一 像素填上背景颜色,再对窗口内多边形部 分用扫描线算法填色。 一个多边形包围窗口,其他多边形和窗口 分离,或有多个多边形和窗口的关系分别 是相交、内含或包围,但是有一个多边形 包围窗口并且在其他多边形前面,则窗口 用包围多边形的颜色填充。
7.1.1
边界盒
7.1.2
3
后向面消除 投影规范化
7.1.3
4
ห้องสมุดไป่ตู้
边界盒 :
物体的边界盒是指能够包含该物体的一个简单的几何形状, 如矩形,圆,长方体等。 采用边界盒在消隐中的好处:
可避免不必要的裁剪运算,避免在物体或它们的投影之间进
行不必要的比较运算。
图7.4 两个物 体 投 影 在 xy 平面,包围 投影的边界 盒为矩形
形由下面四个参数确定 xmin min(x1,x2 ),ymin min(y1,y2 ) x xmax xmin xmax max(x1,x2 ),ymax max(y1,y2 ) 设两个边界盒的参数为:xmini , ymini , xmaxi , ymaxi , i 1,2
( xmin1 xmax 2 )或 ( ymin1 ymax 2 ) 或 ( xmin 2 xmax1 )或 ( ymin 2 ymax1 )
1 2
3
x
算法描述
Step5:如果内部表中有某多边形H比裁剪区域(多边形)
更靠近观察者,说明原来的预排序不对,此时要用多边
形H的原始多边形(即未被裁剪时的多边形)代替原来的 裁剪多边形重复上述工作。
y
!
如左图如果对顶点排序 的话,则1自然要排最 前面,首先会用1做裁 剪多边形,但实际情况 是2在1的前面,所以应 该以2做新的裁剪多边 形,重复上述工作
如果 SP 0 ,则F所在的面为后向面。 如果SP 0,则F所在的面为前向面。
物体之间的遮挡关系与投影中心和投影方向 有着密切的关系,对物体的可见性判定也和 投影方式有密切的关系。 如果投影为垂直投影,则多边形在oxy平面 上的投影可由忽略了z坐标的顶点得到,从 而可大大减少计算量。具体如下:
2i
3i
x
要消隐的多边形
x
ni为窗口内的多边形表;no为窗口外的多边形表
算法描述
Step4:将内部表中每一个其它多边形的深度值与裁剪多边 形的深度值进行比较,如果内部表中每一个其它多边形 均被裁剪多边形遮挡,则裁剪多边形是完全可见的,可 把该多边形区域填上裁剪多边形的颜色。
y
y
4 1 z 2 3 x 要消隐的多边形 4
此射影变换可由下式定义
x xc ( x xc ) y yc ( y yc ) z Az B zc z zc zc z zc zc z
如果对的射影变换是线 性的,则不改变视见体 内各表面的前后位置关 系可以通过不改变视见 体的前后平面 z=zf和z= zb,的前后位置关系实现, 把这两个条件代入左式, 得:
像素
视点
图7.1 以像素为对象的消隐算法
y
窗口
2
x
z 平行投影
图7.2 以物体为对象的消隐算法
提
!
假定构成物体 的面不能相互 贯穿,也不能 有循环遮挡的 情况。
醒
(a)
(b)
贯穿和循环遮挡
如果构成物体的面不满足该假 定,可以把它们剖分成互不贯 穿和不循环遮挡的情况。
例如,用上图中的虚线便可把原来 循环遮挡的三个平面,分割成不存 在循环遮挡的四个面。
IJFGH,FABG,HCDI,IDEJ 所在的面为前向面 JEAF, DEABC,HGBC所在的面为后向面
2、判断后向面的方法
1)首先对多边形的顶点进行排序:设多边形F的顶点为 v1,v2,…,vL顶点 Vi 的坐标为 ( xi , yi , z i ) 。次序如图所示 2)判断后向面:如果v1,v2,…,vL构成凸的多边形,则向量
z f ( zc z f ) Az f B zb ( zc zb ) Azb B
AB如何求解??
A zc z f zb , B z f zb
7.2.1
基于窗口的细分算法
7.2.2 基于多边形的细分算法
概述 区域细分算法是一种分而治之(Divide-Conquer) 的算法,它把投影区域作为考察对象,如果很 容易确定投影区域内的多边形是否可见,便显 示这些多边形,否则将这些区域进一步细分, 随着不断细分,判断多边形的可见性将越来越 简单。本节介绍基于窗口的细分算法和基于多 边形的细分算法。
基本思想
把物体投影到全屏幕窗口上,然后递归的将窗口一分为 四,如果可以确定小窗口内的多边形是否可见,则显示 这些多边形,否则,将小窗口细分为更小的窗口,递归 地执行上述过程。
子分的过程
具体分析-关系判断
细分后都要对多边形和窗口就下面四种关系作判断: 1 2 窗口和多边形分离(图中情况1)
取半径为: 其中:
R
xl2 yl2 zl2
xmax xmin xl 2
zmax zmin ymax ymin zl yl 2 2
思路:把显然不可见的面去掉,减少消隐过程中的 直线求交数目
1、后向面 多面体表面多变形的法向可分为两种,一种是指向多面体 的外部,我们称之为外法向,一种指向多面体的内部,我 们称之为内法向。 必然有一些多边形表面的外法向指向与观察者相背离的方 向,这些多边形完全被多面体上其它 多边形遮挡。这些被遮挡的多边形 称为后向面。 首先消除掉这些面,去除后向面的过 程称为后向面消除。
前提:把物体看成是由一个或多个多边形(或更复杂的面片)组成
窗口
1
以构成图像的每一个像素 为处理单元,确定场景中 的所有在该像素上有投影 的表面,相对于观察点可 见的表面。适于面消隐。 以三维场景中的物体对象 为处理单元,在所有对象 之间进行比较,除去完全 不可见的物体和物体上不 可见的部分。 适于面消隐 也适于线消隐。
紫色 橙色
2
3
具体分析-分割结束条件
对不满足上述三种情况的窗口,重复细分过程,并对细 分后的各子窗口重复做同样的处理。细分若干次后,窗 口的面积就小于或等于一个像素的面积了,此时细分结 束,该窗口对应的像素的颜色可取成最靠近观察者的多 边形的颜色。
紫色
橙色
基本思想
用多边形的边界对区域作划分,其目的是尽量减少对 区域划分的次数。该算法是对上节基于窗口细分算法 的改进。由于算法在景物空间中以任意指定的精度进 行运算,其输出结果仍为多边形,所以算法不仅可用 来处理隐藏面消除,也可用来处理多面体隐藏线消除
y
z
A 不相交
x (a)边界盒和投影均重
叠
(b) 边界盒重叠,投影不重叠
举例: 用边界盒技术判断两条直线是否相交。
y ymax Q1 Q3 ymin Q5 Q2
Q4
Q6
记点vi在oxy面上的投影为Qi ( xi , yi ) 。 直线段 Q1Q2的边界盒是包含该直线且 边平行于坐标轴的最小矩形,这个矩
子立方体;重复上述过程,直到每个小立方体所包含的表
面片少于一个给定的值,分割即告终止。
具体分析
1)每一终端结点对应一个求交面片表,该表中包含的是与终端结点对 对从后向前排 应的立方体中所包含的景物表面片。 列算 2)八叉树由于其不相交立方体之间的规则结构,可以很方便的进行空 法,先显示最 间预排序,然后再根据列表优先级算法便可以很容易对平行投影给 远的八 出正确的显示顺序。 分体,然后
y
4 1 z 2 3 x 要消隐的多边形 4
1 2
3
x
算法描述
Step6:内部表中多边形的按前后顺序排好序后,接下来是对外部表中 的各多边形进行排序。对外部表中各多边形的排序和对内部表中各 多边形的处理方法相同,即把外部表中第一个多边形作为裁剪多边 形(假定外部表中的多边形也是按原来的多边形次序排序),对外部 表中的其它多边形作裁剪并确定遮挡关系,这一过程又形成新的外 部表。裁剪过程要重复到外部表中不再有多边形为止。
v2 v1
v5
v7
v6
2、判断后向面的方法
3)(a ) z可以看作是三角形v1vk vk+1在平面oxy上投影的 有向面积的二倍。 1 S AB * AC 顶点为A,B,C的三角形面积:
2
3)可以通过计算多边形在平面上投影的有向面积判断F 是否为后向面。有向面积sp可如下计算
1 L 1 sp (v1vk ) (v1vk 1 ) 2 K 2 z
当它们满足: 表明两个边界盒不相交,则边界盒中的两条直线段也不相交。
进一步简化判断
用球代替长方体作为边界盒可以简化判断直线同边界盒是 否相交的计算过程,即若边界球的球心到直线的距离大于 球的半径,那么直线与边界球不相交,也就与球内的物体 不相交。一个有效的确定边界球的方法是取球的中心为:
xmax xmin ymax ymin z max z min xc yc zc 2 2 2
问题。
算法描述
Step1:对各多边形在深度方向作初步的排序 Step2:把多边形序列中的第一个多边形(裁剪多边形)取为窗 口。 多边形序列中的其它的多边形都要被此窗口裁剪。 Step3:裁剪结果要建立两个多边形序列表 -内部表:放入位于窗口内的部分 -外部表:放入位于窗口外的部分
y y 4 1 z 2 3 4 1 2 3 4i 3o 4o
y y 4 1 z 2 3 4 1 2 3 3o x 4o
x
要消隐的多边形
基本思想
将能够包含整个场景的立方体,即八叉树的根结点,按照 x,y,z三个方向中的剖面分割成八个子立方体,称为根结
点的八个子结点。对每一个子立方体,如果它包含的表面
片少于一个给定的值(例如3),则该子立方体为八叉树 的终端结点,否则为非终端结点并将其进一步分割成八个
如何把透视投影变为垂直投影,其本质是把棱台变成长方体。
投影平面
( x , y , 0)
( x , y , 0)
( x , y , z )
( x , y , z )
B
A
由棱台到长方体的变换
Pc ( xc , yc , zc )
把左边的棱台A变换成右边长方体B。设 (x’,y’z’ )是棱台A中任意一点, 它在投影平面的投影为 (x,y,0) ,事实上透视投影是把线段 (x’,y’z’ )和 (x,y,0)之间的点都变换成 (x,y,0),如果能把 (x’,y’z’ )和(x,y,0)之间的点指定 一个相应的Z值,且该值不改变原线段上点之间的前后关系,就可把棱台 A变为长方体B。
1 L 1 ((xk x1 )( yk 1 y1 ) ( xk 1 x1 )( yk y1 )) 2 K 2 注意:如果多边形是凸的,则可只取一个三角形计算有向面积sp。如 果多边形不是凸的,只取一个三角形计算有向面积sp可能会出现错误, 即F所在的面为前向面也可能出现sp≥0的情况,因此,需按上式计算多 边形F的有向面积。
y
注意选取适当的边界盒: 不可太小,也不可太大。 一种简单的求边界盒的方法: 计算多边形顶点坐标的最大值和 最小值得到(即采用矩形边界盒)
x z
边界盒应用原则
A边界盒不相交:在Oxy平面投影的边界盒,两个边界盒不
相交,所以两个多边形不相交。 B 边界盒相交:相交的情况可分为两种,投影相交或投影 不相交。无论哪种情况都需要做进一步的 处理,以判断两物体的投影是否相交。
是F的内法线方向,如果 a 的z分量
a v1vk v1vk 1, 2 k L 1
(a ) z 0
v3 v4
说明向量和z轴正方向的夹角大于90度, F的外法线方向和z轴正方向的夹角小于 90度,F为前向面。否则,即a的z分量 大于0 即 (a ) z 0 ,则F的内法向z轴正方 向的夹角大于90度,外法线方向和z轴正方向 的夹角小于90度,F为前向面。
1
多边形和窗口相交(图中情况2) 窗口包围了多边形(图中情况3) 多边形包围了窗口(图中情况4)
2 3
3
4
4
多边形和窗口的关系
具体分析-可见性判断
对以下的三种情况,窗口中多边形的可见性容易判定,不需要再对 窗口进行分割:
1
所有多边形均和窗口分离,则窗口内只需 显示背景色; 只有一个多边形和窗口相交,或这个多边 形包含在窗口内。这时,先对窗口内每一 像素填上背景颜色,再对窗口内多边形部 分用扫描线算法填色。 一个多边形包围窗口,其他多边形和窗口 分离,或有多个多边形和窗口的关系分别 是相交、内含或包围,但是有一个多边形 包围窗口并且在其他多边形前面,则窗口 用包围多边形的颜色填充。
7.1.1
边界盒
7.1.2
3
后向面消除 投影规范化
7.1.3
4
ห้องสมุดไป่ตู้
边界盒 :
物体的边界盒是指能够包含该物体的一个简单的几何形状, 如矩形,圆,长方体等。 采用边界盒在消隐中的好处:
可避免不必要的裁剪运算,避免在物体或它们的投影之间进
行不必要的比较运算。
图7.4 两个物 体 投 影 在 xy 平面,包围 投影的边界 盒为矩形
形由下面四个参数确定 xmin min(x1,x2 ),ymin min(y1,y2 ) x xmax xmin xmax max(x1,x2 ),ymax max(y1,y2 ) 设两个边界盒的参数为:xmini , ymini , xmaxi , ymaxi , i 1,2
( xmin1 xmax 2 )或 ( ymin1 ymax 2 ) 或 ( xmin 2 xmax1 )或 ( ymin 2 ymax1 )
1 2
3
x
算法描述
Step5:如果内部表中有某多边形H比裁剪区域(多边形)
更靠近观察者,说明原来的预排序不对,此时要用多边
形H的原始多边形(即未被裁剪时的多边形)代替原来的 裁剪多边形重复上述工作。
y
!
如左图如果对顶点排序 的话,则1自然要排最 前面,首先会用1做裁 剪多边形,但实际情况 是2在1的前面,所以应 该以2做新的裁剪多边 形,重复上述工作
如果 SP 0 ,则F所在的面为后向面。 如果SP 0,则F所在的面为前向面。
物体之间的遮挡关系与投影中心和投影方向 有着密切的关系,对物体的可见性判定也和 投影方式有密切的关系。 如果投影为垂直投影,则多边形在oxy平面 上的投影可由忽略了z坐标的顶点得到,从 而可大大减少计算量。具体如下:
2i
3i
x
要消隐的多边形
x
ni为窗口内的多边形表;no为窗口外的多边形表
算法描述
Step4:将内部表中每一个其它多边形的深度值与裁剪多边 形的深度值进行比较,如果内部表中每一个其它多边形 均被裁剪多边形遮挡,则裁剪多边形是完全可见的,可 把该多边形区域填上裁剪多边形的颜色。
y
y
4 1 z 2 3 x 要消隐的多边形 4
此射影变换可由下式定义
x xc ( x xc ) y yc ( y yc ) z Az B zc z zc zc z zc zc z
如果对的射影变换是线 性的,则不改变视见体 内各表面的前后位置关 系可以通过不改变视见 体的前后平面 z=zf和z= zb,的前后位置关系实现, 把这两个条件代入左式, 得:
像素
视点
图7.1 以像素为对象的消隐算法
y
窗口
2
x
z 平行投影
图7.2 以物体为对象的消隐算法
提
!
假定构成物体 的面不能相互 贯穿,也不能 有循环遮挡的 情况。
醒
(a)
(b)
贯穿和循环遮挡
如果构成物体的面不满足该假 定,可以把它们剖分成互不贯 穿和不循环遮挡的情况。
例如,用上图中的虚线便可把原来 循环遮挡的三个平面,分割成不存 在循环遮挡的四个面。
IJFGH,FABG,HCDI,IDEJ 所在的面为前向面 JEAF, DEABC,HGBC所在的面为后向面
2、判断后向面的方法
1)首先对多边形的顶点进行排序:设多边形F的顶点为 v1,v2,…,vL顶点 Vi 的坐标为 ( xi , yi , z i ) 。次序如图所示 2)判断后向面:如果v1,v2,…,vL构成凸的多边形,则向量
z f ( zc z f ) Az f B zb ( zc zb ) Azb B
AB如何求解??
A zc z f zb , B z f zb
7.2.1
基于窗口的细分算法
7.2.2 基于多边形的细分算法
概述 区域细分算法是一种分而治之(Divide-Conquer) 的算法,它把投影区域作为考察对象,如果很 容易确定投影区域内的多边形是否可见,便显 示这些多边形,否则将这些区域进一步细分, 随着不断细分,判断多边形的可见性将越来越 简单。本节介绍基于窗口的细分算法和基于多 边形的细分算法。
基本思想
把物体投影到全屏幕窗口上,然后递归的将窗口一分为 四,如果可以确定小窗口内的多边形是否可见,则显示 这些多边形,否则,将小窗口细分为更小的窗口,递归 地执行上述过程。
子分的过程
具体分析-关系判断
细分后都要对多边形和窗口就下面四种关系作判断: 1 2 窗口和多边形分离(图中情况1)
取半径为: 其中:
R
xl2 yl2 zl2
xmax xmin xl 2
zmax zmin ymax ymin zl yl 2 2
思路:把显然不可见的面去掉,减少消隐过程中的 直线求交数目
1、后向面 多面体表面多变形的法向可分为两种,一种是指向多面体 的外部,我们称之为外法向,一种指向多面体的内部,我 们称之为内法向。 必然有一些多边形表面的外法向指向与观察者相背离的方 向,这些多边形完全被多面体上其它 多边形遮挡。这些被遮挡的多边形 称为后向面。 首先消除掉这些面,去除后向面的过 程称为后向面消除。