ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:670.75KB ,
资源ID:12880791      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12880791.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(计算机图形学报告讲解.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

计算机图形学报告讲解.docx

1、计算机图形学报告讲解成都理工大学计算机图形学课程设计三维真实感图形设计与绘制学生姓名: 郭耀中 学 号: 201108030309 年级专业: 软件工程4班学 院: 信息科学与技术学院四川成都提交日期:2014年4月 一、 简要说明OpenGL(Open Graphic Library) 是由SGI公司的 IRIS GL 图形库发展而来的三维真实感图形生成工具, 鉴于它的跨平台、高质量、高效率、功能等特点,已经成为各种平台下的三维图形制作及交互式场景处理的工业标准,被广泛地运用于科学计算可视化、计算机动画和虚拟现实等计算机图形学热点问的解决之中。在 Windows 平台下,OpenGL 和 D

2、irectX 是两个开发三维图形应用程序的标准,OpenGL 提供了二维和三维建模、 变换、 光线处理、 色彩处理、 纹理映射、 运动模糊、 动画和实时交互等功能,是绘制真实感三维图形、建立三维交互场景、实现虚拟现实的高性能图形开发工具软件包。与 DirectX 相比,用 OpenGL 来绘制三维地形具有图形质量高、程序可移植性好等优点。本文充分利用三维图形库 OpenGL 卓越的渲染能力,在 Visual C+ 6.0环境下开发了一种基于 OpenGL 的三维真实感图形显示和渲染的工具二、 实验题目三维真实感图形设计与绘制1. 题目内容说明:(1)题目内容说明:本题目要求应用OpenGL的光

3、照技术和纹理技术实现一个简单的三维真实感图形的程序设计。程序功能要求: 1)用对话方式实现交互式的光照、材质模型参数设计。 2)交互式的模型纹理映射功能 3)用鼠标跟踪球方法实现三维模型的空间旋转2. 技术要点说明 1)三维模型显示场景树 所谓三维场景树是指将三维可视化模型场景内容分解用一种树或表数据结构描述。 2) 建立一个合理程序设计类结构三、 需求分析真实感图形的设计与绘制,是计算机图形学中的一个重要研究领域,也是三维实体造型系统和特征造型系统的重要组成部分。一般地,三维实体在计算机显示屏上有三种表现形式:简单线框图、线框消隐图和真实感图形。其中,简单线框图能够粗略表达实体的形状,但由于

4、简单线框图的二义性,从而导致表达其的实体形状具有不确定性。而线框消隐图虽然能反映实体各表面间的相互遮挡关系,从而达到消除简单线框图产生的二义性的目的,但是这两者一样地只能反映实体的几何形状和实体间的相互关系,而不能反映实体表面的特征,如表面的颜色、材质、纹理等。所以,只有真实感图形才能表现实体的这些特征,因此,在三维实体造型中,生成三维实体的光照模型,进行实体的真实感绘制与显示占有重要的地位,是很有必要的,也是我做此设计的初衷。 在设计中,我主要使用Opengl绘制真实感图形,它作为一种强大的三维图形开发工具,通过便捷的编程接口提供了处理光照和物体材质、颜色属性等通用功能。真实感图形学是计算机

5、图形的核心内容之一,是最能直接反映图形学魅力的分支。寻求能准确地描述客观世界中各种现象与景观的数学模型,并逼真地再现这些现象与景观,是图形学的一个重要研究课题。很多自然景物难以用几何模型描述,如烟雾、植物、水波、火焰等。本文所讨论的几种建模及绘制技术都超越了几何模型的限制,能够用简单的模型描述复杂的自然景物。在计算机的图形设备上实现真实感图形必须完成的四个基本任务。1. 三维场景的描述。三维造型。2. 将三维几何描述转换成为二维透视图。透视变换。3. 确定场景中的所有可见面。消隐算法,可见面探测算法。4. 计算场景中可见面的颜色。根据基于光学物理的光照模型计算可见面投射到观察者眼中的光亮度大小

6、和色彩组成。3. 课题设计思路要设计一个良好的场景和优秀的交互方式,现在虚拟现实场景十分繁多,各种交互方式也五花八门,我们要选择特定的场景,场景要保证两点:一是其新鲜性,让人耳目一新,否则会让人有过于老套的感觉;另外就是其真实度,这是本次课题的着重关注点;在选取选定的场景后,我们要定义各交互方式,在从现有可得到的交互方式案例中提取和创新,以保证开发出来的交互方式可以最大程度的提高人机交互的效率。 场景的规模是必须考虑的,因为设计的时间和人员有限,必须限制场景规模,没有时间和人力去开发过大的场景规模,但是如果场景规模过小,演示系统就无法给人带来非常强烈的真实感冲击,而且过小规模的场景也会限制交互

