计算机图形学 消隐

合集下载

计算机图形学 机械工业出版社第七章 消隐

计算机图形学  机械工业出版社第七章 消隐
第七章 消除隐藏线和隐藏面的算法
人不能一眼看到一个三维物体的全部表面。从 一个视点去观察一个三维物体,必然只能看到 该物体表面上的部分点、线、面,而其余部分 则被 这些可见部分遮挡住。如果观察的是若干 个三维物体,则物体之间还可能彼此遮挡而部 分不可见。因此,如果想有真实感地显示三维 物体,必须在视点确定之后,将对象表面上不 可见的点、线、面消去。执行这一功能的算法, 称为消隐算法 消隐算法。 消隐算法
y ji = f ( x j , zi ), i = n, n − 1, L ,1, j = 1,2, L y ji = yu ( j )或y ji < yl ( j ) 若
则(xi,yji,zi)为可见,并按如下原则修改yu(j)或yl(j) 的值: 若y > y ( j ),则y ( j ) = y
–1、线消隐 采用线框模型表示物体时,消隐对象是物体上的 边,消除的是物体上不可见的边。 –2、面消隐 采用表面模型表示物体时,消隐对象是物体上的 面,消除的是物体上不可见的面。
1、消除隐藏线
对造型的要求
– 在线框显示模型中,要求造型系统中有面的信息,
最好有体的信息,否则可能产生二义性。
最基本的运算
C k
1、凸多面体的面可见性
具体计算时,n和k记作n(nx,ny,nz),k(kx,ky,kz) 则有: n k +n k +n k nk
cos α = | n || k | =
x x y y z z 2 2 2 nx + n y + nz2 ⋅ k x2 + k y + k z2
分母为正,若分子为正,则 0 ≤ α < π / 2 ,面 可见;若为负,则 π / 2 < α ≤ π ,面不可见; 若为0,则 α = π / 2 ,此面退化为线。

计算机图形学消隐算法

计算机图形学消隐算法

图9-1 区间扫描线算法原理
算法首先为各多边形建立一张边表和一张多边形表。边表需包含的内容有:进行消隐的场景中所有线段的端点坐标、线段斜率的倒数、指向多边形表中对应多边形的指针。多边形表需包含的内容有:各多边形的平面方程系数、各多边形的颜色值、指向边表的指针。在消隐算法执行的过程中,从边表和多边形表中提取信息,构造一张有效边表。有效边表中包含与当前扫描线相交的边,按x的升序进行排列。排列后这些边将扫描线分成一个个的子区间[xi, xi+1],如图9-2,可将扫描线上的子区间分为三种类型:
递归进行上述空间剖分和景物分类过程,直至每一子空间中所含景物少于给定的阈值为止,可表示成一棵BSP树,图9-14(b)示出了图9-14(a)的分割过程和形成的分类景物。对于由多边形组成的场景,常选择与某一多边形重合的平面作为分割平面。一旦构造完BSP树,即可依据当前视点所在的位置,对场景中每一分割平面所生成的两个子空间进行分类,其中包含视点的子空间标记为“front”,位于分割平面另一侧的子空间标记为“back”。然后,递归搜索场景的BSP树,优先绘制标识为“back”的子空间中所含景物。
c. 判别B上平面A与B的重叠平面是否完全位于A之前,若是,将A按先进先出原则加入N中,转(2);否则继续。
d. 判别多边形A和B在xoy平面上的投影有无重叠,若无重叠,则A、B在队列中的顺序无关紧要,将A按先进先出原则加入N中,转(2);否则在A与B投影的重叠区域中任取一点,分别计算出A、B在该点处的z值,若A的z值小,说明A距视点远,优先级低,将A按先进先出原则加入N中,转(2);若A的z值大,则交换A和B的关系,即将B看作是当前处理对象,转(3)进行M中其它多边形的判别。
深度缓存器算法最大的优点是算法原理简单,不过算法的复杂度为O(N),N为物体表面采样点的数目。另一优点是便于硬件实现。现在许多中高档的图形工作站上都配置有硬件实现的Z-buffer算法,以便于图形的快速生成和实时显示。

计算机图形学课件:第9章消隐

计算机图形学课件:第9章消隐

