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

人不能一眼看到一个三维物体的全部表面。从 一个视点去观察一个三维物体,必然只能看到 该物体表面上的部分点、线、面,而其余部分 则被 这些可见部分遮挡住。如果观察的是若干 个三维物体,则物体之间还可能彼此遮挡而部 分不可见。因此,如果想有真实感地显示三维 物体,必须在视点确定之后,将对象表面上不 可见的点、线、面消去。执行这一功能的算法, 称为消隐算法 消隐算法。 消隐算法
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 ,此面退化为线。
(完整word版)实验四图形消隐(完结版)

《计算机图形学》实验报告2011年1月实验四图形综合运用4.1实验目的1、通过本次实验,掌握三维图形的旋转等变换和消隐的基本概念和相关算法。
2、掌握凸多面体的消隐算法和实现。
3、进一步熟练和掌握编程环境中三维图形的绘制和消隐的程序设计方法。
4.2实验内容4.2.1绘制一个三维几何图形简单光照例程"light 0. cpp"利用openGL绘制模型#i nclude "glos.h"#i nclude <GL/gl.h>#i nclude <GL/glu.h>#i nclude <GL/glaux.h>void myi ni t(void);void CALLBACK myReshape(GLsizei w, GLsizei h);void CALLBACK display(void);void myi ni t(void){GLfloat light_positio n[] = { 1.0, 1.0, 1.0, 0.0 };glLightfv(GL_LIGHTO, GL_POSITION, light_positio n);glE nable(GL_LIGHTING);glE nable(GL_LIGHTO);glDepthFu nc(GL_LESS);glE nable(GL_DEPTH_TEST);}void CALLBACK display(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);auxSolidSphere(1.0);glFlush();}void CALLBACK myReshape(GLsizei w, GLsizei h){glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIde ntity();if (w <= h)glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.5*(GLfloat)h/(GLfloat)w,-10.0, 10.0);elseglOrtho (-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);4.2.1绘制一个三维几何图形简单光照例程"light 0. cpp"glMatrixMode(GL_MODELVIEW);glLoadIde ntity();void mai n(void){auxl ni tDisplayMode (AUX_SINGLE | AUX_RGBA);auxl ni tPositio n (0, 0, 500, 500);auxI nitWin dow ("Simple Lighti ng");myi ni t();auxReshapeF unc (myReshape); auxMa in Loop(display);程序运行结果:显示一个具有灰色光影的球。
计算机图形学——隐藏线和隐藏面的消除(消隐算法)

计算机图形学——隐藏线和隐藏⾯的消除(消隐算法)⼀、概述由于投影变换失去了深度信息,往往导致图形的⼆义性。
要消除⼆义性,就必须在绘制时消除被遮挡的不可见的线或⾯,习惯上称作消除隐藏线和隐藏⾯(或可见线判定、可见⾯判定),或简称为消隐。
经过消隐得到的投影图称为物体的真实感图形。
下⾯这个图就很好体现了这种⼆义性。
消隐后的效果图:消隐算法的分类所有隐藏⾯消隐算法必须确定:在沿透视投影的投影中⼼或沿平⾏投影的投影⽅向看过去哪些边或⾯是可见的两种基本算法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。 以上算法适合任何平面多边形。
非平面但接近平面的多边形的最佳逼近平面 的法矢量也可用此算法求出。为避免在程序 中出现两种计算平面外矢量的方法,建议凸 多边形也采用该算法计算外法矢量。多边形 所在平面的方程可写成
计算机图形学实验报告消隐

计算机图形学实验报告计算机图形学实验报告姓名徐沛华班级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)“消隐”?
将三维场景绘制在计算机二维显示屏上必须经过投影变换,投影 变换将三维信息变换到二维平面上,这个过程中深度信息被丢失, 生成的图形往往具有二义性。
计算机图形学-第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 平面多边形的外法矢量
为了判别物体上各表面是朝前面还是朝后
面,需求出各表面(平面多边形)指向体外
的法矢量。设物体在右手坐标系中,多边
形顶点按逆时针排列。当多边形为凸多边
形时,则其法矢可取成多边形相邻两边矢