7、方式的设计和开发。 三维图形及动画场景的显示,就是把所建立的三维空间模型,经过计算机的复杂处理,最终在计算机二维屏幕上显示的过程,并且在显示的过程要保证其真实感。一般,设计三维图形软件要经过以下步骤:(1)图元建立三维模型。(2)设置观看物体的窗口和观看点(视点)。(3)设定各物体的属性(如色彩、光照、纹理映射等)(4)如果要物体动起来,还要进行图形变换(如几何变换、视窗变换和投影变换等)。(5)三维图形的二维化。四、 三维图形的设计过程4. 三维图形设计的过程如下:(1) 建立三维模型建立三维模型,就是在三维坐标系中画三维场景。利用画点(Point)、画线(Line)、画多边形(Polygo

8、n)等函数可以建立复杂的空间模型。在表示三维空间时,一般用齐次坐标(Homogeneous Coordinate)。在实际应用时一般把一系列顶点(Vertex )组织起来以构成物体或图元。(2) 置窗口和视口 图形显示的区域称为显示窗口。流程顺序为:定义一个窗口一般由以下步骤完成:设置窗口模式,设置窗口位置、大小,初始化窗口,窗口颜色设置清理窗口是指把窗口清成某种颜色。要观看场景,也需要一个窗口,即视口。通俗地讲,视口变大,场景被放大;视口变小,场景被缩小。下面就是一个简单视窗的代码:void myDisplay(void)glClear(GL_COLOR_BUFFER_BIT);glRect

9、f(-0.5f, -0.5f, 0.5f, 0.5f);glFlush();int main(int argc, char *argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow(第一个 OpenGL 程序);glutDisplayFunc(&myDisplay);glutMainLoop();return 0;该程序的作用是在一个黑色的窗口中央画一个

10、白色的矩形(3) 设置光照 要使物体具有真实感,就要对物体进行光照处理。在计算机图形学中,物体的真实感应考虑两种因素:光源和物体材质。OpenGL 在处理光照时采用这样一种近似:把光照系统分为三部分,分别是光源、材质和光照环境。光源就是光的来源,可以是前面所说的太阳或者电灯等。材质是指接受光照的各种物体的表面,由于物体如何反射光线只由物体表面决定(OpenGL 中没有考虑光的折射),材质特点就决定了物体反射光线的特点。光照环境是指一些额外的参数,它们将影响最终的光照画面,比如一些光线经过多次反射后,已经无法分清它究竟是由哪个光源发出,这时,指定一个“环境亮度”参数,可以使最后形成的画面更接近于

11、真实情况。(4)控制材质材质与光源相似,也需要设置众多的属性。不同的是,光源是通过 glLight*函数来设置的,而材质则是通过 glMaterial*函数来设置的。glMaterial*函数有三个参数。第一个参数表示指定哪一面的属性。可以是 GL_FRONT、GL_BACK 或者 GL_FRONT_AND_BACK。分别表示设置“正面”“ 背面”的材质,或者两面同时设置。(关于“正面”“ 背面”的内容需要参看前些课程的内容)第二、第三个参数与glLight*函数的第二、三个参数作用类似。5. 设计过程说明:首先,为了绘制三维分形图形,我们先要建立数学模型。物体的三维模型的建立,需要向计算机输

12、入三维数据,而在实际应用中,三维数据的输入是一个复杂的问题,需要用曲线、曲面拟合的方法建立模型。因此要根据不同的三维分形图形的具体情况,寻找合适的方法来建立它们各自的数学模型。其次,要在计算机上进行三维分形的算法实现。在显示设备上逼真地显示出建立的模型,需要对原始图形数据进行坐标变换、隐藏面消除和明暗处理,最后生成所要显示的真实感图形。针对不同的三维分形图形,如何采取合适的方法在计算机上实现,需要通过对问题的具体分析后进行选取。五、 三维图形的主程序6. 部分源码main函数源码:#include stdafx.h#include #include #include GLfloat xrot;

13、 / 绕X轴旋转的角度。GLfloat yrot; / 绕Y轴旋转的角度。GLuint texture6; / 存储6个面。int LastXPos,LastYPos; /上次鼠标点击处x、y坐标。BOOL IsLBDown = FALSE; /鼠标左键是否按下。读取纹理文件/加载失败是返回nullAUX_RGBImageRec *LoadBMP(char *Filename) / 加载图片。 FILE *File=NULL; if (!Filename) / 确保的到了文件名。 return NULL; / 如果没得到就返回空。 File=fopen(Filename,r); / 检查文件是

14、否存在。 if (File) / 文件是否存在? fclose(File); / 关闭文件。 return auxDIBImageLoad(Filename); / 加载图片并返回指针。 return NULL; / 加载失败返回空。加载纹理设置纹理模式并绑定纹理int LoadGLTextures() / 加载图片并贴在表面上。 int i; char filename128; /此处一次加载6个纹理 AUX_RGBImageRec *TextureImage6; / 创建纹理的存储空间。 memset(TextureImage,0,sizeof(void *)*6); / 设置指针为空。

15、/ 加载图片,检查错误,如果图片不存在就退出。 for(i=0;i6;i+) sprintf(filename,Data/%d.bmp,i+1); TextureImagei = LoadBMP(filename); if(!TextureImagei) char msg256; sprintf(msg,Cannot read the file : %s,filename); MessageBox(NULL,msg,Error,MB_OK); return FALSE; glGenTextures(6,texture); for(i=0;isizeX, TextureImagei-sizeY,

16、 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImagei-data); if(TextureImagei-data) free(TextureImagei-data); free(TextureImagei); return TRUE; /返回状态。响应窗口发生变化事件GLvoid ReSizeGLScene(GLsizei width, GLsizei height) / 调整大小和初始化GL窗口。 if (height=0) / 防止为0. height=1; / 为0是改为1. glViewport(0,0,width,height); / 设置当前视口。

17、glMatrixMode(GL_PROJECTION); / 选择投影矩阵。 glLoadIdentity(); / 复位投影矩阵。 / 计算窗口的纵横比 gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); / 选择的模型视图矩阵。 glLoadIdentity(); /重置模型观察矩阵。/场景初始化int InitGL(GLvoid) / 所有的设置。 /加载纹理 if (!LoadGLTextures() / 纹理加载程序。 return FALSE; /

18、 如果纹理不加载返回false。 /启用纹理贴图 glEnable(GL_TEXTURE_2D); / 使用纹理映射。 glShadeModel(GL_SMOOTH); / 使光滑阴影。 glClearColor(0.0f, 0.0f, 0.0f, 0.5f); / 黑色背景。 /深度检测 glClearDepth(1.0f); / 深度缓冲区设置, glEnable(GL_DEPTH_TEST); / 允许深度测试。 glDepthFunc(GL_LEQUAL); / 做深度测试的类型。 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); /

