计算机图形学第五次实验报告_第1页
计算机图形学第五次实验报告_第2页
计算机图形学第五次实验报告_第3页
计算机图形学第五次实验报告_第4页
计算机图形学第五次实验报告_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机图形学实验报告实验十一 真实感图形一、实验教学目标与基本要求初步实现真实感图形,并实践图形的造型与变换等。二、理论基础运用几何造型,几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。1. 用给定地形高程数据绘制出地形图;2. 绘制一(套)房间,参数自定。三算法设计与分析真实感图形绘制过程中,由于投影变换失去了深度信息,往往导致图形的二义性。要消除这类二义性,就必须在绘制时消除被遮挡的不可见的线或面,习惯上称之为消除隐藏线和隐藏面,或简称为消隐,经过消隐得到的投影图称为物体的真实图形。消隐处理是计算机绘图中一个引人注目的问题,目前已提出多种算法,基本上可以分为两大类:

2、 即物体空间方法和图象空间方法。物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的; 而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。1).消隐算法的实现1.物体空间的消隐算法 物体空间法是在三维坐标系中,通过分析物体模型间的几何关系,如物体的几何位置、与观察点的相对位置等,来进行隐藏面判断的消隐算法。世界坐标系是描述物体的原始坐标系,物体的世界坐标描述了物体的基本形状。为了更好地观察和描述物体,经常需要对其世界坐标进行平移和旋转,而得到物体的观察坐标。物体的观察坐标能得到描述物体的更好视

3、角,所以物体空间法通常都是在观察坐标系中进行的。观察坐标系的原点一般即是观察点。物体空间法消隐包括两个基本步骤,即三维坐标变换和选取适当的隐藏面判断算法。选择合适的观察坐标系不但可以更好地描述物体,而且可以大大简化和降低消隐算法的运算。因此,利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。这需要对物体进行三维旋转和平移变换。常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序法、光线投射法和区域子分法。其中前三种算法最常用,它们的基础都是背面消隐原理。所谓背面消隐原理,即是相对观察点来说朝向后面的物体表面是不可见的,应被隐藏。下面只

4、对平面公式法作详细介绍,其他方法可参看有关文献。 根据解析几何原理,通过标准的平面方程可以判断给定点是在平面的正面还是背面。平面公式法利用此原理来判断观察点位于物体表面的哪一面,如位于背面一侧,则表面不可见,应被消隐; 反之则可见。对物体的任意表面,可将其划分为若干个平面,在根据平面上任意三点的坐标可以求得其平面方程。标准的平面方程为:Ax+By+Cz+D=0; 其中A、B、C、D 为决定平面的常数。当把一个平面想象成一个凸型多面体时,设观察点坐标为(x,y,z),如果:1 Ax+By+Cz+D=0,则观察点(x,y,z)是该平面表面上的一个点;2 Ax+By+Cz+D0,则观察点(x,y,z

5、)在凸型多面体内部(称该表面是不可见的或隐藏的);3 Ax+By+Cz+D0,则平面不可见,应被隐藏;2 D0,则平面是可见面,应被画出。2 图像空间的消隐算法 图象空间法基于物体三维模型的二维显示图形来确定物体或表面上的每一点与观察点的远近关系,从而判断哪些表面遮挡了其它表面。为了获得三维物体的二维显示图形,在对物体进行旋转和平移变化后,还需对物体进行透视投影变换。图像空间法包括Z缓冲区法、扫面线法、光线投射法和极值检测法等几种。以下是这几种算法的比较。1 Z缓冲区消隐算法简单、可靠,而且消隐和表现效果很好。但需要的内存容量大,运算复杂,费时;2 扫描线法克服了Z缓冲区法需要分配与屏幕上象素

6、点的个数相同单元的巨大内存这一缺点;3 光线投射法的思想是: 考察由视点出发穿过观察屏幕的一象素而射入场景的一条射线,则可确定出场景中与该射线相交的物体。在计算出光线与物体表面的交点之后,离象素最近的交点的所在面片的颜色为该象素的颜色; 如果没有交点,说明没有多边形的投影覆盖此象素,用背景色显示它即可。4 极值检测法需与其它消隐算法结合适用,主要用来提高消隐速度。极值检测法通过计算物体表面的显示坐标的极大和极小值来判断这两个表面是否存在重叠。2)光照模型 计算机图形学中真实感成像包括两部分内容:物体的精确图形表示和场景中光照效果的适当物理描述。光照效果包括光的反射、透明性、表面纹理和阴影。 在

7、下面的讨论中,假定光源为点光源。从某点光源照射到物体表面上一点,再反射出来的光,可以分为三部分:环境光、漫反射光和镜面反射光。 为可见物体的光照效果建立模型是一个非常复杂的过程,计算机图形学中光照模型可以由描述物体表面明暗度的物理公式推导出来。为了减少明暗度计算量,通常采用简化的光照计算经验模型。下面介绍一些基本的光照模型。1 环境光一个物体表面即使不直接暴露在光源下,只要其周围的物体被照亮,它也可能看得见,称为环境光。环境光没有空间或方向上的特征,在所有方向上和所有物体表面上投射的环境光数量都恒定不变。 由于环境光只能为每个面产生一个平淡的明暗效果,因而在绘制场景时很少仅考虑环境光作用。2

