计算机图形学消隐-完整版
- 格式:pdf
- 大小:4.35 MB
- 文档页数:29
《计算机图形学》实验报告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的有向⾯积。
计算机图形学实验报告计算机图形学实验报告姓名徐沛华班级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;}。