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

下载本文档

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

文档简介

1、2成都理工大学计算机图形学课程设计三维真实感图形设计与绘制学生姓名: 郭耀中 学 号: 201108030309年级专业:软件工程4班学 院:信息科学与技术学院四川成都提交日期:2014年4月目录一、简要说明3二、实验题目31.题目内容说明:32.技术要点说明3三、需求分析41.课题设计思路4四、三维图形的设计过程51.三维图形设计的过程如下:52.设计过程说明:6五、三维图形的主程序71.部分源码7六、设计结果14七、设计小结21 2计算机图形学三维图形设计与绘制一、 简要说明OpenGL(Open Graphic Library) 是由SGI公司的 IRIS GL 图形库发展而来的三维真实

2、感图形生成工具, 鉴于它的跨平台、高质量、高效率、功能等特点,已经成为各种平台下的三维图形制作及交互式场景处理的工业标准,被广泛地运用于科学计算可视化、计算机动画和虚拟现实等计算机图形学热点问的解决之中。在 Windows 平台下,OpenGL 和 DirectX 是两个开发三维图形应用程序的标准,OpenGL 提供了二维和三维建模、 变换、 光线处理、 色彩处理、 纹理映射、 运动模糊、 动画和实时交互等功能,是绘制真实感三维图形、建立三维交互场景、实现虚拟现实的高性能图形开发工具软件包。与 DirectX 相比,用 OpenGL 来绘制三维地形具有图形质量高、程序可移植性好等优点。本文充分

3、利用三维图形库 OpenGL 卓越的渲染能力,在 Visual C+ 6.0环境下开发了一种基于 OpenGL 的三维真实感图形显示和渲染的工具二、 实验题目三维真实感图形设计与绘制1. 题目内容说明:(1)题目内容说明:本题目要求应用OpenGL的光照技术和纹理技术实现一个简单的三维真实感图形的程序设计。程序功能要求: 1)用对话方式实现交互式的光照、材质模型参数设计。 2)交互式的模型纹理映射功能 3)用鼠标跟踪球方法实现三维模型的空间旋转2. 技术要点说明 1)三维模型显示场景树 所谓三维场景树是指将三维可视化模型场景内容分解用一种树或表数据结构描述。 2) 建立一个合理程序设计类结构三

4、、 需求分析真实感图形的设计与绘制,是计算机图形学中的一个重要研究领域,也是三维实体造型系统和特征造型系统的重要组成部分。一般地,三维实体在计算机显示屏上有三种表现形式:简单线框图、线框消隐图和真实感图形。其中,简单线框图能够粗略表达实体的形状,但由于简单线框图的二义性,从而导致表达其的实体形状具有不确定性。而线框消隐图虽然能反映实体各表面间的相互遮挡关系,从而达到消除简单线框图产生的二义性的目的,但是这两者一样地只能反映实体的几何形状和实体间的相互关系,而不能反映实体表面的特征,如表面的颜色、材质、纹理等。所以,只有真实感图形才能表现实体的这些特征,因此,在三维实体造型中,生成三维实体的光照

5、模型,进行实体的真实感绘制与显示占有重要的地位,是很有必要的,也是我做此设计的初衷。 在设计中,我主要使用Opengl绘制真实感图形,它作为一种强大的三维图形开发工具,通过便捷的编程接口提供了处理光照和物体材质、颜色属性等通用功能。真实感图形学是计算机图形的核心内容之一,是最能直接反映图形学魅力的分支。寻求能准确地描述客观世界中各种现象与景观的数学模型,并逼真地再现这些现象与景观,是图形学的一个重要研究课题。很多自然景物难以用几何模型描述,如烟雾、植物、水波、火焰等。本文所讨论的几种建模及绘制技术都超越了几何模型的限制,能够用简单的模型描述复杂的自然景物。在计算机的图形设备上实现真实感图形必须

6、完成的四个基本任务。1. 三维场景的描述。三维造型。2. 将三维几何描述转换成为二维透视图。透视变换。3. 确定场景中的所有可见面。消隐算法,可见面探测算法。4. 计算场景中可见面的颜色。根据基于光学物理的光照模型计算可见面投射到观察者眼中的光亮度大小和色彩组成。1. 课题设计思路要设计一个良好的场景和优秀的交互方式,现在虚拟现实场景十分繁多,各种交互方式也五花八门,我们要选择特定的场景,场景要保证两点:一是其新鲜性,让人耳目一新,否则会让人有过于老套的感觉;另外就是其真实度,这是本次课题的着重关注点;在选取选定的场景后,我们要定义各交互方式,在从现有可得到的交互方式案例中提取和创新,以保证开