8、漫反射设物体表面在P点的法矢为N; 从P点指向光源的矢量为L;N与L的夹角为;若N与L的夹角小于0或大于90度,则光线被物体自身遮挡而照射不到P点。由Lambert余弦定理可得点P处漫反射光的强度为: 如有多个点光源: 3 镜面反射 镜面反射情况由Phong模型给出: 考虑到受距离影响的衰减,上式重写为: 4 简单光照模型从视点观察到物体上任一点P处的光强度I应为环境光反射光强度Ie、漫反射光强度Id以及镜面反射光的光强度Is的总和。在RGB颜色模型中,把入射光强I设为三个分量,分别代表RGB三基色的光强,通过这些分量的值来调整光源的颜色。同样的,Ka、Ks、Kd也有三个分量。于是,RGB颜色

9、模型形式: 3)绘制真实感图形下面我们采OpenGL实现地球绕太阳的公转和月球绕地球的公转并自身带有一定速率的自转。在DrawScene函数中先画太阳椭圆线(DrawSunEllipse),在画太阳(DrawSun(),其次地球(DrawEarth(),在画地球椭圆线(DrawEarthEllipse()),最后画月亮(DrawMoon())。下面分别介绍各个图形是怎样表现出来的。1 DrawSunEllipse():画椭圆线是根据方程x*x/a*a+y*y/b*b=1;转换为三角表达形式:x=a*cos(angle),y=b*sin(angle);使angle角度在0,2*PI中变化是绘点便

10、可得到一个以点组成的椭圆。2 DrawSun():画太阳比较简单,直接绑定纹理(glBindTexture(),,在绘球(gluSphere())即可。3 DrawEarth():想要在绘出地球的运行轨迹,即地球不论怎样转都在太阳的椭圆上,即须将进行模型平移(glTranslatef()),将当前的坐标系移到太阳椭圆的位置上来。考虑到绘制太阳和其椭圆时是在当前坐标系上进行绘制的,现在平移至太阳椭圆上,即只需在x,z轴上分别平移x=a*cos(angle),z=b*sin(angle),即glTranslatef(x,0,z);在到这个坐标系上来进行绘制;但此时地球并未随地球而转动,想实现这个效

11、果可将模型平移中的x,z值变化,这里采用程序的多线程性,这里在Revolution()中while(TRUE)循环所有的angle角度值。注意因为系统处理速度较快,若不在x,z中设置相应的暂停函数,则很难看出效果,这里用Sleep(20)来暂停。4 DrawEarthEllipse():绘制地球椭圆时,注意此时的坐标系已在地球的位置上了,除非调用glLoadIdentity()重置坐标系函数。同绘制太阳椭圆原理一样,采用椭圆方程,只不过这里的椭圆大小是太阳椭圆的7倍,即x=(a/7.0)*cos(angle),z=(b/7.0)*sin(angle)DrawMoon():绘制月球,同样月球是在

12、地球的轨道上运行,同理,亦要平移模型坐标系,使x=(a/7.0)*cos(angle),z=(b/7.0)*sin(angle),同地球公转一样设置在多线程函数中Revolution(),调用glTransferf(x,0,z)定位到地球轨迹上,并实现月亮的公转。5 视角的变换和视点的平移此程序可通过上、下键来进行视点位置的前移或后移;通过左右实现视线方向的左右变换。通过PgUp键实现视线向上翻转,通过PgDn实现实现向下翻转:在说其平移和变换时,先介绍glLookAt()函数,前三个函数为视点方向,中间三个为参考点(=视点方向+实现方向),后后三个参数为成像正立,一般设置为0,1,0。初始化

13、视x=0.0f,y=0.0f,z=5.0f;在定义视线位置lx=0.0f,ly=0.0f,lz=-1.0f;glLookAt(x,y,z,x+lx,y+ly,z+lz,0,1,0);视点位置平移:在xz平面内,仅需改变x,z值即可;前移:x+=lx*(一定速值);z+=lz*(一定速值);同理,后移x-=lx*(一定速值);z-=lz*(一定速值);视线方向改变:当视线向右变换时,此时视角(MoveAngel按一定速率自增)改变,xz平面内lx,lz值改变,即lx=sin(MoveAngle),lz=-cos(MoveAngle);同理视线左边换时,MoveAngle按一定速率自减,使lx=sin(MoveAngle),lz=-cos(MoveAngle);PgUp,PgDn的图像翻转实现:同理类似与视线的变换,只不过变换的平面不一样,PgUp和PgDn的上下翻转是在yz平面内实现,且在视线上下变换的同时,y点的视点位置亦要随之改变,这也就是翻转与视线变换的不同之所在了。四、程序调试及结果的分析本程序运行环境为VC下的opengl环境。实验效果:按“上、下”键可实现视点的前移和后退。按“左、右”键可实现视线的左右变换。按“PgUp、PgDn”键可实现实现的图像的翻转。按“L”键可实现光源的启用或关闭。由于实验代码比较长,本实验暂不将代码附在实验报告中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论