(计算机图形学)建模与消隐
计算机图形学 机械工业出版社第七章 消隐
人不能一眼看到一个三维物体的全部表面。从 一个视点去观察一个三维物体,必然只能看到 该物体表面上的部分点、线、面,而其余部分 则被 这些可见部分遮挡住。如果观察的是若干 个三维物体,则物体之间还可能彼此遮挡而部 分不可见。因此,如果想有真实感地显示三维 物体,必须在视点确定之后,将对象表面上不 可见的点、线、面消去。执行这一功能的算法, 称为消隐算法 消隐算法。 消隐算法
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 ,此面退化为线。
计算机图形学——隐藏线和隐藏面的消除(消隐算法)
计算机图形学——隐藏线和隐藏⾯的消除(消隐算法)⼀、概述由于投影变换失去了深度信息,往往导致图形的⼆义性。
要消除⼆义性,就必须在绘制时消除被遮挡的不可见的线或⾯,习惯上称作消除隐藏线和隐藏⾯(或可见线判定、可见⾯判定),或简称为消隐。
经过消隐得到的投影图称为物体的真实感图形。
下⾯这个图就很好体现了这种⼆义性。
消隐后的效果图:消隐算法的分类所有隐藏⾯消隐算法必须确定:在沿透视投影的投影中⼼或沿平⾏投影的投影⽅向看过去哪些边或⾯是可见的两种基本算法1、以构成图像的每⼀个像素为处理单元,对场景中的所有表⾯,确定相对于观察点是可见的表⾯,⽤该表⾯的颜⾊填充该像素.适于⾯消隐。
算法步骤:a.在和投影点到像素连线相交的表⾯中,找到离观察点最近的表⾯;b.⽤该表⾯上交点处的颜⾊填充该像素;2、以三维场景中的物体对象为处理单元,在所有对象之间进⾏⽐较,除去完全不可见的物体和物体上不可见的部分.适于⾯消隐也适于线消隐。
算法步骤:a.判定场景中的所有可见表⾯;b.⽤可见表⾯的颜⾊填充相应的像素以构成图形;提醒注意1.假定构成物体的⾯不能相互贯穿,也不能有循环遮挡的情况。
2.假定投影平⾯是oxy平⾯,投影⽅向为z轴的负⽅向。
如果构成物体的⾯不满⾜该假定,可以把它们剖分成互不贯穿和不循环遮挡的情况。
例如,⽤图b中的虚线便可把原来循环遮挡的三个平⾯,分割成不存在循环遮挡的四个⾯。
⼆、可见⾯判断的有效技术1、边界盒指能够包含该物体的⼀个⼏何形状(如矩形/圆/长⽅体等),该形状有较简单的边界。
边界盒技术⽤于判断两条直线是否相交。
进⼀步简化判断2、后向⾯消除(Back-face Removal)思路:把显然不可见的⾯去掉,减少消隐过程中的直线求交数⽬如何判断:根据定义寻找外(或内)法向,若外法向背离观察者,或内法向指向观察者,则该⾯为后向⾯。
注意:如果多边形是凸的,则可只取⼀个三⾓形计算有向⾯积sp。
如果多边形不是凸的,只取⼀个三⾓形计算有向⾯积sp可能会出现错误,即F所在的⾯为前向⾯也可能出现sp≥0的情况,因此,需按上式计算多边形F的有向⾯积。
计算机图形学 消隐
?基本概念 ?提高消隐算法效率的常见方法 ?画家算法 ?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
复杂度比较:
计算机图形学-第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。 以上算法适合任何平面多边形。
非平面但接近平面的多边形的最佳逼近平面 的法矢量也可用此算法求出。为避免在程序 中出现两种计算平面外矢量的方法,建议凸 多边形也采用该算法计算外法矢量。多边形 所在平面的方程可写成
计算机图形学 第7章消隐 - 课程教学辅导资料
假设场景中有k个物体,平均每个物体表面由h个多 边形构成,显示区域中有m x n个像素,则: 算法的复杂度为:O((kh)*(kh))
计算机图形学
Z-Buffer算法
由来: 帧缓冲器 – 保存各像素颜色值 Z缓冲器 --保存各像素处物体深度值
Z缓冲器中的单元与帧缓冲器中的单元一一对应
屏幕 帧缓冲器 Z缓冲器
nu :当沿扫描线u递增一个像素时,多边形所在平面n坐标的增 量,对方程au+bv+cn+d=0来说,nu =-a/c nv :当沿扫描线v递增一个像素时,多边形所在平面n坐标的增 量,类似,nv =-b/c (c!=0) nextEP:指向下一个边对结构的指针。
计算机图形学
扫描线Z-buffer算法--活化边表对
扫描线Z-buffer算法--多边形分类表
多边形分类表(PT):对多边形进行分类的一维数 组,长度等于绘图窗口内扫描线的数目。若一个多 边形在投影平面上的投影的最小v坐标为v,则它属 于第v类。
计算机图形学
扫描线Z-buffer算法--活化多边形表
活化多边形表(APL): 记录投影与当前扫描线相 交的多边形。
计算机图形学
扫描线Z-buffer算法--边的分类表
边的分类表(ET):当一个多边形进入活化多边形表时,需为其建立 一个边分类表(ET)。这里,ET与其在扫描转换多边形的扫描线算 法中的含义相同,是对多边形的非水平边进行分类的一维数组,长度 等于绘图窗口内扫描线的数目。若一条边在投影平面上的投影的下端 点的v坐标为v,则将该边归为第v类。
计算机图形学
扫描线Z-buffer算法
计算机图形学-消隐
计算机图形学 施智平
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)
计算机图形学-第7章-消除隐藏线和隐藏面
可能的四种形体
隐藏线和隐藏面
不可见的线和面分别称为隐藏线和隐藏面。 隐藏线和面不仅仅有形体自身的,而且还 有形体之间互相遮挡的。消除它们即称为 消除隐藏线和消除隐藏面。
形体之间互相遮挡的隐藏线
当我们显示线条图或用笔式绘图仪或其 它线画设备绘制线条图形时,要解决的 主要是消除隐藏线的问题。而当用光栅 扫描显示器显示物体的明暗图形时,就 必须要解决消除隐藏面的问题。
设n={A,B,C},而
n
A ( 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。 以上算法适合任何平面多边形。
非平面但接近平面的多边形的最佳逼近平面 的法矢量也可用此算法求出。为避免在程序 中出现两种计算平面外矢量的方法,建议凸 多边形也采用该算法计算外法矢量。多边形 所在平面的方程可写成
Ax By Cz D 0
其中 D ( Ax0 By0 Cz0 ,)
(x0 , y0 , z0 ) 为平面上任意一点。
7.2.2 深度检验
深度检验是比较位于同一条投射线的若干 个点的深度坐标(一般为z坐标),以确定 哪个点是可见的,将可见点表示出来。消 隐时必须进行深度检验。一般将需要比较 的各点的z坐标按递增或递减排序,也可从 中选出最大或最小的z坐标。至于选最大或 最小与所选的坐标系有关。
7.2.1 平面多边形的外法矢量
为了判别物体上各表面是朝前面还是朝后
面,需求出各表面(平面多边形)指向体外
的法矢量。设物体在右手坐标系中,多边
形顶点按逆时针排列。当多边形为凸多边
形时,则其法矢可取成多边形相邻两边矢
第九讲 消隐
2 . 遍历BSP树,优先绘制标为Back的区域;
P1
front
P2
back
P3
front
back
back front
A
B
C
D
绘制的顺序:D C
B
A
四. 深度缓冲器算法( Z-Buffer算法) 帧缓冲器:用来存储图像中每个象素属性(颜色); Z缓冲器:用来存储图像空间中每一个可见象素所对应 物体的深度(或Z坐标),是一个独立的深度缓冲器。
1. 将场景中的多边形序列按其z坐标的最小值zmin (物体上离视点最远的点)进行排序
2.当物体间 的z值范围不 x 重叠时:假设多边形P的 P zmin在上述排序中最小, Pzmax 如果多边形P的z值范围 与Q的z值范围不重叠, Qzmin Q 即Pzmax< Qzmin,此时 z 可以断定多边形P的优先 物体间的z值范围不重叠 级最低
3.当物体间的z值范围重叠时: 进一步判断多边形P是否遮挡场景中多边形Q
x P Q z
物体间的z值范围重叠
作如下5个判别步骤
• • • • • 多边形P和Q的x坐标范围是否不重叠 多边形P和Q的y坐标范围是否不重叠 从视点看去,多边形P是否完全位于Q的背面 从视点看去,多边形Q是否完全位于P的正面 多边形P和Q在xy平面上的投影是否不重叠
使用BSP树对场景中的对象进行排序
P3 C
D P1
P1
front
P2
back
P3
B P2 A
front
back
back front
A
B
C
D
1. 构建场景的BSP树 依据当前视点所在位置,对场景中的每个分割面 所生成的两个子空间进行分类 包含视点的标为Front,后面的标为Back 被分割面穿过的物体,被划分成两个部分,例如: 上图中的C物体被分割面P1划分成C,B两部分
计算机图形学消隐
第7章 消 隐
第7章 消 隐
• • • • • • 消隐的概述 多面体的消隐算法 深度缓冲器算法 扫描线算法 画家算法 光线追踪算法(Ray Casting)
消隐概述
• 什么是消隐? • 消隐的分类有哪些? • 消隐的基本原则有哪些?
消隐的概述
• 绘制线框图时应消除隐藏线,绘制真实感图 形时应消除隐藏面。 • 未经消除隐藏线和隐藏面的立体图往往存在
图7-9 任意多面体的隐藏情况
深度缓冲器算法
• • • • 算法基本思想是什么? 算法是怎样描述的? 深度值如何计算? 深度缓冲器算法特点是什么?
多面体的消隐算法
• 算法实现的一般步骤 • 根据表面的数据结构,取顶点数据,计算表面 的外法线矢量。 • 计算外法线在投影方向上的分量的值。 • 根据分量的值判断表面的可见性。 • 若表面可见画出该表面,否则处理下一个表面。
多面体的消隐算法
• 任意多面体的消隐 • 对于任意平面立体必须寻求适当的消隐算法。 因为任意平面立体则不同,除了有全部可见和 全部不可见的棱边外,还有部分可见的棱边如 图7-9 。
消隐的概述
• 图像空间消隐算法 图像空间是物体显示时所在的屏幕坐标空 间。 • 算法描述如下: for(窗口中的每一个像素) { 确定距视点最近的物体,以该物体表面的 颜色来显示像素; }
消隐的概述
• 消隐基本原则
―排序
排序的目的主要是判别消隐对象的体、面、边和点与观察 点几何距离的远近。如果一个物体离观察点越远,越有可能被 离观察点近的物体所遮挡,如图7-4所示。但这不是绝对的,例 如,不在同一观察线方向的两个物体不会有遮挡关系,如图7-5 所示。
• 凸多面体消隐的基本原理是什么 • 凸多面体消隐的算法思想是什么 • 任意多面体的消隐算法是什么
计算机图形学 消隐PPT课件
可编辑课件PPT
11
提高消隐算法效率的常见方法 6
复杂度比较:
不妨假定每个小区域的相关物体表中平均有h个物 体,场景中有k个物体,由于物体在场景中的分布是分 散的,显然h远小于k。根据第二种消隐方法所述,其 算法复杂度为O(h*h),远小于O(k*k)。
可编辑课件PPT
14
画家算法
关键:如何对场景中的物体按深度(远 近)排序,建立深度优先级表? 一种针对多边形的排序算法如下:
假定在规范化投影坐标系uvn中,投影方向是n 轴的负向,因而n坐标大距观察者近。记nmin(P) nmax(P)分别为多边形P的各个顶点n坐标的最小 值和最大值,算法步骤如下:
可编辑课件PPT
25
区域子分算法
如何判别多边形与窗口的分离与包围关系?
编码方法:1)区域编码
2)多边形顶点编码 3)多边形边的编码 4)多边形的编码
可编辑课件PPT
26
光线投射算法
算法思路:将通过绘图窗口内每一个像 素的投影线与场景中的所有多边形求交。 如果有交点,用深度值最大的交点(最 近的)所属的多边形的颜色显示相应的 像素;如果没有交点,说明没有多边形 的投影覆盖此像素,用背景色显示即可。
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;否则进行下一步。
计算机图形学消隐
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(每个多边形) {
(计算机图形学)建模与消隐
9.1.1 物体的几何信息和拓扑信息
几何信息:描述几何元素空间位置的信息。 拓扑信息:描述几何元素之间相互连接关系的信息。 描述一个物体不仅需要几何信息的描述而且需要拓扑信息的描述。 因为只有几何信息的描述,在表示上存在不惟一性。图9-1所示的5个 顶点,其几何信息已经确定,如果拓扑信息不同,则可产生图9-2和93所示的两种不同图形。
图9-5所示为立方体线框模型。
优点:可以产生任意方向视图,视图间保持正确的投影关系,常用 于绘制三视图或斜轴测图等。
缺点:所有棱边全部绘制出来,容易产生二义性,如图9-6所示
12
图9-5立方体线框模型
图9-6线框模型二义性
13
2.
表面模型(物体的皮肤)
表面模型(surface model)是利用物体的外表面来构造模 型,就如同在线框模型上蒙上了一层外皮,使物体具有了一层
图9-14 读入立方体的顶点表
22
4.读入立方体的面表 在程序中定义ReadFace()函数读入物体的面表,如图9-15
void CTestView::ReadFace() { //面的顶点数和面的顶点索引号 F[0].SetNum(4);F[0].vI[0]=4;F[0].vI[1]=5;F[0].vI[2]=6;F[0].vI[3]=7;//前面 F[1].SetNum(4);F[1].vI[0]=0;F[1].vI[1]=3;F[1].vI[2]=2;F[1].vI[3]=1;//后面 F[2].SetNum(4);F[2].vI[0]=0;F[2].vI[1]=4;F[2].vI[2]=7;F[2].vI[3]=3;//左面 F[3].SetNum(4);F[3].vI[0]=1;F[3].vI[1]=2;F[3].vI[2]=6;F[3].vI[3]=5;//右面 F[4].SetNum(4);F[4].vI[0]=2;F[4].vI[1]=3;F[4].vI[2]=7;F[4].vI[3]=6;//顶面 F[5].SetNum(4);F[5].vI[0]=0;F[5].vI[1]=1;F[5].vI[2]=5;F[5].vI[3]=4;//底面 }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
表9-3立方体面表
面 第1条边 第2条边 第3条边 第4条边 说明
F0
E4
E5
E6
E7
前面
F1
E0
E3
E2E1ຫໍສະໝຸດ 后面F2E3
E8
E7
E11
左面
F3
E1
E10
E5
E9
右面
F4
E2
E11
E6
E10
顶面
F5
E0
E9
E4
E8
底面
11
9.1.3 实体的描述模型
1. 线框模型(物体的骨架) 线框模型(wireframe model)是计算机图形学中表示物体最
14
图9-7 双三次Bezier线框模型
图9-8双三次Bezier表面模型
3.实体模型
实体模型(solid model)是在封闭的表面模型内部进行了填充, 有了如体积和重量等特性,能反映立体的真实性,立体才具有 “体”的概念。它的内部和外部的概念,定义了在表面模型的哪 一侧存在实体。它的表面有正面和反面之分。如图9-9所示。
void CTestView::ReadVertex()//读入顶点表 {
double a=100;//立方体的半边长 //顶点的三维坐标(x,y,z) V[0].x=-a;V[0].y=-a;V[0].z=-a; V[1].x=+a;V[1].y=-a;V[1].z=-a; V[2].x=+a;V[2].y=+a;V[2].z=-a; V[3].x=-a;V[3].y=+a;V[3].z=-a; V[4].x=-a;V[4].y=-a;V[4].z=+a; V[5].x=+a;V[5].y=-a;V[5].z=+a; V[6].x=+a;V[6].y=+a;V[6].z=+a; V[7].x=-a;V[7].y=+a;V[7].z=+a; }
第九章
本章内容
▪ 9.1 三维物体的数据结构 ▪ 9.2 消隐算法分类 ▪ 9.3 隐线算法 ▪ 9.4 隐面算法 ▪ 9.5 本章小结
2
本章学习目标
柏拉图多面体的数据结构 光滑物体网格划分的数学模型 凸多面体的背面剔除算法 深度缓冲算法
3
在二维显示器上绘制三维图形时,必须把三维信息经过 投影变换为二维信息。由于投影变换失去了图形的深度信 息,往往导致对图形的理解存在二义性。要生成具有真实 感的图形,就要在给定视点和视线方向之后,决定场景中 物体哪些线段或表面是可见的,哪些线段或表面是不可见 的。这一问题习惯上称为消除隐藏线和消除隐藏面,简称 为消隐。
多面体 正四面体 正六面体 正八面体 正十二面体 正二十面体
顶点数V
4
8
6
20
12
边数E
6
12
12
30
30
面数F
4
6
8
12
20
面的形状 正三角形 正方形 正三角形 正五边形 正三角形
27
〔1〕正四面体
建立正四面体的伴随立方体可以很容易地确定正四面体的顶点表
和面表。
y
V3
正四面体的外接球和其伴随 立方体的外接球是同一个球; 正四面体外接球的直径就是 立方体的对角线。假设立方 体的半边长为a,令V0点为 (a,a,a),则正V1 V2 V3 顶点表见表9-6。
4
图9-5立方体线框模型 图9-6线框模型二义性
5
9.1 三维物体的数据结构
场景中经常绘制的三维物体有
柏拉图多面体 Platonic Polyhedra
球 sphere
圆柱 cylinder
圆锥 cone
圆环 torus
这些物体可以采用线框模型描述,也可以采用表面模 型或实体模型描述。无论使用哪种模型描述,都需要为 物体建立顶点表、边表和面表构成的数据结构。建立三 维用户坐标系为右手系Oxyz,x轴水平向右为正,y轴 垂直向上为正,z轴从纸面指向观察者。
图9-1 五个顶点 图9-2 五角星连线 图9-3 五边形连线
对物体线框信息的描述不仅包括顶点坐标,而且包括每条 边是由哪些顶点连接而成。对于物体表面信息的描述包括每 个表面是由哪些边连接而成,或是由哪些顶点环绕而成。
7
9.1.2 三维物体的数据结构
在三维坐标系下,描述一个物体不仅需要顶点表描述其几何信 息,而且还需要借助于边表和面表描述其拓扑信息,才能完全确 定物体的几何形状。
用有向棱边隐含地表示表面的外法向量方向。常用右手准则定 义,拓扑合法的物体在相邻两个面的公共边界上,棱边的方向正 好相反,如图9-10所示。
与表面模型数据结构的差异。将面表的顶点索引号按照从物体 外部观察的逆时针方向的顺序排列,可确切地分清体内体外。
与线框模型、表面模型的区别。记录了顶点的信息,以及线、 面、体的拓扑信息。
class CP3 { public:
CP3(); virtual ~CP3(); CP3(double,double,double); public: double x; double y; double z; };
图9-12 三维顶点类
20
2.定义表面类
如图9-13,表面类包括表面的顶点数和表面的顶点索引号。SetNum()用 于动态设置表面的顶点数,常用于处理3个顶点的三角形面片或4个顶点的四 边形面片。
F5
V0
V1
图9-11 立方体的展开图
18
表9-4根据立方体的展开图重新设计了面表结构。
表9-4立方体面表
面 第一个顶点 第二个顶点 第三个顶点 第四个顶点 说明
F0
4
5
6
7
前面
F1
0
3
2
1
后面
F2
0
4
7
3
左面
F3
1
2
6
5
右面
F4
2
3
7
6
顶面
F5
0
1
5
4
底面
19
1.定义三维顶点类
如图9-12所示,包括顶点的三维坐标(x,y,z)
z坐标 z0=-a z1=-a z2=-a z3=-a z4= a z5= a z6= a z7= a
9
表9-2 立方体边表
边
起点
E0
V0
E1
V1
E2
V2
E3
V3
E4
V4
E5
V5
E6
V6
E7
V7
E8
V0
E9
V1
E10
V2
E11
V3
终点
V1 V2 V3 V0 V5 V6 V7 V4 V4 V5 V6 V7
实体模型常采用集合论中的并、交、差等运算来构造复杂实体 。
16
(a)正面
(b)反面
图9-9 立方体表面的正面和反面
图9-10 立方体实体模型
一般情况下,使用顶点表、边表和面表3张表可以方便地检索到 物体的任意一个顶点、任意一条边和任意一个表面,而且数据结构 清晰。
实际建模中,实体模型采用了有向棱边,相邻两个表面上共享 的一条棱边的定义方向截然相反,导致无法确定棱边的顶点连接顺 序,因而放弃边表,仅使用顶点表和面表来表示物体的几何模型。 且面表中按照表面法矢量向外的方向遍历多边形顶点索引号,表明 处理的是物体的正面。仅用顶点表和面表的缺点是物体的每条边被 重复绘制2次。
图9-15 读入立方体的面表
23
9.1.5 常用物体的数学模型
1. 柏拉图多面体
正多面体是由若干个全等的正多边 形围成,并且相交在各个顶点上的 棱边数都相等的凸多面体。正多面 体只有正四面体、正六面体、正八 面体、正十二面体和正二十面体五 种,如图9-16 所示。表9-5给出了 其几何信息。这五种多面体统称为 柏拉图多面体。柏拉图多面体属于 凸多面体。
E8
E0
E5 E9
x V1
面数,E是多面体的边数
V4
E4
V5
图9-4 立方体数学模型
8
顶点 V0 V1 V2 V3 V4 V5 V6 V7
表9-1 立方体顶点表
x坐标 x0=-a x1= a x2= a x3=-a x4=-a x5= a x6= a x7=-a
y坐标 y0=-a y1=-a y2= a y3= a y4=-a y5=-a y6= a y7= a
class CFace
{
public:
CFace();
virtual ~CFace();
void SetNum(int); //设置面片的顶点数
public:
int vN;
//面片的顶点数
int *vI;
//面片的顶点索引
};
图9-13 表面类
21
3.读入立方体的点表
在程序中定义ReadVertex()函数读入物体的顶点表如图9-14
y坐标 y0= a y1=-a y2=-a y3= a
表9-6 正四面体顶点表
12
图9-5立方体线框模型 图9-6线框模型二义性
13
2. 表面模型(物体的皮肤)
表面模型(surface model)是利用物体的外表面来构造模型, 就如同在线框模型上蒙上了一层外皮,使物体具有了一层外表。 表面模型仍缺乏体积的概念,是一个物体的空壳。与线框模型 相比,表面模型增加了一个面表,用以记录边面之间的拓扑关 系。 优点:可以对表面进行平面着色或光滑着色、可以为物体添加 光照或纹理等。 缺点:无法进行实体之间的并交叉运算。图9-7表示的是双三次 Bezier曲面的网格模型。图9-8表示的是双三次Bezier曲面的表 面模型。在图9-8中,Bezier曲面没有围成一个封闭的空间,只 是一张很薄的面片,其表面无内外之分,哪面是正面、哪面是 反面,没有给出明确的定义。