7、发出来的交互方式可以最大程度的提高人机交互的效率。 场景的规模是必须考虑的,因为设计的时间和人员有限,必须限制场景规模,没有时间和人力去开发过大的场景规模,但是如果场景规模过小,演示系统就无法给人带来非常强烈的真实感冲击,而且过小规模的场景也会限制交互方式的设计和开发。 三维图形及动画场景的显示,就是把所建立的三维空间模型,经过计算机的复杂处理,最终在计算机二维屏幕上显示的过程,并且在显示的过程要保证其真实感。一般,设计三维图形软件要经过以下步骤:(1)图元建立三维模型。(2)设置观看物体的窗口和观看点(视点)。(3)设定各物体的属性(如色彩、光照、纹理映射等)(4)如果要物体动起来,还要进行

8、图形变换(如几何变换、视窗变换和投影变换等)。(5)三维图形的二维化。四、 三维图形的设计过程1. 三维图形设计的过程如下:(1) 建立三维模型建立三维模型,就是在三维坐标系中画三维场景。利用画点(Point)、画线(Line)、画多边形(Polygon)等函数可以建立复杂的空间模型。在表示三维空间时,一般用齐次坐标(Homogeneous Coordinate)。在实际应用时一般把一系列顶点(Vertex )组织起来以构成物体或图元。(2) 置窗口和视口 图形显示的区域称为显示窗口。流程顺序为:定义一个窗口一般由以下步骤完成:设置窗口模式,设置窗口位置、大小,初始化窗口,窗口颜色设置清理窗口

9、是指把窗口清成某种颜色。要观看场景,也需要一个窗口,即视口。通俗地讲,视口变大,场景被放大;视口变小,场景被缩小。下面就是一个简单视窗的代码:void myDisplay(void)glClear(GL_COLOR_BUFFER_BIT);glRectf(-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);glutIni

10、tWindowSize(400, 400);glutCreateWindow(第一个 OpenGL 程序);glutDisplayFunc(&myDisplay);glutMainLoop();return 0;该程序的作用是在一个黑色的窗口中央画一个白色的矩形(3) 设置光照 要使物体具有真实感,就要对物体进行光照处理。在计算机图形学中,物体的真实感应考虑两种因素:光源和物体材质。OpenGL 在处理光照时采用这样一种近似:把光照系统分为三部分,分别是光源、材质和光照环境。光源就是光的来源,可以是前面所说的太阳或者电灯等。材质是指接受光照的各种物体的表面,由于物体如何反射光线只由物体表面决定

11、(OpenGL 中没有考虑光的折射),材质特点就决定了物体反射光线的特点。光照环境是指一些额外的参数,它们将影响最终的光照画面,比如一些光线经过多次反射后,已经无法分清它究竟是由哪个光源发出,这时,指定一个“环境亮度”参数,可以使最后形成的画面更接近于真实情况。(4)控制材质材质与光源相似,也需要设置众多的属性。不同的是,光源是通过 glLight*函数来设置的,而材质则是通过 glMaterial*函数来设置的。glMaterial*函数有三个参数。第一个参数表示指定哪一面的属性。可以是 GL_FRONT、GL_BACK 或者 GL_FRONT_AND_BACK。分别表示设置“正面”“ 背面

12、”的材质,或者两面同时设置。(关于“正面”“ 背面”的内容需要参看前些课程的内容)第二、第三个参数与glLight*函数的第二、三个参数作用类似。2. 设计过程说明:首先,为了绘制三维分形图形,我们先要建立数学模型。物体的三维模型的建立,需要向计算机输入三维数据,而在实际应用中,三维数据的输入是一个复杂的问题,需要用曲线、曲面拟合的方法建立模型。因此要根据不同的三维分形图形的具体情况,寻找合适的方法来建立它们各自的数学模型。其次,要在计算机上进行三维分形的算法实现。在显示设备上逼真地显示出建立的模型,需要对原始图形数据进行坐标变换、隐藏面消除和明暗处理,最后生成所要显示的真实感图形。针对不同的

