第八章 隐藏线和隐藏面的消除

48
Computer Graphics 第第第 第第第第第第第第第第

Upload: kort

Post on 18-Jan-2016

95 views

Category:

Documents


9 download

DESCRIPTION

第八章 隐藏线和隐藏面的消除. 可见面判断的有效技术. 多面体隐藏线消除算法. 基于窗口的子分算法. 隐藏线和隐藏面的消除. 基于多边形的子分算法. z 缓冲器算法和扫描线算法. 优先级排序表算法. 光线投射算法. 曲面隐藏线的消除. 消隐的效果图. 隐藏线或 隐藏面消除. 相对于投影方向 平行投影. 相对于投影中心 透视投影. 确定线或 面可见 性. 在和投影点到像素连线相交的表面中,找到离观察点最近的表面; 用该表面上交点处的颜色填充该像素;. 判定场景中的所有可见表面; 用可见表面的颜色填充相应的像素以构成图形;. 两种基本算法. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第八章 隐藏线和隐藏面的消除

Computer Graphics

第八章 隐藏线和隐藏面的消除

Page 2: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics

隐藏线和隐藏面的消除

基于窗口的子分算法

zz 缓冲器算法和扫描线算法

光线投射算法

基于多边形的子分算法

优先级排序表算法

曲面隐藏线的消除

可见面判断的有效技术

多面体隐藏线消除算法

Page 3: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics

消隐的效果图

Page 4: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics

隐藏线或隐藏面消除 确定线或

面可见性

相对于投影中心透视投影

相对于投影方向平行投影

Page 5: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics

以构成图像的每一个像素为处理单元,对场景中的所有表面,确定相对于观察点是可见的表面,用该表面的颜色填充该像素

两种基本算法

以三维场景中的物体对象为处理单元,在所有对象之间进行比较,除去完全不可见的物体和物体上不可见的部分

在和投影点到像素连线相交的表面中,找到离观察点最近的表面;用该表面上交点处的颜色填充该像素;

判定场景中的所有可见表面;用可见表面的颜色填充相应的像素以构成图形;

Page 6: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.1 可见面判断的有效技术

场景有 N 个面,所有的面两两求交判定可见面, O(N2)场景有 N 个面,所有的面两两求交判定可见面, O(N2)

减少可见线和可见面判定计算量的常用的技术

非垂直投影转换成垂直投影 后向面消除边界盒

Page 7: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.1.1 边界盒

Page 8: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.1.1 边界盒

min 1 2 min 1 2

max 1 2 max 1 2

min( , ), min( , )

max( , ), max( , )

x x x y y y

x x x y y y

Q1Q2 边界盒

边的边界盒

Q5Q6 的边界盒

1max2min1max2min

2max1min2max1min

yyxx

yyxx

Page 9: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.1.2 后向面消除

后向面总是看不见的,而且别的棱也不会由于后向面的遮挡而成为不可见,因此,把后向面全部去掉并不影响消隐结果

IJFGH , FABG ,HCDI 和 IDEJ 前向面 其余为后相面

多边形表面

后向面表面的法向指向与观察者相背离

前向面外法线方向指向观察者

Page 10: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.1.2 后向面消除

顶点 ,顶点的坐标

