图形学实验五 消隐算法实例实现
(完整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的有向⾯积。
计算机图形学第五次实验报告
《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形, 并实践图形的造型与变换等。
二、理论基础运用几何造型, 几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。
1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。
三. 算法设计与分析真实感图形绘制过程中, 由于投影变换失去了深度信息, 往往导致图形的二义性。
要消除这类二义性, 就必须在绘制时消除被遮挡的不可见的线或面, 习惯上称之为消除隐藏线和隐藏面, 或简称为消隐, 经过消隐得到的投影图称为物体的真实图形。
消隐处理是计算机绘图中一个引人注目的问题, 目前已提出多种算法, 基本上可以分为两大类:即物体空间方法和图象空间方法。
物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。
用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。
1).消隐算法的实现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-缓冲器) 和刷新缓冲器,分别保存各像素所对应 的三维点的深度和像素属性。缺点是它 需要很大的存储空间。 • 优点是算法简单:首先,缓冲器初始化, 即初始化每个像素的深度和颜色。 其次,计算多边形面上各像素点的深度 值, 若距离投影面较近,则记下深度和 颜色。
计算机图形学实验报告消隐
计算机图形学实验报告计算机图形学实验报告姓名徐沛华班级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;}。
凸多面体的消隐实验报告
凸多面体的消隐姓名:问琪浩学号:2012551219实验名称:凸多面体的消隐一、实验目的1、掌握计算机三维图形方式的建立。
2、理解凸多面体的消隐算法。
3、做出消隐后的凸多面体。
二、实验步骤1、在VC++ 6.0里新建工程。
2、使用三表结构定义正方体的属性。
3、根据顶点表与变换矩阵求出变换后的矩阵。
4、根据变换矩阵求出B[i]的值判断所在面是否朝前。
5、若B[i]>0,则连接可见面的顶点,B[i]<0,那么该面为消隐面,不进行操作。
实验代码#include<graphics.h>#include<stdio.h>#include<conio.h>#include<iostream>using namespace std;int MB[6][2],HB[30],DDB[8][4],i,j,k;double T[4][4],FB[8][4],FFB[8][4],B[6],G[4][4];int main(){FILE *p;p=fopen("data.txt","r");if(p==NULL) printf("文件无法打开!");while(true){for( i=0;i<6;i++) for(int j=0;j<2;j++) fscanf(p,"%d",&MB[i][j]);for( i=0;i<30;i++) fscanf(p,"%d",&HB[i]);for( i=0;i<8;i++) for(int j=0;j<4;j++) fscanf(p,"%d",&DDB[i][j]);for( i=0;i<4;i++) for(int j=0;j<4;j++) fscanf(p,"%lf",&T[i][j]);break;}for(i=0;i<8;i++)for(j=0;j<4;j++)for(k=0;k<4;k++) FB[i][j]+=DDB[i][k]*T[k][j];for(int i=0;i<6;i++){j=MB[i][0];doublea=(FB[HB[j]-1][2]-FB[HB[j+1]-1][2])*(FB[HB[j]-1][0]-FB[HB[j+2]-1][0]);doubleb=(FB[HB[j]-1][0]-FB[HB[j+1]-1][0])*(FB[HB[j]-1][2]-FB[HB[j+2]-1][2] );B[i]=a-b;printf("%lf, ",B[i]);}initgraph(640,480);for(i=0;i<6;i++){if(B[i]>0){j=MB[i][0];moveto(FB[HB[j]-1][0]+200,FB[HB[j]-1][2]+200);for(;j<=MB[i][1];j++)lineto(FB[HB[j+1]-1][0]+200,FB[HB[j+1]-1][2]+200);}}getch();}二、实验截图四.实验总结通过本次实验,将平时课堂的理论知识在试验中实践性的操作,使我更加理解和巩固消隐算法的原理,以及三表结构在其中的作用,整体的框架有一定的概念,不过还是很生疏,在同学的帮助下,最终还是完成了实验,也对代码方面有了深层次的学习。
计算机图形学消隐算法的分析与实现
本科毕业设计题目:计算机图形学消隐算法的分析与实现姓名院系信息科学与工程学院专业计算机科学与技术年级学号指导教师2011 年5月10 日毕业设计选题报告毕业设计任务下达书学院信息科学与工程学院专业计算机科学与技术学号****** 姓名*****一、毕业设计题目计算机图形学消隐算法的分析与实现二、主要内容本设计是在对凸多面体的消隐算法、以及Z—Buffer算法进行系统分析以后,应用Visual C++设计程序语言,从而实现对三维立体图形的消隐处理,以得到物体的只是图形。
三、具体要求(1)查找相关资料,理解Visual C++及其图形函数的理论知识;(2)根据设计内容主动分析整体并划分设计模块;(3)根据划分的设计模块独立完成实现各个功能的具体代码;(4)高度重视论文的撰写并调试实现整体功能,主动和指导老师沟通;(5)认真听取指导老师的意见,遵循相关的规定,以达到设计最终效果。
四、主要参考文献[1]陈元琰.张晓竞计算机图形学实用技术[M]. 北京:科学出版社,2000[2]范幸义. 计算机图形学(第三版)[M]. 重庆:重庆大学出版社,2008.2.[3]张全伙,张剑达.计算机图形学[M].北京:机械工业出版社,2003.8.[4](美)Peter Shirley计算机图形学(第二版)[M].北京:人民邮电出版社,2007.6.五、进程安排六、毕业设计任务下达书于年月日发出。
毕业设计应于年月日前完成后交指导教师,由指导教师评阅后提交毕业设计答辩委员会。
七、毕业设计任务下达书一式两份,一份给学生,一份留学院(系)存档。
指导教师:签发于20 年月日分管院长:签发于20 年月日毕业设计开题报告院(系):信息科学与工程学院学号:***注:1、论文(设计)总成绩=指导教师评定成绩(50%)+评阅人评定成绩(20%)+答辩成绩(30%)2、将总成绩由百分制转换为五级制,填入本表相应位置。
目录1. 前言 (3)2. 开发环境和工具 (4)3. 消隐算法的描述 (5)3.1消隐算法的提出 (5)3.2消隐算法的分类 (7)4. 消隐算法的数学知识 (8)4.1向量的叉积 (8)4.2线性代数 (8)4.2.1行列式 (8)4.2.2矩阵 (9)4.3三维坐标与二维坐标的转换 (10)5.几种常见的消隐算法分析与比较 (11)5.1凸多面体消隐处理 (11)5.2隐藏面的消除 (13)5.2.2 画家算法 (16)5.2.3 Z-buffer消隐算法 (19)5.3几种消隐算法的比较 (20)6. 结束语 (21)参考文献 (21)致谢 (22)附录:部分模块代码 (22)计算机图形学消隐算法的分析与实现摘要:用计算机生成具有真实感的三维物体图形,是计算机图形学的一个重要研究内容,而要实现这一过程就不得不提到消隐算法。
图形学消隐
一、消隐当我们观察空间任何一个不透明的物体时,只能看到该物体朝向我们的那些表面,其余的表面由于被物体所遮挡我们看不到。
若把可见的和不可见的线都画出来,对视觉会造成多义性。
会有后边两种情况要消除二义性,就必须在绘制时消除被遮挡的不可见的线或面,习惯上称作消除隐藏线和隐藏面,简称为消隐。
消隐不仅与消隐对象有关,还与观察者的位置有关。
二、消隐的分类1.按消隐对象分类线消隐:消隐对象是物体的边面消隐:消隐对象是物体上的面2.按消隐空间分类客体(物体)空间的消隐算法:以场景中的物体为处理单位。
假设场景中有k个物体,将其中一个物体与其余k-1个物体逐一比较,仅显示它可见表面已达到消隐的目的。
(此类算法通常用于线框图的消隐!)图像空间的消隐算法:以屏幕窗口内的每个像素为处理单元。
对屏幕上每个像素进行判断,决定哪个多边形在该像素可见(这类算法是消隐算法的主流)三、图像空间的消隐算法:1.Z-buffer算法2.扫描线算法3.区域分割算法深度排序算法:画家算法:这两种算法即是客体空间算法也是图像空间算法原理:若场景中有许多物体,就是先画远的物体,再画近的物体。
这样一来,近的物体自然就会盖住远的物体。
但实际情况并不理想,在三维场景中,一个物体可能有些部分远,有些部分近,所以不管用什么顺序画,都无法得到正确的结果,所以画家算法只能解决简单场景的消隐问题。
Z-buffer算法1、也称Z缓冲区算法和深度缓冲器算法(能跟踪屏幕上每个像素深度的算法),让计算机生成复杂图形成为可能。
2、该算法有帧缓冲器和深度缓冲器,对应两个数组:Intensity(x,y)-属性数组(帧缓冲器),存储图像空间每个可见像素的光强或颜色Depth(x,y)-深度数组(Z-buffer),存放图像空间每个可见像素的Z坐标。
Z-buffer保存的是经过投影变换后的z坐标,距离眼睛近的地方z坐标的分辨率比较大,远处的分辨率小。
3、Z-buffer算法思想(开一个和帧缓存一样大小的存储空间,利用空间上的牺牲换取算法上的简洁)(1)先将z缓冲器中各单元的初始值置为最小值(2)当要改变某个像素的颜色值时,首先检查当前多边形的深度值是否大于该像素原来的深度值(3)如果大于原来的z值,说明当前多边形更靠近观察点,用它的颜色替换像素原来的颜色。
图形、消隐的一种实现深度消隐算法的一种实现
图形、消隐的一种实现——深度消隐算法的一种实现张世海[1]梁晓梅[2]([1]吉林省计算中心吉林长春130012[2]吉林省衡鑫贸易有限公司吉林长春130021)[摘要]根据Bourand的算法思想,改造Bresenham算法,以实现对于直线基元、三角基元的深度消隐,从而绘制有深度消隐功能的复杂图形。
[关键词]深度消隐图形基元[中图分类号]TP3 [文献标识码]A[文章编号]1009-5349(2013)11-0025-02消隐处理是计算机图形学设计的一个非常艰巨的任务,一个没有消隐的图形看起来是杂乱无章的,只有消除了隐藏线和隐藏面的图形看起来才与自然感观相符合,这也是真实化图形的基础,本文就是建立图形基元的深度消隐算法。
基元是建立图形系统和应用的基石。
要通过编程的方式来显示一个特定的场景时,点、边和三角形是最基本的图形。
因为任何一个空间的物体都可以用三角形小面来逼近,而任何一个多边形,无论它是单连通区域还是多连通区域,都可以通过细化规则转换成多个三角形来处理。
定义基元是基于图形描述和图形应用的方便性的。
深度消隐算法是一种基于图形空间的消隐算法。
把每一个像素点都视为是三维的,Z表示像素深度,如果不同面片上的点被投影到屏幕上的同一点,则只有离视点最近的点的属性才是该点(在屏幕上)的最终属性。
典型的属性包括颜色和深度。
深度消隐算法在实现上有很大的不同,文献中采用了平面公式法计算内点的深度,用空间直线方程来计算边界直线和边界坐标。
这样处理的好处是,对于图形的内点,不同的扫描线均采用同一增量。
这样只需计算扫描线的起点和终点的X 坐标,从而大大加快了运算。
但是,该算法在处理复杂的曲面时,面片和面片相交的地方常出现深度迁跃现象。
笔者根据Gouraud的思想,基于Bresenham算法,采用双线性插值法计算三角形内点的深度,采用沿边自适应线性增量法计算边界深度。
这种算法简单,便于硬件实现,并且不需要对面片进行排序,对于具有中等复杂程度的场景速度也比较快。
凸多面体消隐的一种算法及实现
for ( j= 0; j < 4; j+ + )
scanf( "% f" ,& a [i ] [j ]) ;
printf( " Please input [b ] v alue\ n") ; * 输入 [a ]、
for ( i= 0; i < 21; i+ + )
[ b ]、 [c ]*
scanf( "% d",& b [i ]) ;
24
交 通 与 计 算 机 第 15卷
图 3 例图的存贮结构
图 2 例图的逻辑结构
图 3给出了该五棱锥数据的存贮结构。 该结构为一个简化了的三表结构。 设物体坐 标系为右手坐标系 , 将各顶点的坐标以齐次 坐标形 式给出 ,存 入 A( 6, 4)二维实 型数组 中 ,构成顶点表 A。该表记录了物体的几何信 息。 拓扑信息 E: { V }、 F: {V }由线段关系表 B,面表 C来存贮。 B、 C均为一维整型数组。 表 B存放着顶点的编号 ,表 C存放着面的指 针。表 C的前六项下标 ,为棱锥某一个面的编 号 ,其值为该面起点的指针。 相邻两项值的 差 ,为前一项下标所表示的面的顶点个数。这 些点通过表 B、表 C被链接在一起构成了表 示该棱面的环结构。
V2、 VБайду номын сангаас3 坐标 ( X、 Y、 Z)后 ,就会很方便地计算
出 F1 面的 C值。 通过 C值就可以判断出 F1
面的可见性。
4 程序算法
流程图如图 5所示。
图 5 消隐算法
为 mf1 ,则有: m= V1 V2 × V2V3
i
j
k
= X 2 - X 1 Y 2 - Y 1 Z2 - Z1
计算机图形学消隐
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(每个多边形) {
图形学实验五 消隐算法实例实现
中国民航大学计算机与技术学院图形学实验报告课程名称:计算机图形学*名:***系:计算机科学与技术专业:计算机科学与技术年级: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~。
使用OpenGL编程实现三维实体消隐算法实验
一、实验题目:使用OpenGL编程实现三维实体消隐算法实验二、实验要求:学习Visual C++ 6.0 集成编程环境的使用,OpenGL编程环境的设置,OpenGL语法及基本函数的使用等基础知识,并编程实现三维消隐实体算法,得出相应的三维消隐实体输出图形。
三、算法的源程序:#include<GL/glut.h>GLfloat pos[]={-2,4,5,1},amb[]={0.3,0.3,0.3,1.0};GLfloat front_amb_diff[]={0.7,0.5,1.1,1.0};GLfloat back_amb_diff[]={0.4,0.7,1,1.0};GLfloat spe[]={0.25,0.25,0.25,1.0};GLfloat theta=0,dt=1.5,axes[3][3]={{1,0,0},{0,1,0},{0,0,1}};int axis=0;void display(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();if(axis<3)glRotated(theta,axes[axis][0],axes[axis][1],axes[axis][2]);else{glPushMatrix();glRotated(theta,0,0,1);glLightfv(GL_LIGHT0,GL_POSITION,pos);glPopMatrix();}glutSolidTorus(.4,1,48,96); // 图片调用函数可以设置图片的属性glPopMatrix(); // glutWireTeapot(); 茶壶glutSwapBuffers(); // glutSolidCone(); 圆锥}void idle(void){if(theta>=360)axis=(axis+1)%4;theta=(theta<360)?theta+dt:dt;glutPostRedisplay();}void main(int argc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(500,500);glutInitWindowPosition(200,100);glutCreateWindow("GLUT Object");glClearColor(1,1,0,0);//背景颜色黄色glEnable(GL_DEPTH_TEST);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45,1.0,2,8);glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,front_amb_diff); glMaterialfv(GL_BACK,GL_AMBIENT_AND_DIFFUSE,back_amb_diff); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,spe);glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,75);glLightfv(GL_LIGHT0,GL_AMBIENT,amb);glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslated(0,0,-5);glLightfv(GL_LIGHT0,GL_POSITION,pos); glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glutDisplayFunc(display); glutIdleFunc(idle);glutMainLoop();}。
消隐
深度缓存算法 ( 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)。
中国民航大学计算机与技术学院
图形学实验报告
课程名称:计算机图形学
*名:***
系:计算机科学与技术
专业:计算机科学与技术
年级: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~。