第5讲 计算机图形学消隐算法
- 格式:ppt
- 大小:982.00 KB
- 文档页数:61
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的有向⾯积。
计算机图形学实验报告计算机图形学实验报告姓名徐沛华班级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;}。
中国民航大学计算机与技术学院图形学实验报告课程名称:计算机图形学*名:***系:计算机科学与技术专业:计算机科学与技术年级: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~。