LVVV ,,, 21

),,( iii zyx

多边形 F沿着顶点序列走时,其内部始终在他的右侧

1V

2V

3V

LV

若构成凸的多边形 是 F 内法线方向

12 ,111 Lkvvvv kka

大于零,外法线和 z轴正向的夹角大于 90度,后向面

z)(a

前向面0SP

后向面0SP

Page 11: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.2 多面体隐藏线消除算法

用线框方式来表示多面体,在这种表示方式下,多面体用棱边来表示

隐藏线便是不可见的棱边或棱边中不可见的部分

找到各棱边上可见和不可见部分的分界点

多面体的各棱边投影到oxy 平面上

在 oxy 平面上求棱边和棱边之间的交点

BC,BA,BG, EA为隐藏线单击看例子

Page 12: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.2.1 算法的基本思想

隐藏线消除实际计算过程 :

Step1Step1

确定可能遮挡体 A 的那些体集合 B ( 包括体 A 本身 ) 。

Step2Step2

A 的每个多边形G ,要从 B 中找出可能遮挡它的所有多边形的集合 C

Step3Step3

对多边形 G 的每一条边 L ,从集合 C 中找出可能遮挡它的所有多边形E

Step4Step4

求 L 和多边形 E中的边的交点,确定 L 的可见部分

Page 13: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer GraphicsStep4 的处理技术:

设边 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 却在多边形的前方,这种交点可不考虑

Page 14: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.2.2 确定边 L 和多边形 E 关系的技术

1. 确定 L 的顶点与遮挡多边形的前后位置关系

jv

记向量 ,则多边形 E 所在的平面方程为 (8.5)3 3 3( , ) [ ( ) ( )] /z x y z a x x b y y c

3 4 3 5( , , ) ( )a b c v v v v 3 4 5, , ,v v v任意取多边形 E 不在一条直线上的三个顶点,设为

设点 的坐标为 若 ,则 在多边形所在平面的前面,否则认为 在多边形所在平面的后面。

( , , )j j jx y z ( , )j j jz x y z jv

jv

( , )j jz x y

jv

iv

( , )j j jz x y zjz

Page 15: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics

上对应的交点在多边形所在平面的前面,否则在后面。

判断边 vivj 和多边形 E 在 oxy 平面的投影之间是否有交点,可通过求边vivj 和 E 的边界在 oxy 平面上投影是否相交实现

在 vivj 平面的投影线段的参数方程为 (8.6)   多边形上任一边 vkvk+1 在 oxy 平面上的投影为

(8.7)

联立 (8.6) 和 (8.7) ,解方程得

2. 确定 L 与遮挡多边形的交点和遮挡多边形的前后位置关系

(1 )

(1 )

i j

i j

x x s x s

y y s y s

1

1

(1 )

(1 )k k

k k

x x t x t

y y t y t

1 1[( )( ) ( )( )] /

[( )( ) ( )( )] /k i k k k i k k

i k j i j i i k

s y y x x x x y y R

t x x y y x x y y R

1 1( )( ) ( )( )k k j i k k j iR x x y y y y x x

0 , 1s t 边和线段 vivj 在 oxy 平面上的投影才有交点

1(1 ) (1 )i j k kz s z s z t z t

jivv (1 )i jz s z s

1(1 )k kz t z t

Page 16: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics

由式 (8.9) 可知 ,其中 表示向量 在 z 轴上的投影。

3. 确定交点和多边形的关系:是进点还是出点

1( )k k i j zR w w w w $$$$$$$$$$$$$$$$$$$$$$$$$$$$

( )zA A

1 1, ,k k i j k k i jw w w w $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

w w w w

QiQj 进入或走出多边形

当 时, 由多边形外进入多 边形内(该交点称为进点)

0R i jw w$$$$$$$$$$$$$$

当 时, 由多边形内离开多边形到多边形外(该交点称为出点)。

0R i jw w$$$$$$$$$$$$$$

满足右手系

Page 17: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics4. 确定 点和多边形的关系iw

判断 点在多边形内或外,可以从 点出发沿 x 轴的正向作一条射线 若该射线和多边形边界的交点个数是奇数,则 在多边形内 若该射线和多边形边界的交点个数是偶数,就在多边形外 由于舍入误差,可得到完全不同的结果

5w 7w

6w

8w

1w

2w3w

4w

iw

iw

iw

无交点

奇交点

单处理iw

偶交点

iwiw

iw

1 1( )( ) / ( )k k k k k ky y y x x x x y

iy y 1k kw w 把 代入 的方程

1 1( )( ) / ( )k k i k k k kx x x y y y y x 得

ixx Fwi若

1kk ww说明

有一个交点。

Page 18: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.2.3 确定 L 的可见部分

不可见阶 它是一个数字,代表了边上从该点到下一个交点的部分被几个多边

形遮挡 与所有多边形的交点进行由小到大的顺序排序ji ww

1,,,,,0 1210 nn sssss 不可见阶的确定

1确定边起始顶点处的不可见阶。将阶置为覆盖该点的多边形的个数。

2确定边 与遮挡多边形各交点处的不可见阶。交点为进点则 不可见阶加 1 ,交点为出点则 不可见阶减 1

ji ww

原则:若 处不可见阶为 0 ,则由参数 和 所对应的直线段是可见的,否则为不可见is is1is

Page 19: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.3 基于窗口的子分算法

Page 20: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.3 基于窗口的子分算法

多边形与窗口的关系:

Page 21: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.3 基于窗口的子分算法

所有多边形均和窗口分离,这时只要把窗口内所有的像素填上背景色

只有一个多边形和窗口相交,或这个多边形包含在窗口内。这时,先对窗口内每一像素填上背景颜色,再对窗

口内多边形部分用扫描线算法填色

只有一个包围窗口的多边形,则窗口用包围多边形的颜色填充。

多个多边形和窗口的关系分别是相交、内含或包围,但是有一个包围窗口的多边形在其他多边形前面,整个窗口用该包围多边形的颜色填

窗口分割的结束条件

不成立的窗口将再一分为四

Page 22: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.3 基于窗口的子分算法

提高效率的有效的处理技术

排序

对所有的多边形按其顶点的 z 坐标最大值来排序

细分

每次细分窗口后,用边界盒的办法判断多边形序列中的多边形是否和四个子窗口相交,不相交的多边形可从多边形序列中排除

若窗口被多边形 G 包含,被 G 遮挡的多边形要从窗口的多边形序列中去掉

E

A

窗口

zmax

zmin

B

C

D

G

H

F

图 8.12 确定被遮的挡多边形

izz maxmin CD 被 AB 遮挡

GH zz AB 遮挡了 EF

Page 23: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.4 基于多边形的子分算法

算法描述: 各多边形在深度方向作初步的排序

多边形序列中的第一个多边形( 裁剪多边形 )作为裁剪窗口

区域内多边形

确定内部表中多边形的前

后顺序

区域外多边形

外部表中同样的工作 裁剪过程要

重复到外部表中不再有多边形为止

Page 24: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.4 基于多边形的子分算法

z

x

y

4

3

2

1

2i 3i

4i 4o

a) ni 为窗口内的多边形表, n=2,3,4 ; b) no 为窗口外的多边形表 ,n=3,4图 8.14 消隐多边形的裁剪

