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

上传人:b****3 文档编号:12880791 上传时间:2023-04-22 格式:DOCX 页数:25 大小:670.75KB
下载 相关 举报
计算机图形学报告讲解.docx_第1页
第1页 / 共25页
计算机图形学报告讲解.docx_第2页
第2页 / 共25页
计算机图形学报告讲解.docx_第3页
第3页 / 共25页
计算机图形学报告讲解.docx_第4页
第4页 / 共25页
计算机图形学报告讲解.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

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

《计算机图形学报告讲解.docx》由会员分享,可在线阅读,更多相关《计算机图形学报告讲解.docx(25页珍藏版)》请在冰豆网上搜索。

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

计算机图形学报告讲解

 

成都理工大学

计算机图形学课程设计

三维真实感图形设计与绘制

 

学生姓名:

郭耀中

学号:

201108030309

年级专业:

软件工程4班

学院:

信息科学与技术学院

 

四川·成都

提交日期:

2014年4月

 

一、简要说明

OpenGL(OpenGraphicLibrary)是由SGI公司的IRISGL图形库发展而来的三维真实感图形生成工具,鉴于它的跨平台、高质量、高效率、功能等特点,已经成为各种平台下的三维图形制作及交互式场景处理的工业标准,被广泛地运用于科学计算可视化、计算机动画和虚拟现实等计算机图形学热点问的解决之中。

在Windows平台下,OpenGL和DirectX是两个开发三维图形应用程序的标准,OpenGL提供了二维和三维建模、变换、光线处理、色彩处理、纹理映射、运动模糊、动画和实时交互等功能,是绘制真实感三维图形、建立三维交互场景、实现虚拟现实的高性能图形开发工具软件包。

与DirectX相比,用OpenGL来绘制三维地形具有图形质量高、程序可移植性好等优点。

本文充分利用三维图形库OpenGL卓越的渲染能力,在VisualC++6.0环境下开发了一种基于OpenGL的三维真实感图形显示和渲染的工具

二、实验题目

三维真实感图形设计与绘制

1.题目内容说明:

(1)题目内容说明:

本题目要求应用OpenGL的光照技术和纹理技术实现一个简单的三维真实感图形的程序设计。

程序功能要求:

1)用对话方式实现交互式的光照、材质模型参数设计。

2)交互式的模型纹理映射功能

3)用鼠标跟踪球方法实现三维模型的空间旋转

2.技术要点说明

1)三维模型显示场景树

所谓三维场景树是指将三维可视化模型场景内容分解用一种树或表数据结构描述。

2)建立一个合理程序设计类结构

三、需求分析

真实感图形的设计与绘制,是计算机图形学中的一个重要研究领域,也是三维实体造型系统和特征造型系统的重要组成部分。

一般地,三维实体在计算机显示屏上有三种表现形式:

简单线框图、线框消隐图和真实感图形。

其中,简单线框图能够粗略表达实体的形状,但由于简单线框图的二义性,从而导致表达其的实体形状具有不确定性。

而线框消隐图虽然能反映实体各表面间的相互遮挡关系,从而达到消除简单线框图产生的二义性的目的,但是这两者一样地只能反映实体的几何形状和实体间的相互关系,而不能反映实体表面的特征,如表面的颜色、材质、纹理等。

所以,只有真实感图形才能表现实体的这些特征,因此,在三维实体造型中,生成三维实体的光照模型,进行实体的真实感绘制与显示占有重要的地位,是很有必要的,也是我做此设计的初衷。

在设计中,我主要使用Opengl绘制真实感图形,它作为一种强大的三维图形开发工具,通过便捷的编程接口提供了处理光照和物体材质、颜色属性等通用功能。

真实感图形学是计算机图形的核心内容之一,是最能直接反映图形学魅力的分支。

寻求能准确地描述客观世界中各种现象与景观的数学模型,并逼真地再现这些现象与景观,是图形学的一个重要研究课题。

很多自然景物难以用几何模型描述,如烟雾、植物、水波、火焰等。

本文所讨论的几种建模及绘制技术都超越了几何模型的限制,能够用简单的模型描述复杂的自然景物。

在计算机的图形设备上实现真实感图形必须完成的四个基本任务。

  1.三维场景的描述。

三维造型。

  2.将三维几何描述转换成为二维透视图。

透视变换。

  3.确定场景中的所有可见面。

消隐算法,可见面探测算法。

4.计算场景中可见面的颜色。