13、三维分形图形,如何采取合适的方法在计算机上实现,需要通过对问题的具体分析后进行选取。五、 三维图形的主程序1. 部分源码main函数源码:#include stdafx.h#include #include #include GLfloat xrot; / 绕X轴旋转的角度。GLfloat yrot; / 绕Y轴旋转的角度。GLuint texture6; / 存储6个面。int LastXPos,LastYPos; /上次鼠标点击处x、y坐标。BOOL IsLBDown = FALSE; /鼠标左键是否按下。读取纹理文件/加载失败是返回nullAUX_RGBImageRec *LoadBMP

14、(char *Filename) / 加载图片。FILE *File=NULL; if (!Filename) / 确保的到了文件名。return NULL; / 如果没得到就返回空。File=fopen(Filename,r); / 检查文件是否存在。if (File) / 文件是否存在?fclose(File); / 关闭文件。return auxDIBImageLoad(Filename); / 加载图片并返回指针。return NULL; / 加载失败返回空。加载纹理设置纹理模式并绑定纹理int LoadGLTextures() / 加载图片并贴在表面上。int i; char fil

15、ename128; /此处一次加载6个纹理AUX_RGBImageRec *TextureImage6; / 创建纹理的存储空间。memset(TextureImage,0,sizeof(void *)*6); / 设置指针为空。/ 加载图片,检查错误,如果图片不存在就退出。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);Me

16、ssageBox(NULL,msg,Error,MB_OK);return FALSE; glGenTextures(6,texture); for(i=0;isizeX, TextureImagei-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImagei-data);if(TextureImagei-data)free(TextureImagei-data);free(TextureImagei);return TRUE; /返回状态。响应窗口发生变化事件GLvoid ReSizeGLScene(GLsizei width, GLsizei hei

17、ght) / 调整大小和初始化GL窗口。if (height=0) / 防止为0.height=1; / 为0是改为1.glViewport(0,0,width,height); / 设置当前视口。glMatrixMode(GL_PROJECTION); / 选择投影矩阵。glLoadIdentity(); / 复位投影矩阵。/ 计算窗口的纵横比gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW); / 选择的模型视图矩阵。glLoadIdentity(); /重置

18、模型观察矩阵。/场景初始化int InitGL(GLvoid) / 所有的设置。/加载纹理if (!LoadGLTextures() / 纹理加载程序。return FALSE; / 如果纹理不加载返回false。/启用纹理贴图glEnable(GL_TEXTURE_2D); / 使用纹理映射。glShadeModel(GL_SMOOTH); / 使光滑阴影。glClearColor(0.0f, 0.0f, 0.0f, 0.5f); / 黑色背景。 /深度检测glClearDepth(1.0f); / 深度缓冲区设置, glEnable(GL_DEPTH_TEST); / 允许深度测试。glD

19、epthFunc(GL_LEQUAL); / 做深度测试的类型。glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); / 真实感的角度计算。/启用光源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,

20、0.0f, 0.0f, 1.0f ;GLfloat light0_position = 0.0f, 0.0f, 21.0f, 0.0f ;glMaterialfv(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,

21、mat_shininess);/制定材质的镜面反射指数值。glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);/指定漫反射光成分。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,

22、 1.0f, 1.0f, 1.0f);return TRUE; / 初始化成功。下面的代码完成绘制网格线void drawPlane()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

23、.0, 0.0);drawPlane(); /绘制网格。glPopMatrix();glTranslated(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);/绘制圆锥。glP

24、opMatrix();glDisable(GL_COLOR_MATERIAL);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

25、.0f,0.0f); /沿x轴旋转glRotatef(yrot,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)

26、; glVertex3f( 1.0f, 1.0f, 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.

27、0f);glTexCoord2f(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);

28、 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, -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);

30、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.0f); glVertex3f( 1.0f, -1.0f, 1.0f);glEnd();/ 左面。glBindTexture(GL_TEXTURE_2D, texture5);glBegin(GL_QUADS);glNormal3f(-1.0f, 0.0f, 0.0f

31、);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, 1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);glEnd();MyDisPlay(); /xrot+=xspeed; /yrot+=yspeed; glutSwapBuffers();处理鼠标按下事件void processMouse(int button, int state, int x, int y) /鼠标左键按下 if (button = GLUT_LEFT_BUTTON & state=GLUT_DOWN)int xPos,yPos;xPos = x; yPos = y;LastXPos = xPos;LastYPos = yPos;IsLBDown = TRUE;/鼠标左键弹起if(button = GLUT_LEFT_BUTTON & state=GLUT_UP)IsLBDown = FALSE;/处理鼠标拖动事件void

温馨提示

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

评论

0/150

提交评论