




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10讲图形消隐
1第10讲图形消隐基本概念提高消隐算法效率的常用方法画家算法Z缓冲器算法扫描线Z缓冲器算法OpenGL相关函数2问题投影变换失去了深度信息,往往导致图形的二义性及失去遮挡关系要消除二义性和保持遮挡关系,就必须在绘制(投影)时消除被遮挡的不可见的线或面,习惯上称作消除隐藏线和隐藏面,简称为消隐失去遮挡关系长方体线框投影图的二义性10.1基本概念3消隐的对象三维物体三维体的表示主要采用边界(多边形)表示消隐结果与观察物体有关,也与视点位置和方向有关线框图消隐图真实感图形10.1基本概念4消隐分类消除隐藏面:确定可见面(消除不可见面)——表面表示物体(本讲讨论)消除隐藏线:消除不可见线——线框表示物体10.1基本概念5面消隐算法分类投影窗口内的像素为处理单元——确定最近点
for(窗口内的每一个像素) {
确定距视点最近的物体,以该物体表面的颜色来显示像素
}图像空间-image-space10.1基本概念6面消隐算法分类(续)场景中的物体为处理单元——物体上的面是否最近for(场景中的每一个物体){
将其与场景中的其它物体比较,确定其表面的可见部分;显示该物体表面的可见部分;}场景空间-object-space10.1基本概念710.2提高消隐算法效率的常用方法主要技术1.利用连贯性相邻物体的属性之间有一定的连贯性,其属性值通常是平缓过渡的,如颜色值、空间位置关系等包括:物体连贯性面的连贯性区域连贯性扫描线连贯性深度连贯性810.2提高消隐算法效率的常用方法(1)物体连贯性:如果物体A与物体B是完全相互分离的,则在消隐时,只需比较A、B两物体之间的遮挡关系,无须对它们的表面多边形逐一进行测试。例如,若A距视点较B远,则在测试B上的表面的可见性时,无须考虑A的表面(2)面的连贯性:一张面内的各种属性值一般都是缓慢变化的,允许采用增量形式对其进行计算910.2提高消隐算法效率的常用方法(3)区域连贯性:区域指屏幕上一组相邻的像素,它们通常为同一个可见面所占据,可见性相同。区域连贯性表现在一条扫描线上时,即为扫描线上的每个区间内只有一个面可见(4)扫描线的连贯性:相邻两条扫描线上,可见面的分布情况相似(5)深度连贯性:同一表面上的相邻部分深度是相近的,而占据屏幕上同一区域的不同表面的深度不同。这样在判断表面间的遮挡关系时,只需取其上一点计算出深度值,比较该深度值便能得出结果1010.2提高消隐算法效率的常用方法2.包围盒技术定义:一个形体的包围盒指的是包围它的简单形体两个条件包围盒充分紧密包围着形体对其的测试比较简单主要包围盒长方体正方体球1110.2提高消隐算法效率的常用方法作用—避免盲目求交例如:两个空间多边形A、B在投影平面上的投影分别为A’,B’,因为A’、B’的矩形包围盒不相交,则A’、B’不相交,无须进行遮挡测试如果包围盒相交,需进一步测试。右下图(a)包围盒相交,投影也相交;(b)包围盒相交,投影不相交一般情况下,判断两物体是否遮挡时,前一种情况大量存在,避免了物体间的复杂相交测试1210.2提高消隐算法效率的常用方法3.背面剔除外法向:规定每个多边形的外法向都是指向物体外部的前向面:若多边形的外法向与投影方向(观察方向)的夹角为钝角,称为前向面后向面:若多边形的外法向与投影方向(观察方向)的夹角为锐角,称为后向面(背面)夹角为180-u投影方向1310.2提高消隐算法效率的常用方法剔除依据:背面总是被前向面所遮挡,从而不可见前向面后向面JEAF、HCBG、JIHGF为后向面CGVABDEFHIJNVnVn1410.2提高消隐算法效率的常用方法4.空间分割技术遮挡判断依据:场景中的物体,它们的投影在投影平面上是否有重叠部分?(是否存在相互遮挡的可能?)对于根本不存在相互遮挡关系的物体,应避免这种不必要的测试原因:物体在场景中分散,有些物体的投影相距甚远,不会存在遮挡关系方法:将投影平面上的窗口分成若干小区域;为每个小区域建立相关物体表,表中物体的投影于该区域有相交部分;则在小区域中判断那个物体可见时,只要对该区域的相关物体表中的物体进行比较1510.2提高消隐算法效率的常用方法5.物体的分层表示表示形式:模型变换中的树形表示方式原理:减少场景中物体的个数,从而降低算法复杂度16方法:将父节点所代表的物体看成子节点所代表物体的包围盒,当两个父节点之间不存在遮挡关系时,就没有必要对两者的子节点做进一步测试。父节点之间的遮挡关系可以用它们之间的包围盒进行预测试10.2提高消隐算法效率的常用方法17背景画家作画:先画远景后画近景画家的作画顺序暗示出所画物体之间的相互遮挡关系10.3画家算法18算法基本思想:1)先把屏幕置成背景色2)将场景中的物体按其距观察点的远近进行排序,结果放在一张线性表中;(线性表构造:距观察点远的称优先级低,放在表头;距观察点近的称优先级高,放在表尾。该表称为深度优先级表)3)然后按照从远到近(从表头到表尾)的顺序逐个绘制物体关键如何对场景中的物体按深度(远近)排序,建立深度优先级表?10.3画家算法1910.3画家算法世界坐标系
用户用来定义图形的坐标系,主要用于计算机图形场景中所有图形对象的空间定位和定义。观察坐标系可以在世界坐标系的任何位置、任何方向定义,通常以视点的位置为原点,通过用户指定的一个向上的观察向量来定义整个坐标系统。unvP0(x0,y0,z0)xyz2010.3画家算法画家算法的观察变换将世界坐标系中的三个坐标轴转换为与观察坐标系的三个坐标轴对应重合的逆变换平移变换,将观察参考点移到世界坐标系的原点处旋转变换,将u,v,n分别对应到x,y,z 即绕x轴旋转角,绕y轴旋转角,绕z轴旋转角21多边形的排序算法1)将场景中所有多边形存入一个线性表,记为L;2)如果L中仅有一个多边形,算法结束;否则根据每个多边形的nmin
对它们预排序。不妨假定多边形P落在L的表首,即nmin(P)为最小再记
Q
为L–{P}(表中其余多边形)中任意一个;3)判别P,Q之间的关系,有如下二种: (1)对所有的Q,有nmax(P)<nmin(Q),则多边形P
的确距观察点最远,它不可能遮挡别的多边形。令L=L–{P},返回第二步;
(2)存在某一个多边形Q,使nmax(P)>nmin(Q),需进一步判别:10.3画家算法在观察坐标系uvn中,观察方向是n轴的负方向,因而n坐标大者距观察者更近。nmin(P)和
nmax(P)
分别为P各顶点n坐标的最小和最大值。[投影为正平行投影]22(A)若P,Q的投影P’,Q’的包围盒不相交(图a),则P,Q
在表中的次序不重要,令L=L–{P},返回2);否则进行下一步(B)若P
的所有顶点位于Q
所在平面的不可见的一侧(图b),则P,Q关系正确,令L=L–{P},返回2);否则进行下一步10.3画家算法23(C)若Q的所有顶点位于P
所在平面的可见的一侧(图c),则P,Q关系正确,令L=L–{P},返回2);否则进行下一步(D)对P,Q投影P’,Q’求交,若P’,Q’不相交(图d),则P,Q在表中的次序不重要,令L=L–{P},返回2);否则在它们所相交的区域中任取一点,计算P,Q在该点的深度值,如果P的深度小,则P,Q关系正确,令L=L–{P},返回2);否则交换P,Q,返回3)10.3画家算法24问题不能处理多边形循环遮挡和多边形相互穿透解决方法:分割10.3
画家算法25又称Z-Buffer算法(深度缓冲depth-buffer)组成:帧缓冲器--保存各像素颜色值
Z缓冲器--保存各像素处物体深度值
10.4Z缓冲器算法Z
缓冲器中的单元与帧缓冲器中的单元一一对应26算法
(1)先将Z缓冲器中个单元的初始值置为最小值。(2)多边形投影时,当要改变某个像素的颜色值时,首先检查当前多边形的深度值是否大于该像素原来的深度值(保存在该像素所对应的Z缓冲器的单元中),
A:如果大于,说明当前多边形更靠近观察点,用它的颜色替换像素原来的颜色;同时保存深度值
B:否则说明在当前像素处,当前多边形被前面所绘制的多边形遮挡了,是不可见的,像素的颜色值不改变10.4Z缓冲器算法27算法伪码{ 帧缓存全置为背景色; 深度缓存全置为最小Z值;
for(每一个多边形) {for(该多边形所覆盖的每个像素(x,y)){
计算该多边形在该像素的深度值Z(x,y);if(Z(x,y)大于Z缓存在(x,y)的值) {
把Z(x,y)存入Z缓存中(x,y)处;把多边形在(x,y)处的颜色值存入帧缓存的(x,y)处;
} } }}10.4Z缓冲器算法28特点Z缓冲器算法是所有图像空间算法中最简单的一种隐藏面消除算法。在像素级上以近物取代远物,与形体在屏幕上的出现顺序无关。优点
1)简单稳定,利于硬件实现
2)不需要整个场景的几何数据缺点
1)需要一个额外的Z缓冲器
2)每个多边形占据的每个像素处都要计算深度值,计算量大10.4Z缓冲器算法29由来Z缓冲器算法中所需要的Z缓冲器容量较大,为克服这个缺点,可以将整个绘图区域分割成若干个小区域,然后一个区域一个区域地显示,这样Z缓冲器的单元数只要等于一个区域内像素的个数如果将小区域取成屏幕上的扫描线,就得到扫描线Z缓冲器算法10.5扫描线Z缓冲器算法30算法思想在处理当前扫描线时,用一个一维数组作为当前扫描线的Z-buffer。首先找出与当前扫描线相关的多边形,以及每个多边形中相关的边对。对每一个边对之间的小区间上的各像素,计算深度,并与Z-buffer中的值比较,找出各像素处可见平面。(采用增量算法计算深度)写帧缓存。10.5扫描线Z缓冲器算法31算法
for(v=0;v<vmax;v++){ for(u=0;u<umax;u++){将帧缓冲器的第(u,v)单元置为背景色;将Z缓冲器的第u单元置为最小值;
}for(每个多边形)//当前扫描线相关的多边形
{
求出多边形在投影平面上的投影与当前扫描线的相交区间;
for(该区间内的每个像素(u,v))
{计算多边形在该像素处的深度值d;
if(d>Z缓冲器的第u单元的值)
{置帧缓冲器的第(u,v)单元值为当前多边形颜色;
置Z缓冲器的第u单元值为d;}}}}//处理下一条扫描线10.5扫描线Z缓冲器算法32缺点在每一个被多边形覆盖像素处需要计算深度值被多个多边形覆盖的像素需要多次计算深度值10.5扫描线Z缓冲器算法33多边形剔除函数-消除后向面(背面)激活:glEnable(GL_CULL_FACE)无效:glDisable(GL_CULL_FACE)剔除背面:glCullFace(GL_BACK)显示模式:线框方式
glPolygonMode(GL_GRONT_AND_BACK,GL_LINE)10.6OpenGL相关函数3410.6OpenGL相关函数例:剔除后向面#include<stdlib.h>#include<GL/glut.h>GLfloatvertices[][3]={{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},{1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,1.0},{1.0,-1.0,1.0},{1.0,1.0,1.0},{-1.0,1.0,1.0}};staticGLfloattheta[]={0.0,0.0,0.0};staticGLintaxis=2;staticGLdoubleviewer[]={0.0,0.0,5.0};voidpolygon(inta,intb,intc,intd){glBegin(GL_POLYGON);glVertex3fv(vertices[a]);glVertex3fv(vertices[b]);glVertex3fv(vertices[c]);glVertex3fv(vertices[d]);glEnd();}3510.6OpenGL相关函数voidcolorcube(){//正前面
glColor3f(1,1,1);polygon(4,5,6,7);//正背面
glColor3f(1.0,0,0);polygon(0,3,2,1);glColor3f(0,1,0);polygon(2,3,7,6);glColor3f(0,0,1);polygon(0,4,7,3);glColor3f(1,1,0);polygon(1,2,6,5);glColor3f(0,1,1);polygon(0,1,5,4);}voiddisplay(){glClear(GL_COLOR_BUFFER_BIT);glLoadIdentity();//更新视点位置
gluLookAt(viewer[0],viewer[1],viewer[2],0.0,0.0,0.0,0.0,1.0,0.0);glRotatef(theta[0],1.0,0.0,0.0);glRotatef(theta[1],0.0,1.0,0.0);/*旋转立方体*/glRotatef(theta[2],0.0,0.0,1.0);colorcube();glutSwapBuffers();}3610.6OpenGL相关函数voidkeys(unsignedcharkey,intx,inty){/*用x,X,y,Y,z,andZ键移动视点*/if(key=='x')viewer[0]-=1.0;if(key=='X')viewer[0]+=1.0;if(key=='y')viewer[1]-=1.0;if(key=='Y')viewer[1]+=1.0;if(key=='z')viewer[2]-=1.0;if(key=='Z')viewer[2]+=1.0;display();}voidmyReshape(intw,inth){glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)glFrustum(-2.0,2.0,-2.0*(GLfloat)h/(GLfloat)w,2.0*(GLfloat)h/(GLfloat)w,2.0,20.0);elseglFrustum(-2.0,2.0,-2.0*(GLfloat)w/(GLfloat)h,2.0*(GLfloat)w/(GLfloat)h,2.0,20.0);/*或者用gluPerspective(45.0,w/h,1.0,10.0);*/glMatrixMode(GL_MODELVIEW);}3710.6OpenGL相关函数voidmouse(intbtn,intstate,intx,inty){if(btn==GLUT_LEFT_BUTTON&&state==GLUT_DOWN)axis=0;if(btn==GLUT_MIDDLE_BUTTON&&state==GLUT_DOWN)axis=1;if(btn==GLUT_RIGHT_BUTTON&&state==GLUT_DOWN)axis=2; theta[axis]+=2.0;if(theta[axis]>360.0)theta[axis]-=360.0;display();}3810.6OpenGL相关函数intmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);glutInitWindowSize(300,300);glutCreateWindow("cube");glutDisplayFunc(display);glutReshapeFunc(myReshape);glutMouseFunc(mouse);glutKeyboardFunc(keys);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);glEnable(GL_CULL_FACE);glCullFace(GL_BACK);
glutMainLoop();}无剔除剔除39深度缓存函数显示模式:glutInitDisplayMode(××|××|GLUT_DEPTH)深度缓存初始化:glClear(GL_DEPTH_BUFFER_BIT)(1)在每显示新的一帧前清除(2)设置的默认值为1(3)设置初始值:glClearDepth(maxDepth)激活:glEnable(GL_DEPTH_TEST);(默认为不激活)10.6OpenGL相关函数4010.6OpenGL相关函数例:Z-Buffer消隐#include<stdlib.h>#include<GL/glut.h>GLfloatvertices[][3]={{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},{1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,1.0},{1.0,-1.0,1.0},{1.0,1.0,1.0},{-1.0,1.0,1.0}};staticGLfloattheta[]={0.0,0.0,0.0};staticGLintaxis=2;staticGLdoubleviewer[]={0.0,0.0,5.0};voidpolygon(inta,intb,intc,intd){glBegin(GL_POLYGON);glVertex3fv(vertices[a]);glVertex3fv(vertices[b]);glVertex3fv(vertices[c]);glVertex3fv(vertices[d]);glEnd();}4110.6OpenGL相关函数voidcolorcube(){//正前面
glColor3f(1,1,1);polygon(4,5,6,7);//正背面
glColor3f(1.0,0,0);polygon(0,3,2,1);glColor3f(0,1,0);polygon(2,3,7,6);glColor3f(0,0,1);polygon(0,4,7,3);glColor3f(1,1,0);polygon(1,2,6,5);glColor3f(0,1,1);polygon(0,1,5,4);}voiddisplay(){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glClearDepth(1);glLoadIdentity();//更新视点位置
gluLookAt(viewer[0],viewer[1],viewer[2],0.0,0.0,0.0,0.0,1.0,0.0);glRotatef(theta[0],1.0,0.0,0.0);glRotatef(theta[1],0.0,1.0,0.0);/*旋转立方体*/glRotatef(theta[2],0.0,0.0,1.0);colorcube();glutSwapBuffers();}4210.6OpenGL相关函数voidkeys(unsignedcharkey,intx,inty){/*用x,X,y,Y,z,andZ键移动视点*/if(key=='x')viewer[0]-=1.0;if(key=='X')viewer[0]+=1.0;if(key=='y')viewer[1]-=1.0;if(key=='Y')viewer[1]+=1.0;if(key=='z')viewer[2]-=1.0;if(key=='Z')viewer[2]+=1.0;display();}voidmyReshape(intw,inth){gl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《密铺》(教案)2024-2025学年数学四年级下册
- 二年级上册数学教案-7.12 观察物体-青岛版(五年制)
- 2025年汽车美容员工合同模板
- 2025年学习雷锋精神62周年主题活动方案 (汇编3份)
- 部编版语文四年级下册第二单元 阅读分享课《灰尘的旅行》 表格式公开课一等奖创新教学设计
- 期末检测(二)2022-2023学年语文三年级上册(部编版)
- 《第5课 网上搜索》教学设计教学反思-2023-2024学年小学信息技术人教版三起四年级下册
- 2024年UV无影胶水项目资金筹措计划书代可行性研究报告
- 2025年度夫妻财产共管与家庭责任分担协议
- 2025年度影视演员安全防护与保险赔偿合同
- 大学生职业素养训练(第六版)教案 第二单元 学习职业礼仪
- 2022年中华护理学会输液连接装置安全管理专家共识解读
- 内镜下ESD护理配合
- DB34∕T 1644-2012 南方红豆杉用材林栽培技术规程
- 直肠癌课件完整版本
- 2024年山东省青岛市普通高中自主招生物理试卷(含解析)
- 胸部影像检查护理常规
- 【Z精密零部件公司企业文化建设问题及优化建议14000字(论文)】
- 2024-2030年红茶行业市场深度调研及发展趋势与投资战略研究报告
- 2024Growatt 15000-25000UE古瑞瓦特光伏逆变器用户手册
- 2024年国家公务员考试专业分类专业目录
评论
0/150
提交评论