第5讲 计算机图形学消隐算法
计算机图形学消隐算法
图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算法,以便于图形的快速生成和实时显示。
消隐算法
3.消隐中主要考虑的基本问题
• (2)相关性correlativity(连贯性) • 所谓相关性问题是指形体之间或一个 形体的各部分之间引起隐藏现象改变 的相互关系。即场景的可见性在局部 区域内保持不变的倾向 • 通常利用连贯性,来提高排序过程的 效率。
连贯性问题:
• 扫描线的连贯性:
相邻两条扫描线上,可见面的分布情况相似。
一般平面物体的消隐算法 (凹多面体)
• 关于潜在可见面: • 对于单个凸多面体,它的表面不是全部 可见,就是全部不可见。其棱线的可见 性也只有这两种状况。 • 对于凹多面体则不同,它的棱线除了全 部可见、全部不可见外,还有部分可见、 部分不可见的情况 • 如根据外法线向量与视线向量夹角关系 判断得出的可见边9、10、11、12构成的 平面上,9—10全部可见;10—11全部不 可见,而11—12则部分可见 • 因此对凹多面体上经判断后得出的可见 面只能看作为潜在可见面,它上面的每 一条棱线最终的可见情况,还需作进一 步的判定。
• 深度连贯性:
同一表面上的相邻部分深度是相近的,而占据屏幕上同 一区域的不同表面的深度不同。这样在判断表面间的遮挡关系 时,只需取其上一点计算出深度值,比较该深度值即可得到结 果。
• 区域连贯性:区域指屏幕上一组相邻的像素,它们通常为同
一个可见面所占据,可见性相同。区域连贯性表现在一条扫描 线上即为扫描线上的每个区间内只有一个面可见。
• 由向量N和V的数量积得:
N V N V cosθ N V cosθ N V
, 其正、负号与N V一致
(5)表面可见性判断
• 显然表面可见性取决于表 面外法线向量N与视线向 量V之间的夹角θ • 若为0°≤θ≤90°,则该表面 可见 • 若为90°<θ≤180°,则该 表面不可见 • 可得表面可见性判断依据 为: N V N V cosθ • 若N·V≥0,则该表面可见 • 若N· V<0,则该表面不可见 N V cosθ N V
5.4.2 三维图形消隐_计算机图形学教程(第2版)_[共6页]
202类似地可求得其他5个面与直线段的有效交点。
连接有效交点可得到落在裁剪窗口内的有效线段。
对于透视投影的棱台其方法类似,读者可自行推导。
3.三维中点分割裁剪法前面讨论的二维问题的中点分割裁剪方法可以直接推广到三维问题,其原理和过程是完全相同的。
对于平行投影和透视投影,仅仅是线段编码的处理和线段与体表面的交点计算不同,其他部分则完全相同。
只要对二维问题的编码数组和裁剪窗口的维数等进行修改,就可以得出对三维中点分割裁剪法的算法。
5.4.2 三维图形消隐1.消隐技术概述在现实世界中,当我们观察空间任何一个不透明的物体时,只能看到物体上朝向我们的那部分表面,而其余的表面(一般是朝向物体背面)是不可能被我们看见的。
在用计算机生成立体图形时,物体的所有部分都将被表现出来,不管是可见的还是不可见的。
这样的图形所表示的物体形状是不清楚的,甚至是不确定的。
下面这个简单例子,可以说明这一点。
图5.43(a)所示为一个立方体的线条画,它的所有的边均无一遗漏,全部画出。
但是这个立方体,可以有两种解释:其一是从立方体的左上方向下看,这时应该看到的是图5.43(b)的图形;其二是从立方体的右下方向上看,这时应该看到的是图5.43(c)的图形。
我们在观察图5.43(b)和图5.43(c)时,根据图形立即可以知道观察点及观察方向,不会产生在看到图5.43(a)时的那种二义性,这是因为这两个图都根据假定的观察点和观察方向消除了不可见线段的缘故。
图5.43 立方体线框图和消隐图为了得到一个确定的、立体感强的投影图,就需要消除隐藏线和隐藏面,也就是在给定的投影图中,确定物体哪些边、面是可见的,哪些边、面是不可见的。
并消除那些不可见的棱线和表面,这就是所谓消隐问题。
消隐问题是计算机中引人注目的难题之一。
目前,虽已提出了多种算法,但仍吸引着人们探索新的有效的解决方法。
而这方面研究工作又主要是寻求正确可靠、占用存储空间少、运算速度快的消隐算法。
计算机图形学——隐藏线和隐藏面的消除(消隐算法)
计算机图形学——隐藏线和隐藏⾯的消除(消隐算法)⼀、概述由于投影变换失去了深度信息,往往导致图形的⼆义性。
要消除⼆义性,就必须在绘制时消除被遮挡的不可见的线或⾯,习惯上称作消除隐藏线和隐藏⾯(或可见线判定、可见⾯判定),或简称为消隐。
经过消隐得到的投影图称为物体的真实感图形。
下⾯这个图就很好体现了这种⼆义性。
消隐后的效果图:消隐算法的分类所有隐藏⾯消隐算法必须确定:在沿透视投影的投影中⼼或沿平⾏投影的投影⽅向看过去哪些边或⾯是可见的两种基本算法1、以构成图像的每⼀个像素为处理单元,对场景中的所有表⾯,确定相对于观察点是可见的表⾯,⽤该表⾯的颜⾊填充该像素.适于⾯消隐。
算法步骤:a.在和投影点到像素连线相交的表⾯中,找到离观察点最近的表⾯;b.⽤该表⾯上交点处的颜⾊填充该像素;2、以三维场景中的物体对象为处理单元,在所有对象之间进⾏⽐较,除去完全不可见的物体和物体上不可见的部分.适于⾯消隐也适于线消隐。
算法步骤:a.判定场景中的所有可见表⾯;b.⽤可见表⾯的颜⾊填充相应的像素以构成图形;提醒注意1.假定构成物体的⾯不能相互贯穿,也不能有循环遮挡的情况。
2.假定投影平⾯是oxy平⾯,投影⽅向为z轴的负⽅向。
如果构成物体的⾯不满⾜该假定,可以把它们剖分成互不贯穿和不循环遮挡的情况。
例如,⽤图b中的虚线便可把原来循环遮挡的三个平⾯,分割成不存在循环遮挡的四个⾯。
⼆、可见⾯判断的有效技术1、边界盒指能够包含该物体的⼀个⼏何形状(如矩形/圆/长⽅体等),该形状有较简单的边界。
边界盒技术⽤于判断两条直线是否相交。
进⼀步简化判断2、后向⾯消除(Back-face Removal)思路:把显然不可见的⾯去掉,减少消隐过程中的直线求交数⽬如何判断:根据定义寻找外(或内)法向,若外法向背离观察者,或内法向指向观察者,则该⾯为后向⾯。
注意:如果多边形是凸的,则可只取⼀个三⾓形计算有向⾯积sp。
如果多边形不是凸的,只取⼀个三⾓形计算有向⾯积sp可能会出现错误,即F所在的⾯为前向⾯也可能出现sp≥0的情况,因此,需按上式计算多边形F的有向⾯积。
消隐技术与真实感图形
7
第五章 消隐技术与真实感图形
5.1 消除隐藏线
凹多面体的隐藏线消除
平面多边形对直线段的遮挡判断算法
(1) 若线段的两端点与视点在给定平面的同一侧,则线段位于给定平面的前面, 是可见的,转(9)。 (2) 求线段与相应的无限平面的交。若无交点,转(4);否则,转(3)。 (3) 交点将该线段分成两段,与视点同侧的一段是可见的,它没有被遮挡;另一 段的可见性还不能确定,转(4),继续测试。 (4) 若线段的投影与给定平面的投影的包围盒不相交,则线段可见,它不被该平 面遮挡,转(9)。 (5)求所剩线段的投影与平面边界投影的所有交点。 (6)将线段的投影在交点处依次分成若干段,根据交点在原直线参数方程中的参 数值的大小对线段进行排序。 (7)求出第一投影线段的中点,若第一段的中点在多边形的投影内,则相应的线 段被遮挡,否则不被遮挡。 (8)其它各段的遮挡关系可依次按"遮挡/可见"交替地取值,如图4所示。例如: 如果第一段被遮挡,则后面线段的可见性依次为"可见,遮挡,可见,…";若 第一段可见,则后面的线段依次为"遮挡,可见,遮挡,…"。 (9)结束。
11
第五章 消隐技术与真实感图形
5.2 消除隐藏面
扫描线算法 在多边形填充算法中,活性边表的使用获得 了节省运行空间的效果。用这种思想改造 Zbuffer算法,就产生了扫描线算法。
12
第五章 消隐技术与真实感图形
5.3 光照模型
环境光 环境光是光线在物体和周围环境之间经过多 次反射后,最终达到平衡时形成的一种光, 又称为背景光。
I d I p Kd cos
其中, 是漫反射系数(0~1之间的常数),与 物体表面性质有关; 是入射光(光源)的光强; θ是入射光的入射角,即入射光与物体表面法向 量之
06-消隐
点与多边形的包含性检测: (1)射线法
P P1 P2 P3 P P1 P2
由被测点P处向 y = - 方向作射线 交点个数是奇数,则被测点在多边形内部。否则,偶数 表示在多边形外部。
若射线正好经过多边形的顶点 ,则采用“左开右闭”的原则来 实现。即:当射线与某条边的顶 点相交时,若边在射线的左侧, 交点有效,计数;若边在射线的 右侧,交点无效,不计数。 用射线法来判断一个点是否 在多边形内一是计算量大,二 是不稳定。原因是射线在经过 多边形顶点时,由于计算机本 身的误差(也许多了0.00001), 把本该无效的交点变成有效的 交点了。所以这种算法是不稳 定的。
上图所画的仅仅是一个简单的立方体,如果一个物体是由多 个形体所组成的,或者整个三维场景是由多个物体构成的,情 况就更为复杂了。 因此,要绘制出意义明确的、富有真实感的立体图形,首 先必须消去形体中的不可见部分,而只在图形中表现可见部 分。这就要去寻求解决显示三维物体的图形中消去不可见部 分的方法,也就是所谓的“消隐”问题。消隐包括消除“隐 藏线”和“隐藏面”两个问题。
消 隐
三维物体的显示和真实感图形是当今计算机图形学研究的 一个焦点。在二维显示设备上显示三维图像, 必须对三维图像 进行消隐处理, 通过消隐处理的物体才能很好的表现三维立体 效果, 但是这种物体明显缺乏真实感, 还需要对物体进行真实 感的处理, 这样才能逼真的显示物体。
主要讲述的内容:
消隐的分类,如何消除隐藏线、隐藏面,主要介绍以 下几个算法:
Z-Buffer算法() { 帧缓存全臵为背景色
深度缓存全臵为最小Z值(比如赋一个10-8次方)
for(每一个多边形)
{扫描转换该多边形
for(该多边形所覆盖的每个象素(x,y) )
5消隐面
5.1 可见面判断的有效技术
• 可见线( 可见线(面)的判断是一个计算量很大的工作。例如, 的判断是一个计算量很大的工作。例如, N个面的两两相交的工作量是 (N2)。减少这个工作 个面的两两相交的工作量是O( )。减少这个工作 个面的两两相交的工作量是 量是非常重要的事。 量是非常重要的事。 常用的技术有: 常用的技术有: – 边界盒 – 后向面消除 – 非垂直面投影转换成垂直投影
扫描线算法
• 设平面Ax+By+Cz+D=0. (x,y)处的深度是 z = [-Ax-By-D]/C • 首先计算各多边形的y的范围。 自上而下递归地计算多边形的 左边界y=mx+b的x坐标和z深度。
y y-1 x x′
x =y/m-b/m, x′ = (y-1)/m–b/m = x –1/m, z = [-Ax-By-D]/C, z′ = [-Ax′-B(y-1)-D]/C ′ ′ = [-A(x-1/m)-B(y-1)-D]/C = z+(A/m+B)/C. 当左边界是垂直边时, x′ = x, z′ = z + B/C.
5.4 z缓冲器算法和扫描线算法
• 对投影平面上每个像素所对应的表面深 度进行比较,显示较近的表面上的属性。 • 需要两个缓冲器:深度缓冲器(Z-缓冲器) 和刷新缓冲器,分别保存各像素所对应 的三维点的深度和像素属性。缺点是它 需要很大的存储空间。 • 优点是算法简单:首先,缓冲器初始化, 即初始化每个像素的深度和颜色。 其次,计算多边形面上各像素点的深度 值, 若距离投影面较近,则记下深度和 颜色。
计算机图形学-消隐
计算机图形学 施智平
shizhiping@
第八章
图形的数据结构 消隐算法分类 隐线算法
隐面算法
图形的数据结构
W.K.Giloi在其著作 Interactive Computer Graphics中提出: Computer Graphics=Data Structure +Graphics Algorithms+Language
N z EFx EG y EFy EGx
外法矢量表示为: N N xiቤተ መጻሕፍቲ ባይዱ N y j N z k
给定视点位置球面坐标表示为:
( R sin cos , R sin sin , R cos ) 0 2 其中:R为视径, 0
隐线算法
线框模型消隐一般在物空间中进行 物空间消隐算法是根据边界线的可见性检测条 件,判断哪些边界线是可见的,哪些边界线是
不可见的,在屏幕上只绘制可见边界线。
凸多面体消隐算法
凸多面体消隐是最简单和最基本的情形 凸多面体的性质: 连接立体上不同表面的任意两点的直线完全 位于该凸多面体之内
由凸多边形构成,其表面要么完全可见,要 么完全不可见
凸多面体消隐算法的关键是给出测试其表面边 界线可见性的判别式
对于凸多面体的任一个面,其外法矢量和视矢 量的夹角θ可进行可见性检测 θ < 90°时,可见; θ > 90°时,不可见
D 法向向量N
<90°
F
E N
可见
>90°
视线向量V
E7 E8
E9 E10 E11 E12
P7 P8
P1 P2 P3 P4
计算机图形学实验报告消隐
计算机图形学实验报告计算机图形学实验报告姓名徐沛华班级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;}。
计算机图形学-消隐
共四十四页
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)“消隐”?
将三维场景绘制在计算机二维显示屏上必须经过投影变换,投影 变换将三维信息变换到二维平面上,这个过程中深度信息被丢失, 生成的图形往往具有二义性。
第5讲 计算机图形学消隐算法
1)消隐必须在投影之前完成;因为消隐需要物 体三维信息,投影后只有二维信息; 2)物体之间的遮挡关系与投影中心(视点) 的选取有关; 3)物体之间的遮挡关系与投影方式有关,在 平行投影时,其遮挡关系可通过深度值来确定。
三、凸多面体隐藏线的消除
凸多面体的每个面要么可见,要么 不可见;不可能出现一个面部分可 见,部分不可见。
N V
=
2
面的法向量 面上一点指向观察点的向量 cos-1(
2
0<= <
|N||V| ) .
N.V
N N
V >0 时 可见 V <0 时 不可见
<= <=
.
、空间分割技术
依据:场景中的物体,它们的投影在投影平面上 是否有相互遮挡的重叠部分? 对于根本不存在相互遮挡关系的物体,应 避免这种不必要的测试。
(z
i 1 m i 1
i
(x
i
式中:m为顶点号,若i≠n,则j=i+1;否则i=m,j=1。
• 为避免在程序中出现两种计算外法矢量的方 法,建议凸多边形也采用该算法进行计算。 多边形所在的平面方程可写成:
Ax By Cz D 0
D ( Ax0 By0 Cz 0 ) , • 其中:
要消除二义性,必须在绘制时消隐实际不可见得线和面, 即消隐。经过消隐的投影图称为物体的真实图形。
• 消隐不仅与消隐对象有关,还与观察者 的位置有关。如图所示,由于视点的位 置不同,物体的可见部分也不同:
C B
D
E2
A
E1
消隐与观察者的位置关系
• 按消隐的对象分类
线消隐(Hidden-line) 面消隐(Hidden-surface)
计算机图形学消隐
for(v=0;v<vmax;v++) {
本算法中有两个缓存:
Z-Buffer算法的原理
Z-Buffer算法步骤:
1. 初始化:把Z-Buffer中各(x,y)单元置为z的 最小值,而帧缓存中各(x,y)单元置为背静色。
2. 在把物体表面相应的多边形扫描转换成帧缓 存中的信息时,对于多边形内的每一个采样 点(x,y)进行以下几步处理:
(a). 计算采样点(x,y)的深度z(x,y); (b). 如z(x,y)>zbuffer(x,y),则把z(x,y)存入z缓存,
再把多边形在z(x,y)处的颜色存入帧缓存的 (x,y)地址中。
算法描述
for(v=0;v<vmax;v++) for(u=0;u<umax;u++) { 将帧缓冲器的第(u,v)单元置为背景色; 将Z缓冲器的第(u,v)单元置为最小深度值; }
若对于窗口的每一个顶点,所得判别函 数值的符号相同,则所有顶点位于该直 线的同侧,窗口与此棱无交。若符号不 同,则多边形与窗口相交。
相交多边形判别示例
F y mx b y 5x 36 F (8,8) 8 5 *8 36 4 F (8,32) 32 5 *8 36 28 F (32,32) 32 5 * 32 36 92 F (32,8) 8 5 * 32 36 116
for(u=0;u<umax;u++) { 将帧缓冲器的第(u,v)单元置为背景色; 将Z缓冲器的第u单元置为最小深度值; } for(每个多边形) {
计算机图形学消隐算法
隐藏线(面)的消除的两种基本算法
第一种是物空间算法。 • 它以三维场景中的物体对像作为处理单元的,在所
有的对像之间进行比较,除去完全不可见的的物体 和物体上不可见的部分。常用于线框表示立体的线 隐藏,也用于面隐藏。
• 特点是:算法精度低,只能达到屏幕精度为止,但速度往
往更高。 其算法是对每一个像素:
在和投影点到像素的连线相交的表面中找到离观察点最近 的表面
用该表面上交点处的颜色填充该像素。
for (窗口内的每一个像素) { 确定距视点最近的物体,以该物体表 面的颜色来显示像素}
算法复杂度
假设场景中有k个物体,平均每个物体表面 由h个多边形构成,显示区域中有m x n个像素, 则:
2
<=
<=
N . V时<0 不可见
、空间分割技术
依据:场景中的物体,它们的投影在投影平面上 是否有相互遮挡的重叠部分? 对于根本不存在相互遮挡关系的物体,应 避免这种不必要的测试。
9
象空间消隐算法: 这类算法对屏幕上的每个象素进行判断,以决有 m×n个象素点,每个物体表面上有h个多边形,则该 类消隐算法计算量正比于mnh。
则: k个物体的算法复杂度为: O(mnkh) 。
10
算法排序
各种消隐算法均采用一定形式的几何排序。通过排序 ,可搜查出位置上靠近观察者的几何元素,确定几何元 素之间在位置上的遮挡关系,解决消隐计算的主要问题 。各种算法都有各自的排序方法和排序次序。排序次序 影响算法的效率。
二、 消隐基本技术
图形学实验五 消隐算法实例实现
中国民航大学计算机与技术学院图形学实验报告课程名称:计算机图形学*名:***系:计算机科学与技术专业:计算机科学与技术年级:2010级学号:*********指导教师:***2012年12 月17 日实验项目:消隐算法实例实现一、实验目的与要求了解各种消隐算法,初步掌握消隐算法的实现。
了解真实感图形的基本原理,掌握真实感图形绘制的基本方法,为进一步掌握计算机图形学中图形处理技术奠定基础。
二、实验内容给定一个长方体8个顶点坐标,编程实现正投影变换和轴侧投影变换。
自给定长方体个顶点坐标,编程实现一点透视绘图。
修改上面程序,实现两点透视变换图形。
给定一个三维几何体坐标,实现它的轴侧变换和一点透视变换。
三、重要算法分析Z-Buffer算法的基本思想是:将Z缓冲器中各单元的初始值设为-1。
当要改变某像素的颜色值时,首先检查当前多边形的深度值是否大于该像素原来的深度值(保存在该像素所对应的Z缓冲器的单元中),如果大于,说明当前多边形更靠近观察点,用它的颜色替换像素原来的颜色;否则,说明在当前像素处,当前多边形被前面所绘制的多边形遮挡了,是不可见的,像素的颜色值不改变。
Z-Buffer算法流程如下:帧缓冲区置背景色;Z缓冲区置最小值(离观察点最远);for(场景中的每个多边形){扫描转换该多边形;for(多边形所覆盖的每一像素点(x,y)){计算多边形在该像素点的深度值z(x,y);if(z(x,y)>Z-buf中对应此像素点(x,y)的z值){把多边形在(x,y)处的深度值z(x,y)存入Z-buf中(x,y)处;把多边形在(x,y)处的亮度值存入F-buf中的(x,y)处;}}}四、程序运行截图程序运行结果分别如以下各图所示:其中图1至图5是按键盘中“上”箭头时凸多面体的变化过程:图1图2图3 图4图5图6图6至图9是按键盘中“下”箭头时凸多面体的变化过程:图7图8图9 图10五、总结与调试经验最后一次实验,竟有些窃喜,额,似乎不太认真~~~不过好歹还是调试出来了~~~不敢说收获,但是很开心!!希望考试取得好成绩!!加油!!GO GO~。
消隐
深度缓存算法 ( Z—Buffer算法)
Z—Buffer ---- 用于存放与屏幕上像素点对应的物体上点的深度值。
y
投影面
z
视线方向
视点位置
x
屏幕像素
F — Buffer
Z—Buffer
Z-buffer算法的步骤如下:
⑴ 初始化ZB和CB,使得ZB(i, j)=Zmax,CB(i, j)=背景色。其中, i=1, 2, …, m,j=1, 2, …, n。 ⑵ 对多边形,计算它在点(i, j)处的深度值zi, j。 ⑶ 若zijZB(i, j),则ZB(i, j)=zij,CB(i, j)=多边形的颜色。 ⑷ 对每个多边形重复⑵、⑶两步。最后,在CB中存放的就是 消隐后的图形。
背面剔除算法
• 背面剔除算法
法向向量N
<90°
cos N V
视线向量V
可见
>90°
法向向量N
<90°
可见
不可见
法向向量N
8.1 消隐基础
8.1.1 消隐的分类
• 线消隐 (Hidden-line)-景物空间消隐 对象:线框模型
•面消隐 (Hidden-surface)-图像空间消隐
对象:填色图
问题: ① 对于线画图形会出现多义性,要增强图形的真实感必须进 行消隐处理。 ②对于光栅扫描着色的面图形则会导致图形错误。
基本概念
二.消隐涉及的算法:
• 排序 • 连贯性
是指所考察的物体或画面的性质在局部区域内保持不变的一种 倾向。
例如:
棱边的连贯性是指:棱边的可见性在它与其他棱边相交时才发生
变换;
for (场景中的每一个物体)
{ 将该物体与场景中的其它物体进行比较,确定其表面的 可见部分;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1)消隐必须在投影之前完成;因为消隐需要物 体三维信息,投影后只有二维信息; 2)物体之间的遮挡关系与投影中心(视点) 的选取有关; 3)物体之间的遮挡关系与投影方式有关,在 平行投影时,其遮挡关系可通过深度值来确定。
三、凸多面体隐藏线的消除
凸多面体的每个面要么可见,要么 不可见;不可能出现一个面部分可 见,部分不可见。
消隐算法
主要内容:
一、概述 二、消隐的基本技术
三、凸多面体消除隐藏线
四、消除隐藏面
一、概述
用计算机生成三维形体的真实图形,是计算机图形学研究 的重要内容之一。在使用显示设备描绘三维图形时,必须把三 维信息作某种投影变换,在二维显示表面上绘制出来。 由于投影变换失去了深度信息,往往导致图形的二义性:
y
凸多面体是由若干个平面围成的物体。 假设这些平面方程为: ai x+bi y+ci z+di=0 (i=1,2,…n) x 调整系数的符号,使每个平面的法向 量(ai,bi,ci)指向多面体内部。
z
如果投影方向为(Xp,Yp,Zp),那么 (ai,bi,ci)· (Xp,Yp,Zp)<0时, 此平面为不可见面,在作图时, 此面不绘制。
• 按消隐空间分类
物体空间消隐算法 图像空间消隐算法
线消隐(Hidden-line) 消隐对象是物体上不可见的线,一般用于 线框图。当用笔式绘图仪或其它画线设备绘制 图形时,主要使用这种算法。 面消隐(Hidden-surface) 消隐对象是物体上不可见的面,一般用于 填色图。当用光栅扫描显示器绘制图形时,主 要使用这种算法。
要消除二义性,必须在绘制时消隐实际不可见得线和面, 即消隐。经过消隐的投影图称为物体的真实图形。
• 消隐不仅与消隐对象有关,还与观察者 的位置有关。如图所示,由于视点的位 置不同,物体的可见部分也不同:
C B
D
E2
A
E1
消隐与观察者的位置关系
• 按消隐的对象分类
线消隐(Hidden-line) 面消隐(Hidden-surface)
方法:将投影平面上的窗口分成若干小区域;为 每个小区域建立相关物体表,表中物体的投影于 该区域有相交部分;则在小区域中判断哪个物体 可见时,只要对本区域的相关物体表中的物体进 行比较即可。
复杂度比较: 假定每个小区域的相关物体表中平均有h个 物体,场景中有k个物体,由于物体在场景中的分 布是分散的,显然h远小于k。 根据物空间消隐方法所述,其算法复杂 度为O(h2),远小于O(k2)。
N V
=
2
面的法向量 面上一点指向观察点的向量 cos-1(
2
0<= <
|N||V| ) .
N.V
N N
V >0 时 可见 V <0 时 不可见
<= <=
.
、空间分割技术
依据:场景中的物体,它们的投影在投影平面上 是否有相互遮挡的重叠部分? 对于根本不存在相互遮挡关系的物体,应 避免这种不必要的测试。
9
象空间消隐算法:
这类算法对屏幕上的每个象素进行判断,以决
定物体上哪个多边形在该象素 点上是可见的。若屏
幕上有m×n个象素点,每个物体表面上有h个多边形
,则该类消隐算法计算量正比于mnh。
则: k个物体的算法复杂度为: O(mnkh) 。
10
算法排序
各种消隐算法均采用一定形式的几何排序。通过排
序,可搜查出位置上靠近观察者的几何元素,确定几何
2
0
4
Z
1
X
0 1 2 3 4 5
0 5 10 15 20 25
4 9 14 19 24 29
A
B
A’
B’
背面剔除
剔除依据: 物体表面是封闭的,背面总是被前 向面所遮挡,从而始终是 不可见的。
外法向 外法向与投影方向(观察方向)的夹角判断: 前向面与后向面(背面)
法向向量N
<90°
可见
cos N V
视线向量V
>90°
法向向量N
<90°
不可见
法向向量N
可见
视线-法线夹角法
• 凸多面体消隐的基本原理
– 表面外法线与其可见性的关系 设平面Pi上任一点的外法矢ni与该点的视线矢量vi的数 量积:
从而有
ni vi cos i ni vi
其中θi为ni与vi之间的夹角,i=1,2,…,m,这里m为平面数。
• 当 cosθi≥0 ,即 0≤θi ≤π/2 时,Pi为朝前面,为可见的,应 该画出; • 当 cosθi<0 ,即 π/2 <θi ≤π时,Pi为朝后面,不可见,不 画出或用虚线表示。 视线方向与外法线的关系如图7-7。
早期图形显示器是用线条表示图形,消隐主要是消隐线 问题。使用光栅显示器后,物体可用连续变化的色调来描 述,消隐算法的研究渐渐转向消隐面的问题。
隐藏线(面)的消除的两种基本算法
第一种是物空间算法。 • 它以三维场景中的物体对像作为处理单元的,在所 有的对像之间进行比较,除去完全不可见的的物体 和物体上不可见的部分。常用于线框表示立体的线 隐藏,也用于面隐藏。 特点是:算法可以达到相当高的精度。 for (场景中的每一个物体) { 将其与场景中的其它物体比较,确定其 表面的可见部分;显示该物体表面的可见部分; }
for (窗口内的每一个像素) { 确定距视点最近的物体,以该物体表 面的颜色来显示像素}
算法复杂度
假设场景中有k个物体,平均每个物体表面 由h个多边形构成,显示区域中有m x n个像素,
则:
第一种算法的复杂度为: O((kh)×(kh))
第二种算法的复杂度为:O(mnkh)
物空间消隐算法: 需对物体表面的h个多边形中的每个面与其余h1个面进行比较,精确地求出物体上每个棱边或每 个面的遮挡关系。算法的计算量正比于h2,即算法 复杂度为:O((h)2) 。 则:k个物体的算法复杂度为:O((kh)2) 。
( x0 , y0 , z 0 ) 为平
面上任意一点。
• 算法实现的一般步骤 根据表面的数据结构,取顶点数据,计算表 面的外法线矢量。 计算外法线在投影方向上的分量的值。 根据分量的值判断表面的可见性。 若表面可见画出该表面,否则处理下一个表 面。
计算平面法向量
已知平面上三个点的坐标为(x1,y1,z1) 、(x2,y2,z2) 、 (x3,y3,z3),其顺序符合右手规则,其大姆指所指方向为该 平面的法向量(a,b,c),则:
第二种是像空间算法。 它以构成图形的每一个像素为处理单元的,确定场景 中哪些表面的像素相对于观察点而言是可见的,用该表面 的颜色填充该像素。常用于隐藏面。
• 特点是:算法精度低,只能达到屏幕精度为止,但速度往 往更高。 其算法是对每一个像素: 在和投影点到像素的连线相交的表面中找到离观察点最近 的表面 用该表面上交点处的颜色填充该像素。
物体表面外法矢量
• 在图中,平面P1P2P3的外法矢量
n1 p1p2 p2 p3 • · • 任意多边形法矢量的算法方法如下: • 设法矢量 ,三个方向分量为:
A B C
(y
i 1 m
m
i
y j )( z i z j ) z j )( xi x j ) x j )( yi y j )
物体分层表示
表示形式:模型变换中的树形表示方式 原理:减少场景中物体的个数,降低算法复杂度 。 方法: 将父节点所代表的物体看成子节点物体的 包围盒,当两个父节点之间不存在遮挡关系时, 就勿对两者的子节点做进一步测试。 父节点之间的遮挡关系可以用它们之间的包 围盒进行预测试。
将透视投影转换成平行投影
包围盒技术
一个形体的包围盒指的是包围它的简单形体。 比如,2D的矩形,3D的立方块、长方体、球等。 目的: 避免盲目的求交测试; 各物体间的比较等。
一个好的包围盒要具有两个条件: 包围和充分紧密包围着形体; 对其的测试比较简单。 例:矩形包围盒及长方体包围 盒提高算法效率
• 包围盒不相交,线段和多边形也不相交,线段完全可见, 无需就线段和多边形的遮挡关系进行进一步判断。可推广 到面与面的遮挡快速判断。 • 例如:两个空间多边形A、B在投影平面上的投影分别为 A’,B’ ,因为A’ 、B’的矩形包围盒不相交,则A’ 、B’不相交,无须进行遮挡测试。右图:包围盒相交, 投影也相交;包围盒相交,投影不相交。
不可见 可见 不可见 可见 可见 不可见
实体模型数据结构之一
面表 Y 3 7 6
0 1 2 3 4 5 6 7 8 9 ..
线表
0 1 2 3 0 7 6 5 4 7 ... x 0 1 2 3 4 5 6 7 0 100 100 0 0 100 100 0
顶点表
y 0 0 200 200 0 0 200 200 z 0 0 0 0 300 300 300 300
• 当视线矢量平行Z轴时,有
C C cos n A2 B 2 C 2
• 同理,若视线矢量平行X轴时,某平面的可见 性由该平面外法矢量n在X轴的方向分量A所决 定。 • 若视线矢量平行y轴时,某平面的可见性由该 平面外法矢量n在Y轴的方向分量B所决定。
• 平面多边形的外法矢量的计算 为了判别物体上各表面是朝前面还 是朝后面,需求出各表面(平面多边形) 指向物体外侧的法矢量。如图所示 。
面的连贯性 区域连贯性 扫描线的连贯性 深度连贯性 例如:
时才发生变换;
Hale Waihona Puke 棱边的连贯性是指:棱边的可见性在它与其他棱边相交
况下整个面都是可见的。
面的连贯性是指:如果面的一部分是可见的,则一般情