9.6 BSP树算法
算法原理 实例说明
Q back front
D C
B
投影线
P
front P
back
front
Q front
back Q front
A
back
back
DB
CA
(a) 空间剖分
(b) 形成的BSP树
图9-14 BSP算法原理
9.7 多边形区域排序算法
算法思想:
将多边形按深度值由小到大排序,用前面 的可见多边形去切割位于其后的多边形,使得最 终每一个多边形要么是完全可见的,要么是完全 不可见的。
Z-buffer
00 0 0 0 0 0 00 0 0 0 58000 0 0 00 0 0 0
帧缓存
问题:计算采样点(x,y)的深度z(x,y)。 假定多边形的平面方程为:Ax+By+Cz+D=0。
z(x, y) Ax By D C
利用连贯性加速深度的计算:
y 多边形
y
y-1
算法特点: ①算法简单。 ②需较大的存储空间。 ③处理反走样、透明和半透明效果困难。
对于③ ,可以使用A缓冲器算法克服。
9.2 区间扫描线算法
算法原理:
避免对被遮挡 区域的采样是 进一步提高扫 描线算法计算 效率的关键。
y B2 A2
0
A1 B1
AB
A3
B3
C2
扫描线1 C1
扫描线2 扫描线3
B4 C C4 C3 x
图9-3 区间扫描线算法原理
9.3 深度排序算法(画家算法)
算法原理:
若场景中任何多边形在深度上均不贯穿 或循环遮挡,则各多边形的优先级顺序可完 全确定,扫描转换就可以按从优先级低的多 边形到优先级高的多边形的顺序进行。

计算机图形学——隐藏线和隐藏面的消除(消隐算法)

计算机图形学——隐藏线和隐藏面的消除(消隐算法)

计算机图形学——隐藏线和隐藏⾯的消除(消隐算法)⼀、概述由于投影变换失去了深度信息,往往导致图形的⼆义性。

要消除⼆义性,就必须在绘制时消除被遮挡的不可见的线或⾯,习惯上称作消除隐藏线和隐藏⾯(或可见线判定、可见⾯判定),或简称为消隐。

经过消隐得到的投影图称为物体的真实感图形。

下⾯这个图就很好体现了这种⼆义性。

消隐后的效果图:消隐算法的分类所有隐藏⾯消隐算法必须确定:在沿透视投影的投影中⼼或沿平⾏投影的投影⽅向看过去哪些边或⾯是可见的两种基本算法1、以构成图像的每⼀个像素为处理单元,对场景中的所有表⾯,确定相对于观察点是可见的表⾯,⽤该表⾯的颜⾊填充该像素.适于⾯消隐。

算法步骤:a.在和投影点到像素连线相交的表⾯中,找到离观察点最近的表⾯;b.⽤该表⾯上交点处的颜⾊填充该像素;2、以三维场景中的物体对象为处理单元,在所有对象之间进⾏⽐较,除去完全不可见的物体和物体上不可见的部分.适于⾯消隐也适于线消隐。

算法步骤:a.判定场景中的所有可见表⾯;b.⽤可见表⾯的颜⾊填充相应的像素以构成图形;提醒注意1.假定构成物体的⾯不能相互贯穿,也不能有循环遮挡的情况。

2.假定投影平⾯是oxy平⾯,投影⽅向为z轴的负⽅向。

如果构成物体的⾯不满⾜该假定,可以把它们剖分成互不贯穿和不循环遮挡的情况。

例如,⽤图b中的虚线便可把原来循环遮挡的三个平⾯,分割成不存在循环遮挡的四个⾯。

⼆、可见⾯判断的有效技术1、边界盒指能够包含该物体的⼀个⼏何形状(如矩形/圆/长⽅体等),该形状有较简单的边界。

边界盒技术⽤于判断两条直线是否相交。

进⼀步简化判断2、后向⾯消除(Back-face Removal)思路:把显然不可见的⾯去掉,减少消隐过程中的直线求交数⽬如何判断:根据定义寻找外(或内)法向,若外法向背离观察者,或内法向指向观察者,则该⾯为后向⾯。

注意:如果多边形是凸的,则可只取⼀个三⾓形计算有向⾯积sp。

如果多边形不是凸的,只取⼀个三⾓形计算有向⾯积sp可能会出现错误,即F所在的⾯为前向⾯也可能出现sp≥0的情况,因此,需按上式计算多边形F的有向⾯积。

计算机图形学-第7章-消除隐藏线和隐藏面