19、 真实感的角度计算。 /启用光源 GLfloat mat_ambient = 0.2f, 0.2f, 0.2f, 1.0f ; GLfloat mat_diffuse = 0.8f, 0.8f, 0.8f, 1.0f ; GLfloat mat_specular = 1.0f, 1.0f, 1.0f, 1.0f ; GLfloat mat_shininess = 50.0f ; GLfloat light0_diffuse = 1.0f, 0.0f, 0.0f, 1.0f ; GLfloat light0_position = 0.0f, 0.0f, 21.0f, 0.0f ; glMater

20、ialfv(GL_FRONT, GL_AMBIENT, mat_ambient);/指定材质的环境反射光的反射系数。 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);/制定材质的漫反射光反射系数。 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);/制定材质的镜面反射光反射系数。 glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);/制定材质的镜面反射指数值。 glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_dif

21、fuse);/指定漫反射光成分。 glLightfv(GL_LIGHT0, GL_POSITION, light0_position);/设置光源位置。 glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); return TRUE; / 初始化成功。下面的代码完成绘制网格线void drawPla

22、ne() glColor3f(1.0f, 1.0f, 1.0f); for (float u = -8.0; u = 8.0; u += 0.5f) glBegin(GL_LINES); glVertex3f(-8, 0, u); glVertex3f(8, 0, u); glVertex3f(u, 0, -8); glVertex3f(u, 0, 8); glEnd(); void MyDisPlay(void) glPushMatrix(); glRotatef(30, 9.0, -6.0, 0.0); drawPlane(); /绘制网格。 glPopMatrix(); glTransl

23、ated(3.0f, -1.0f, 2.0f); glutSolidSphere(1.0f, 20, 20);/绘制球体。 glPopMatrix(); glTranslated(3.0f, 0.5f, 0.0f); glutSolidTeapot(1.0);/绘制茶壶。 glPopMatrix(); glTranslated(-2.5f, 1.5f,-7.0f); glRotatef(60, -1.0, 0.0, 0.0); glutSolidCone(1.0f, 3.0f, 99, 1); /绘制圆锥。 glPopMatrix(); glDisable(GL_COLOR_MATERIAL)

24、; glPopMatrix(); glFlush();绘制6面体,并响应鼠标的拖动旋转void DrawGLScene(GLvoid) / 这里做所有的绘画。 glClearColor(0.0, 0.0, 255.0, 0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); / 清除屏幕和深度缓冲区。 glLoadIdentity(); glTranslatef(-3.0f,1.0f,-8.0f); /将场景向里面平移5个单位 glRotatef(xrot,1.0f,0.0f,0.0f); /沿x轴旋转 glRotatef(yrot,

25、0.0f,1.0f,0.0f); /沿y轴旋转 /绘制6面体并分别进行纹理绑定 /前面。 glBindTexture(GL_TEXTURE_2D, texture0); glBegin(GL_QUADS); glNormal3f( 0.0f, 0.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f,

26、 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glEnd(); / 后面。 glBindTexture(GL_TEXTURE_2D, texture1); glBegin(GL_QUADS); glNormal3f( 0.0f, 0.0f,-1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(

27、0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glEnd(); /上面。 glBindTexture(GL_TEXTURE_2D, texture2); glBegin(GL_QUADS); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex

28、3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glEnd(); / 下面, glBindTexture(GL_TEXTURE_2D, texture3); glBegin(GL_QUADS); glNormal3f( 0.0f,-1.0f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f)

29、; glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glEnd(); / 右面。 glBindTexture(GL_TEXTURE_2D, texture4); glBegin(GL_QUADS); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 0

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1