根据基于光学物理的光照模型计算可见面投射到观察者眼中的光亮度大小和色彩组成。

3.课题设计思路

要设计一个良好的场景和优秀的交互方式,现在虚拟现实场景十分繁多,各种交互方式也五花八门,我们要选择特定的场景,场景要保证两点:

一是其新鲜性,让人耳目一新,否则会让人有过于老套的感觉;另外就是其真实度,这是本次课题的着重关注点;在选取选定的场景后,我们要定义各交互方式,在从现有可得到的交互方式案例中提取和创新,以保证开发出来的交互方式可以最大程度的提高人机交互的效率。

场景的规模是必须考虑的,因为设计的时间和人员有限,必须限制场景规模,没有时间和人力去开发过大的场景规模,但是如果场景规模过小,演示系统就无法给人带来非常强烈的真实感冲击,而且过小规模的场景也会限制交互方式的设计和开发。

三维图形及动画场景的显示,就是把所建立的三维空间模型,经过计算机的复杂处理,最终在计算机二维屏幕上显示的过程,并且在显示的过程要保证其真实感。

一般,设计三维图形软件要经过以下步骤:

(1)图元建立三维模型。

(2)设置观看物体的窗口和观看点(视点)。

(3)设定各物体的属性(如色彩、光照、纹理映射等)

(4)如果要物体动起来,还要进行图形变换(如几何变换、视窗变换和投影变换等)。

(5)三维图形的二维化。

四、三维图形的设计过程

4.三维图形设计的过程如下:

(1)建立三维模型

建立三维模型,就是在三维坐标系中画三维场景。

利用画点(Point)、画线(Line)、画多边形(Polygon)等函数可以建立复杂的空间模型。

在表示三维空间时,一般用齐次坐标(HomogeneousCoordinate)。

在实际应用时一般把一系列顶点(Vertex)组织起来以构成物体或图元。

(2)置窗口和视口

图形显示的区域称为显示窗口。

流程顺序为:

定义一个窗口一般由以下步骤完成:

设置窗口模式,设置窗口位置、大小,初始化窗口,窗口颜色设置

清理窗口是指把窗口清成某种颜色。

要观看场景,也需要一个窗口,即视口。

通俗地讲,视口变大,场景被放大;视口变小,场景被缩小。

下面就是一个简单视窗的代码:

voidmyDisplay(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glRectf(-0.5f,-0.5f,0.5f,0.5f);

glFlush();

}

intmain(intargc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);

glutInitWindowPosition(100,100);

glutInitWindowSize(400,400);

glutCreateWindow("第一个OpenGL程序");

glutDisplayFunc(&myDisplay);

glutMainLoop();

return0;

}

该程序的作用是在一个黑色的窗口中央画一个白色的矩形

(3)设置光照

要使物体具有真实感,就要对物体进行光照处理。

在计算机图形学中,物体的真实感应考虑两种因素:

光源和物体材质。

OpenGL在处理光照时采用这样一种近似:

把光照系统分为三部分,分别是光源、材质和光照环境。

光源就是光的来源,可以是前面所说的太阳或者电灯等。

材质是指接受光照的各种物体的表面,由于物体如何反射光线只由物体表面决定(OpenGL中没有考虑光的折射),材质特点就决定了物体反射光线的特点。

光照环境是指一些额外的参数,它们将影响最终的光照画面,比如一些光线经过多次反射后,已经无法分清它究竟是由哪个光源发出,这时,指定一个“环境亮度”参数,可以使最后形成的画面更接近于真实情况。

(4)控制材质

材质与光源相似,也需要设置众多的属性。

不同的是,光源是通过glLight*函数来设置的,而材质则是通过glMaterial*函数来设置的。

glMaterial*函数有三个参数。

第一个参数表示指定哪一面的属性。

可以是GL_FRONT、GL_BACK或者GL_FRONT_AND_BACK。

分别表示设置“正面”“背面”的材质,或者两面同时设置。

(关于“正面”“背面”的内容需要参看前些课程的内容)第二、第三个参数与glLight*函数的第二、三个参数作用类似。

5.设计过程说明:

首先,为了绘制三维分形图形,我们先要建立数学模型。

物体的三维模型的建立,需要向计算机输入三维数据,而在实际应用中,三维数据的输入是一个复杂的问题,需要用曲线、曲面拟合的方法建立模型。

因此要根据不同的三维分形图形的具体情况,寻找合适的方法来建立它们各自的数学模型。