3o

例子

Page 25: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.5 z 缓冲器算法和扫描线算法

u

v

n

umax

vmax

基本思想:

Page 26: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics

具体实现此算法需要 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] ,否则 说明此点离观察者较远,两个数组的值 都不用改变

8.5 z 缓冲器算法和扫描线算法

x,y( )

Page 27: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.5 z 缓冲器算法和扫描线算法

克服

Page 28: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics扫描线 z 缓冲器算法

算法思想

Page 29: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.5z 缓冲器算法和扫描线算法

每处理一条扫描线,都要检查各多边形是否和该线相交,还要计算多边形所在平面上很多点的 z值,需要花费很大的计算

采取类似多边形扫描转换的扫描线算法处理,提高效率

x,y( )

Page 30: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.5z 缓冲器算法和扫描线算法

数据结构数据结构

1多边形 Y 筒

系数 a , b , c和 dΔy 属性 color编号 IP

2边 Y 筒

上端点 x 坐标的值Δy Δx 编号 IP

3

多边形活化表 .

多边形活化表中记录了在 平面上的投影和当前考虑的扫描线相交的多边形

4

边活化表

边活化表中存放多边形的边和当前扫描线相交的边对

Page 31: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics

3 6 7 8 1110

11

9

8

7

1

3

Ⅰ Ⅱ

图 8.15 要消隐的物体

xo

多边形 y筒

边 y筒

1/710 7 2

8 2 1 2

多边形活化表

1,,,