计算机图形学-第7章-消除隐藏线和隐藏面
第七章 隐藏面的消除
这一章我们将介绍消除隐藏面的方 法。
7.1 概述
第一章我们曾将输出的图形分为线条图和具 有明暗效果的真实感图形(面图),在绘制 或显示三维图形时,无论采用那种图形表示 三维形体,都要消除不可见的线或面,即消 除隐藏线或隐藏面(简称消隐),它是计算 机图形学的重要内容,其算法有很多种,本 章只介绍隐藏面的消除。
对于某一个面片,a/c是常数,故沿扫描线 的后续点的深度值,可由上式仅执行一次 加法计算即可求出。
对于每条扫描线,首先计算出与其相交的多 边形最左边的交点所对应的深度值,然后, 该线上所有后续点由式(7.14)计算。
计算每个面片左边界的深度值
如图所示,由最上方顶点出发,沿多边形 的左边递推地计算各点的z坐标
7.2.1 平面多边形的外法矢量
为了判别物体上各表面是朝前面还是朝后
面,需求出各表面(平面多边形)指向体外
的法矢量。设物体在右手坐标系中,多边
形顶点按逆时针排列。当多边形为凸多边
形时,则其法矢可取成多边形相邻两边矢
量的叉积。
P3
n
n p1 p2 p2 p3 P1
P2
这种算法虽然简单,但当多边形为凹多边形 时,则可能出现错误,即所求的多边形法矢 量指向体内。这时可采用如下的计算方法。
设n={A,B,C},而
n
A ( yi y j )(zi z j ) i 1 n
B (zi z j )(xi x j ) i 1 n
C (xi x j )( yi y j ) i 1
式中若 i n,则j=i+1;否则i=n,j=1。 以上算法适合任何平面多边形。
非平面但接近平面的多边形的最佳逼近平面 的法矢量也可用此算法求出。为避免在程序 中出现两种计算平面外矢量的方法,建议凸 多边形也采用该算法计算外法矢量。多边形 所在平面的方程可写成

计算机图形学实验报告消隐

计算机图形学实验报告消隐

计算机图形学实验报告计算机图形学实验报告姓名徐沛华班级1011 学号20101851 成绩实验名称消隐——扫描线算法实验目的1.消除物体在平面上展现的二义性2.掌握扫描线算法实验步骤基本思想:按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。

对于一条扫描线填充过程可以分为四个步骤:(1) 求交:计算扫描线与多边形各边的交点(2) 排序:把所有交点按x 坐标递增顺序来排序(3) 配对:确定扫描线与多边形的相交区间,第一个与第二个,第三个与第四个等等,每对交点代表扫描线与多边形的一个相交区间(4) 填充:显示相交区间的象素实验代码:#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<graphics.h>void draw(int x1,int y1,int x2,int y2,int delta){int nx1,ny1,nx2,ny2;nx1=x1,ny1=y2-delta,nx2=x1+delta,ny2=y2;while((ny1>=y1)&&(nx2<=x2)){line(nx1,ny1,nx2,ny2);ny1-=delta;nx2+=delta;}if(nx2>x2){ny2-=nx2-x2;nx2=x2;while(ny1>y1){line(nx1,ny1,nx2,ny2);ny1-=delta;ny2-=delta;}nx1+=y1-ny1;ny1=y1;while(nx1<x2){line(nx1,ny1,nx2,ny2);nx1+=delta;ny2-=delta;}}else{nx1+=y1-ny1;ny1=y1;while(nx2<x2){line(nx1,ny1,nx2,ny2);nx2+=delta;nx1+=delta;}ny2-=nx2-x2;nx2=x2;while(ny2>y1)}ny2-=nx2-x2;nx2=x2;while(ny2>y1){line(nx1,ny1,nx2,ny2);ny2-=delta;nx1+=delta;}}}int main(void){int x1,y1,y2,x2,delta;int driver=DETECT,mode;printf("Please input lefttop(x1,y1) and rightbottom(x2,y2) of rectangle and delta:\n"); scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&delta);initgraph (&driver,&mode,"C:\\TC");rectangle(x1,y1,x2,y2);draw(x1,y1,x2,y2,delta);gotoxy(1,1);printf("Press any key to exit!");getch();closegraph();return 0;}。

计算机图形学-消隐

计算机图形学-消隐
16
共四十四页
1. 消除 自隐线、面 (xiāochú)
对于多面体的任一个面,可以根据其外法向
E
n和视矢量E的夹角θ来进行可见性检测。
法向n:规定每个多边形的法向都是指向物 体外部(wàibù)的。
前向面: θ∈(-90°,90°)时,表示该表 E 面可见,称为前向面。
后向面: θ∈[90°, -90°]时,表示该表 面不可见,称为后向面 。
θn
n 前向面 n
后向面
剔除依据:后向面总是被前向面所遮挡,从而不可见。不会 由于后向面的遮挡,而使别的棱成为不可见的。因此计算时, 可以把这些后向面全部去掉,这并不影响消隐结果。
17
共四十四页
1. 消除 自隐线、面 (xiāochú)
图中的JFAE、HCBG和 DEABC所在(suǒzài)的面均 为后向面。其它为前向 J
也称表优先级算法。
30
共四十四页
1. 画家 算法 (huàjiā)
关键:如何对场景中的物体表面按深度(远近(yuǎnjìn))排序,建立深 度优先级表?
先讨论在深度优先级排序中两个多边形P和Q之间的关系。多边形可以 按其最大或最小z值徘序,不妨假设按多边形的最大z值进行预排序,即
zmax(P)>zmax(Q)。
消隐(xiāo yǐn)
1
共四十四页
消隐(xiāo yǐn)
1 概述(ɡài shù) 2 线消隐 3 提高消隐算法的效率 4 面消隐
2
共四十四页
1 概述(ɡài shù)
什么叫做“消隐”?为什么要进行(jìnxíng)“消隐”?
将三维场景绘制在计算机二维显示屏上必须经过投影变换,投影 变换将三维信息变换到二维平面上,这个过程中深度信息被丢失, 生成的图形往往具有二义性。