其次,要在计算机上进行三维分形的算法实现。

在显示设备上逼真地显示出建立的模型,需要对原始图形数据进行坐标变换、隐藏面消除和明暗处理,最后生成所要显示的真实感图形。

针对不同的三维分形图形,如何采取合适的方法在计算机上实现,需要通过对问题的具体分析后进行选取。

 

五、三维图形的主程序

6.部分源码

main函数源码:

#include"stdafx.h"

#include

#include

#include

GLfloatxrot;//绕X轴旋转的角度。

GLfloatyrot;//绕Y轴旋转的角度。

GLuinttexture[6];//存储6个面。

intLastXPos,LastYPos;//上次鼠标点击处x、y坐标。

BOOLIsLBDown=FALSE;//鼠标左键是否按下。

读取纹理文件

//加载失败是返回null

AUX_RGBImageRec*LoadBMP(char*Filename)//加载图片。

{

FILE*File=NULL;

if(!

Filename)//确保的到了文件名。

{

returnNULL;//如果没得到就返回空。

}

File=fopen(Filename,"r");//检查文件是否存在。

if(File)//文件是否存在?

{

fclose(File);//关闭文件。

returnauxDIBImageLoad(Filename);//加载图片并返回指针。

}

returnNULL;//加载失败返回空。

}

加载纹理设置纹理模式并绑定纹理

intLoadGLTextures()//加载图片并贴在表面上。

{

inti;

charfilename[128];

//此处一次加载6个纹理

AUX_RGBImageRec*TextureImage[6];//创建纹理的存储空间。

memset(TextureImage,0,sizeof(void*)*6);//设置指针为空。

//加载图片,检查错误,如果图片不存在就退出。

for(i=0;i<6;i++)

{

sprintf(filename,"Data/%d.bmp",i+1);

TextureImage[i]=LoadBMP(filename);

if(!

TextureImage[i])

{

charmsg[256];

sprintf(msg,"Cannotreadthefile:

%s",filename);

MessageBox(NULL,msg,"Error",MB_OK);

returnFALSE;

}

}

glGenTextures(6,texture);

for(i=0;i<6;i++)

{

glBindTexture(GL_TEXTURE_2D,texture[i]);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[i]->sizeX,TextureImage[i]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[i]->data);

if(TextureImage[i]->data)

free(TextureImage[i]->data);

free(TextureImage[i]);

}

returnTRUE;//返回状态。

}

响应窗口发生变化事件

GLvoidReSizeGLScene(GLsizeiwidth,GLsizeiheight)//调整大小和初始化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();//重置模型观察矩阵。

}

//场景初始化

intInitGL(GLvoid)//所有的设置。

{

//加载纹理

if(!

LoadGLTextures())//纹理加载程序。

{

returnFALSE;//如果纹理不加载返回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);//真实感的角度计算。

//启用光源

GLfloatmat_ambient[]={0.2f,0.2f,0.2f,1.0f};

GLfloatmat_diffuse[]={0.8f,0.8f,0.8f,1.0f};

GLfloatmat_specular[]={1.0f,1.0f,1.0f,1.0f};

GLfloatmat_shininess[]={50.0f};

GLfloatlight0_diffuse[]={1.0f,0.0f,0.0f,1.0f};

GLfloatlight0_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,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,1.0f,1.0f,1.0f);

returnTRUE;//初始化成功。

}

下面的代码完成绘制网格线

voiddrawPlane()

{

glColor3f(1.0f,1.0f,1.0f);

for(floatu=-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();

}

}

voidMyDisPlay(void)

{

glPushMatrix();

glRotatef(30,9.0,-6.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);//绘制圆锥。

glPopMatrix();

glDisable(GL_COLOR_MATERIAL);

glPopMatrix();

glFlush();

}

绘制6面体,并响应鼠标的拖动旋转

voidDrawGLScene(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,0.0f,1.0f,0.0f);//沿y轴旋转

//绘制6面体并分别进行纹理绑定

//前面。

glBindTexture(GL_TEXTURE_2D,texture[0]);

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,1.0f);

glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);

glEnd();

//后面。

glBindTexture(GL_TEXTURE_2D,texture[1]);

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(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,texture[2]);

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);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,texture[3]);

glBegin(GL_QUADS);

glNormal3f(0.0f,-1.0f,0.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);

glTexCoord2f(1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);

glEnd();

//右面。

glBindTexture(GL_TEXTURE_2D,texture[4]);

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