;3,0,7

;3,1,4

111IPzzz

yxx

yxx

yxl

rrr

lll

2,,,

;5,7

1,

7

210

;5,6

5,

6

56

222IPzzz

yxx

yxx

yxl

rrr

lll

边活化表

Page 32: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics算法如下

建立多边形 Y筒和边Y 筒,初始化多边形和边的活化表为空。

1TEXT

2

以最上面的扫描线为当前扫描线。

4

检查多边形 Y 筒若有新的多边形涉及当前扫描线,则把它放入多边形活化表中。若有新的多边形加入多边形活化表,则要把该多边形在 平面上的投影和扫描线相交的边对加入边活化表中。

对当前扫描线 y ,把帧缓冲器相应行置成底色,z 缓冲器的各单元放 z 的极小值

3

若所有扫描线都已经处理完,则算法结束,否则选下一条扫描线为当前扫描线,转步骤 3

65

对边活化表中的每个边对,令 ,对每一个满足 的坐标为 的像素从左到右依次进行处理。

lx zz

rl xxx

),( yx

Page 33: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics对边活化表和多边形活化表修改

1 )、修改边活化表,对每一边做如下计算

若 Δyl 或 Δyr小于 0 ,相应的边就要从一个边对中去掉,并从 y 筒中找到合适的边来代替。若这两条边同时结束于某一点,则去掉这一边对。若 Δyl和 Δyr都不小于 0 ,则修改 为

修改后的表便是新扫描线的边活话表。2 )、修改多边形活化表。令 ,若 ,则将该多边形

从多边形活化表中删除。

1 -y y1, -y y rrll

算法步骤: -- 对边活化表修改

r r r l l lx x x x x x

ylxll z xzz z

llr zxx ,,

1 yy 0y

Page 34: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.6 优先级排序表算法

模拟示例

Page 35: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.6 优先级排序表算法

算法思想 优先级排序表算法按多边形离观察者的远近来建立一个

多边形排序表,距观察者远的优先级低,近的优先级高 从优先级低的多边形开始,依次把多边形的颜色填入帧

缓冲存储器中 表中距观察者近的元素覆盖帧缓冲存储器中原有的内容 当优先级最高的多边形的图形送入帧缓冲器后,整幅图

形就形成了

Page 36: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.6 优先级排序表算法

优先级排序表算法的关键在于对多边形做正确的排序动态的算法:

1. 根据每个多边形顶点 z 坐标的极小值 zmin 的大小,按由小到大对它们做初步排序,并把它们组成一个链表

2. 若链表中只有一个多边形,则算法结束。否则取表头多边形为 P。

3. 设 Q 为链表中 P之外的任一多边形。若对所有 Q 都有 > , 则 P不会遮挡其它多边形,为优先级最低的多边形,在链表中去除 P,转( 2 );否则,若所有 Q 都满足下面四项条件中的一项,则在链表中去除 P,转( 2)。若不满足此四项条件中任何一个的 Q ,交换 P和Q ,转( 3 )。

minzQmaxzP

Page 37: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics四项条件

P 和 Q 在 平 面 oxy上的投影不相交

Q 的各顶点均在P的近视点的一

P 的各顶点均在 Q 的远离视

点的一侧

P和 Q 在 oxy 平面上投影的边界盒在 x 或 y 方向上不相交

Page 38: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics特殊情况

解决:图 8.22 ,把多边形序列中原多边形 P从序列中去掉,而把 P分成的两个多边形加入链表中,这样可避免使多边形 P和 Q不断地循环进行交换

图 8.21 互相遮挡

图 8.22 用 Q 所在平面把 P 一分为二

Page 39: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics用来解决动态显示问题时用来解决动态显示问题时 ,,可大大提高效率可大大提高效率

对飞机驾驶员着陆进行模拟训练时要显示消隐后的跑道周围情况,这时景物是不变的,仅视点发生变化。可对不同的视点位置把景物的优先级排序表预先算好,然后再用油画家算法显示图形,这样便可使消隐过程加速,实现动态显示