计算机图形学第八章

计算机图形学第八章
深度相关性:物体的同一表面上的相邻部分深度是相近的。
2. 包围盒技术 用于对物体间的某些关系进行比较和测试,从而可避免盲
目的求交运算,减少计算量,提高效率。 二维图形 ----- 包围框(重叠测试); 三维物体 ----- 包围盒、包围球。
3. 背面剔除 一个平面多面体的表面由若干个
平面多边形构成,若一个多边形表面 的外法线方向与投影方向(观察方向) 的夹角为钝角,则该面为前向面;若 其夹角为锐角,则为后向面或背面。
后续各点的深度值。
jz
o
i i+1
x
③ 计算多边形边界上(对应于边的投影与扫描线交点处)的深
度值
设 L 为多边形 Fk的一条边,与扫描线 j 的交点为 Xj ,
则多边形 Fk 在交点( Xj ,j )处的深度为:
axj + bj + d
Zj =—
c
当扫描线向上移动一条,即 y=j+1 时,边 L 与扫描线的交
扫描线数相同。
4
3
根据各边两端点中较 2



1
小的 y 坐标,将其放入
ⅡYmaxΔX X z


相应的桶内。
④ 有效边表 AET(边活化表) 记录多边形边界与当前扫描线相交的各个边对的信息。 xl:左交点的x坐标值;
Δxl:左交点所在边和相邻扫描线交点的x坐标之差; ylmax:左侧边两端点中较大的 y 值; xr,Δxr, yrmax :右交点对应的三个量; zl:左交点处多边形所在平面的深度值; Δzx:沿扫描线向右走过一个象素时,多边形所在平面深度的增
D
C
A
B
投影方向
4. 活化表技术 ( active list ) 设置活化表,用于存放与当前的处理相关的信息,从而可
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十一讲 面消隐
?基本概念 ?提高消隐算法效率的常见方法 ?画家算法 ?Z缓冲器算法 ?扫描线Z缓冲器算法 ?区域子分算法 ?光线投射算法
-
基本概念
产生真实感的方法之一: 反映三维场景中的相互遮挡关系
面消隐与线消隐
表面模型与线框模型 物体表面:平面与曲面 面消隐对象: 由平面多边形构成的多面体
-
基本概念
2)然后按照从表头到表尾的顺序逐个绘制物 体。
-
画家算法
关键:如何对场景中的物体按深度(远 近)排序,建立深度优先级表? 一种针对多边形的排序算法如下:
假定在规范化投影坐标系uvn中,投影方向是n 轴的负向,因而n坐标大距观察者近。记nmin(P) nmax(P)分别为多边形P的各个顶点n坐标的最小 值和最大值,算法步骤如下:
-
提高消隐算法效率的常见方法 1
利用连贯性
物体连贯性 面的连贯性 区域连贯性 扫描线的连贯性 深度连贯性
-
提高消隐算法效率的常见方法 2
将透视投影转换成平行投影 消隐与透视关系密切,体现有:
1)消隐必须在投影之前完成; 2)物体之间的遮挡关系与投影中心(视点)的选 取有关; 3)物体之间的遮挡关系与投影方式有关
-
提高消隐算法效率的常见方法 3
图12.3 加入面消隐步骤的三维图形显示 流程图 p285 (参见图8.30 p162)
图12.4 先将透视投影转换成平行投影,南 后再消隐 p285 (参见图8.33 p167)。 (避免除法,提高了效率)
-
提高消隐算法效率的常见方法 4
包围盒技术
定义:一个形体的包围盒指的是包围它的简单形体。
-
提高消隐算法效率的常见方法 6
复杂度比较:
不妨假定每个小区域的相关物体表中平均有h个物 体,场景中有k个物体,由于物体在场景中的分布是分 散的,显然h远小于k。根据第二种消隐方法所述,其 算法复杂度为O(h*h),远小于O(k*k)。
-
提高消隐算法效率的常见方法 7
物体分层表示
表示形式:模型变换中的树形表示方式 原理:减少场景中物体的个数,从而降低算法复杂度。 方法: 将父节点所代表的物体看成子节点所代表物体 的包围盒,当两个父节点之间不存在遮挡关系时,就 没有必要对两者的子节点做进一步测试。
消隐算法的分类 1)类:以窗口内的每个像素为处理单元;
for (窗口内的每一个像素) { 确定距视点最近的物体,以该物体表面的颜色来显示像
素}
2)类:以场景中的物体为处理单元;
for (场景中的每一个物体) { 将其与场景中的其它物体比较,确定其表面的可见部分; 显示该物体表面的可见部分; }
-
基本概念
step 3.1: 对有的Q,有nmax(P)< nmin (Q), 则多边形的确距观察点最远,
它不可能遮挡别的多边形。令L = L – {P}, 返回step 2;
step 3.2: 存在某一个多边形Q,使nmax(P) > nmin (Q),需进一步判别: step 3.2.1 若P,Q投影P’,Q’的包围盒不相交,则P,Q在表中的次序不重要,
-
画家算法
Step 1:将场景中所有多边形存入一个线性表(链表或数组),记为L; Step 2: 如果L中仅有一个多边形,算法结束;否则根据每个多边形的nmin对它们预
排序。不妨假定多边形P落在表首,即nmin(P)为最小。再记Q为L – {P}(表中其 余多边形)中任意一个; Step 3: 判别P, Q之间的关系,有如下二种:
父节点之间的遮挡关系可以用它们之间的包围盒 进行预测试。
-
画家算法
由来:画家的作画顺序暗示出所画物体之间的
相互遮挡关系
算法基本思路:
1)先将场景中的物体按其距观察点的远近进 行排序,结果放在一张线性表中;(线性表构造:
距观察点远的称优先级低,放在表头;距观察点 近的称优先级高, 放在表尾。该表称为深度优先级表)
令L = L – {P}, 返回step 2;否则进行下一步。 step 3.2.2 若P的所有顶点位于Q在平面的不可见的一侧,则P,Q关系
正确,令L = L – {P}, 返回step 2;否则进行下一步。 step 3.2.3 若Q 的所有顶点位于P所在平面的可见的一侧,则P,Q关系正
确,令L = L – {P}, 返回step 2;否则进行下一步。 step 3.2.4 对P,Q投影P’,Q’求交,若P’,Q’不相交,则P,Q在表中的次序不
重要,令L = L – {P}, 返回step 2;否则在它们所相交的区域中任取一点,计算 P,Q在该点的深度值,如果P的深度小,则P,Q关系正确,令L = L – {P}, 返回 step 2;否则交换P,Q,返回step 3.
-
画家算法
本算法不能处理的情况: 多边形循环遮挡 多边形相互穿透
解决办法:分割成两个
剔除依据: 物体表面是封闭的,背面总是 被前向面所遮挡,从而始终是不可见的。
-
提高消隐算法效率的常见方法 6
空间分割技术
依据:场景中的物体,它们的投影在投影平面上 是否有重叠部分?(是否存在相互遮挡的可能?)对 于根本不存在相互遮挡关系的物体,应避免这种不必 要的测试。
方法:将投影平面上的窗口分成若干小区域;为 每个小区域建立相关物体表,表中物体的投影于该区 域有相交部分;则在小区域中判断那个物体可见时, 只要对该区域的相关物体表中的物体进行比较即可。
-
Z缓冲器算法
由来: 帧缓冲器 – 保存各像素颜色值 z缓冲器 --保存各像素处物体深度值
比如,…
该技术常用于: 避免盲目的求交测试;
各种物体间的比较等。
一个好的包围盒要具有两个条件:
包围和充分紧密包围着形体; 对其的测试比较简单。 例:使用矩形包围合及长方体包围合来提高算法效 率…
-
提高消隐算法效率的常见方法 5
背面剔除
外法向 外法向与投影方向(观察方向)的夹角 前向面与后向面(背面)
算法复杂度 假设场景中有k个物体,平均每个物体表 面由h个多边形构成,显示区域中有m x n 个像素,则:
第一种算法的复杂度为:O(mnkh) 第二种算法的复杂度为:O((kh)*(kh))
-
提高消隐算法效率的常见方法
利用连贯性 将透视投影转换成平行投影 包围盒技术 背面剔除 空间分割技术 物体分层表示
相关文档
最新文档