图 8.23 视点在不同区域有不同的优先级

A

①②③

B

②①③

C

③②①

D

③①②

视点所在区域

 

优先级表

优先级表

Page 40: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.7 光线投射算法

原理:要处理的场景中有无限多条光线,从采样的角度讲我们仅对穿过像素的光线感兴趣,因此,可考虑从像素出发,逆向追踪射入场景的光线路径

Page 41: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics具体做法是:

由视点出发穿过观察平面上一像素向场景发射一条射线 ( 如图 8.25)

求出射线与场景中各物体表面的交点 离视点最近的交点的颜色即为像素要填的颜色。 光线投射算法对于包含曲面,特别是包含球面的场景有很高的效率。

图 8.25 一条由象素点射入场景的视线

Page 42: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics

z 缓冲器算法 :每次处理一个面片 ,对面片上的每个投影点计算z值,计算出来的值与以前保存的 z值进行比较,从而确定每个像素所对应的可见面片

光线投射算法可看作是 z 缓冲器算法的一

种变形

光线投射算法 :每次处理一个像素,并沿光线的投射路径计算出该像素所对应的所有面片的 z值。

Page 43: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.8 曲面的隐藏线消除

),( zxfy

(a)未消隐的曲面表示

(b) 消隐的曲面表示

( , ), 0,1,2, ,iy f x z i n

( , ), 0 1 2jy f x z j , , , ,m

( 1) ( 1)n m

, 0,1,2, ,iz z i n , 0 1 2jx x j , , , ,m

),( zxfy

Page 44: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.8 曲面的隐藏线消除

参考文献 [6] 中,简单的算法 先考虑对应 z=zi=const 的一族曲线的消隐算法。

如果图形显示器在水平方向有M个象素,则建立M 个内存单元 ,在这些单元是先放上初值,初值应取成小于 min{ ( , )}if x z

][ jyT

M 初值

Page 45: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.8 曲面的隐藏线消除

设 平面 是最靠近观察者的,从平面 对应的曲线 开始,对水平方向每个像素的对应 坐标值 平面对应的曲线上的点都是可见的 . 处理完 平面对应的曲线后,然后对平面 对应的曲线做如

下处理 若 是可见点,并把 内容换成 若 是不可见点, 内容不变。

一条一条曲线进行处理,就得到一组消除隐藏线的曲线族

0 , 0,1,2, , 0iz z ih i n h

nzz nzz

( , )ny f x z x jx

( , )jn j ny f x z

nzz

nzz 1 nzz

][ jyy Tjn ),,( njnj zyx ][ jyT jny][ jyy Tjn ),,( njnj zyx ][ jyT

Page 46: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.8 曲面的隐藏线消除

左边的图是没有经过消隐的三条曲线,右边的图是经过消隐后的三条曲线。

图 8.27 一组曲线族的消隐过程

Page 47: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.8 曲面的隐藏线消除

上述方法对图 8.26 中的曲面的凹下部分是不适用的(图中c处)。

解决办法:建立M个单元 。它的初值取成大于 ,

图8.26

c

M

][ jyT

][ jyB

max{ ( , )}if x z

Page 48: 第八章 隐藏线和隐藏面的消除

Computer GraphicsComputer Graphics8.8 曲面的隐藏线消除

每次求出若 或 则 可见 否则不可见

若 则 若 则 用 和 两族曲线表示曲面 时实现消隐的正确做法:

对两族曲线一起做即处理好平面 上 至 一段曲线后,立即处理平 面 上 至 的一段曲线, 如图 8.28 所示

0( , ), , , 1, , 0, 0 1, 2,ji j i iy f x z z z ih i n n j M , ,

][ jyy Tji ][ jyy Bji ( , , )j ji ix y z

jiT yjy ][

jiB yjy ][

][ jyy Tji

][ jyy Bji

kx xz

x

y

iz z

视点

1iz z

1kx x

),( zxfy j ),( izxfy

kxx

1 izz izz

izz 1 kxxkxx

图8.26