04图形图示设计资料.docx
- 文档编号:8008625
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:25
- 大小:132.80KB
04图形图示设计资料.docx
《04图形图示设计资料.docx》由会员分享,可在线阅读,更多相关《04图形图示设计资料.docx(25页珍藏版)》请在冰豆网上搜索。
04图形图示设计资料
学 期:
2011上学期
课程名称:
计算机图形学
任课教师:
姓名:
1.1.作业任务
本学期计算机图形学课程期末作业在VC++基础上基于OpenGL的三维动态图形实现,实现语言VC++,编辑、调试环境VS2008,在学期末终于基本开发完成。
是对自我工作的检验和测试,在撰写报告的过程中能够更深刻的了解计算机图形学的理念通过这份文档来记录我们在开发此软件的过程中遇到的问题以及改善的方法。
现在对整个开发过程加以认识、记录和总结,留下经验,汲取教训。
为以后的其他工作留下经验资料,为以后遇到相同的问题和从事类似项目奠定坚实的基础,以便以后有资可寻、有底可查,增长个人见识,为自己程序开发方面的成长而努力奋斗。
并作为期末向指导老师报告的材料。
通过此次大作业的编写,我要达到进一步熟悉OpenGL编程的目的,并在以后的学习中得到总结。
1.2计算机图形学简介
计算机图形学(ComputerGraphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。
简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。
图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。
从处理技术上来看,图形主要分为两类,一类是基于线条信息表示的,如工程图、等高线地图、曲面的线框图等,另一类是明暗图,也就是通常所说的真实感图形。
计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。
为此,必须建立图形所描述的场景的几何表示,再用某种光照模型,计算在假想的光源、纹理、材质属性下的光照明效果。
所以计算机图形学与另一门学科计算机辅助几何设计有着密切的关系。
事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。
同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系。
图形与图像两个概念间的区别越来越模糊,但还是有区别的:
图像纯指计算机内以位图形式存在的灰度信息,而图形含有几何属性,或者说更强调场景的几何表示,是由场景的几何模型和景物的物理属性共同组成的。
计算机图形学的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等OpenGL是个与硬件无关的软件接口,可以在不同的平台如Windows95、WindowsNT、Unix、Linux、MacOS、OS/2之间进行移植。
因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。
由于OpenGL是图形的底层图形库,没有提供几何实体图元,不能直接用以描述场景。
但是,通过一些转换程序,可以很方便地将AutoCAD、3DS/3DSMAX等3D图形设计软件制作的DXF和3DS模型文件转换成OpenGL的顶点数组。
计算机图形学(ComputerGraphics)是近三十年来发展迅速,应用广泛的新兴学科,主要研究怎样用数字计算机生成、处理和显示图形。
图形的具体应用范围很广,但是从基本的处理技术看只有两类,一类是线条,如工程图、地图、曲线图表等;另一类是明暗图,与照片相似。
为了生成图形,首先要有原始数据或数学模型,如工程人员构思的草图,地形航测的判读数据,飞机的总体方案模型,企业经营的月统计资料等等。
这些数字化的输入经过计算机处理后变成图形输出。
可以说计算机图形学在当代社会的运用已经涉及到了各个领域上的运用,无论在什么领域上计算机图形学都发挥到了自己的作用;计算机图形学以其对图像的专业处理技术,对图形图像的加工运用,实现图形的立体转化,三维立体图形的旋转变形,由平面图到三维立体图的转化等等,都是命了计算机图形学强大的图像处理技术。
1.3定义
计算机图形学:
计算机图形学的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制,以及计算机动画、自然景物仿真、虚拟现实等。
OpenGl:
用于编写计算机图形学的程序的编译工具。
OpenGL是行业领域中最为广泛接纳的2D/3D图形API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。
OpenGL是独立于视窗操作系统或其它操作系统的,亦是网络透明的。
在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL™帮助程序员实现在PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。
OPENGL的功能及特点:
OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与VisualC++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL使用简便,效率高。
它具有七大功能:
旋转体:
一条平面曲线绕着它所在的平面内的一条定直线旋转所形成的曲面叫作旋转面;封闭的旋转面围成的几何体。
旋转矩阵:
在乘以一个向量的时候有改变向量的方向但不改变大小的效果的矩阵。
旋转矩阵不包括反演,它可以把右手坐标系改变成左手坐标系或反之。
所有旋转加上反演形成了正交矩阵的集合。
旋转变换:
简称旋转.欧氏几何中的一种重要变换.即在欧氏平面上(欧氏空间中),让每一点P绕一固定点(固定轴线)旋转一个定角,变成另一点P′,如此产生的变换称为平面上(空间中)的旋转变换.。
变换矩阵:
在线性代数中,线性变换能够用矩阵表示。
如果T是一个把R映射到R的线性变换,且x是一个具有n个元素的列向量,
,那么我们把m×n的矩阵A,称为T的变换矩阵。
3D坐标系:
三维笛卡儿坐标系是在二维笛卡儿坐标系的基础上根据右手定则增加第三维坐标(即Z轴)而形成的。
2D坐标系:
在同一个平面上互相垂直且有公共原点的两条数轴构成平面直角坐标系。
模型变换和视图变换,并练习使用OpenGL模型视图变换方法建模以及生成动画图形
矩阵变换组合生成其它模型的建模方法
1.4参考资料
a.计算机图形学,项志钢,清华大学出版社,第1版,2006年12月;
b.软件文档国家标准(GB8567-88);
c.openGL入门学习;
d.OpenGL编程手册;
e.VC++编程手册;
2实际开发结果
2.1作品
1 系统需求分析
1.纹理的绘制
2,材质的绘制
3.移动光源的绘制
4.动态时钟实现
3算法流程,实现效果
3.1纹理的绘制
设置纹理的流程:
创建纹理数据,书上说必须是2的整数倍,而且最小为64。
-->设置纹理数据,用glTexImage2D设置一个二维的纹理数据-->设置纹理映射的控制参数,参数主要包括滤波,重复和简约,函数用glTexParameterf()。
映射中和物体表面颜色的处理函数用glTexEnvf等。
-->启动纹理.glEnable(GL_TEXTURE_2D);--》绘制图形。
主要流程就是这样了。
主要函数:
voidglTexImage2D(GLenumtarget,GLintlevel,GLintcomponents,GLsizeiwidth,glsizeiheight,GLintborder,GLenumformat,GLenumtype,constGLvoid*pixels);Target就设置为GL_TEXTURE_2D,level表示纹理分级的级数,我们现在只有一种纹理,就设置为0参数level表示多级分辨率的纹理图像的级数,若只有一种分辨率,则level设为0。
components参数是哪些颜色分量进行调整和混合。
具体功能不知道,我用的是3,表示RGB。
Width,height参数是像素的宽和高,border是边框大小,format是颜色类型,我选择的是GL_RGB,type是数据的类型,就用GL_UNSIGNED_BYTE,pixels参数就是数据源了。
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);设置重复设置方式,这里是S方向的,也就是说如果纹理坐标超过了这个范围,就从头算的。
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);滤波方式,这里是线性滤波,也就是说算两个像素的插值时用线性的方法算。
这样可以更平滑一点。
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);就是映射中和物体表面颜色的处理方式,我选择的纹理颜色。
初始化就差不多了,还有很多其他的函数,也不完全清楚是做什么的。
在绘制图形的时候,就用glTexCoord2f(0,0);来确定纹理的坐标。
纹理效果图:
3.2光源的绘制
OpenGL有五种光,环境光,点光源,漫反射光,镜面反射光,聚光源。
OpenGL可以使用GL_LIGHT0-GL_LIGHT7七盏光。
每种关具体的参数请看书上的表:
pname参数名
缺省值
说明
GL_AMBIENT
(0.0,0.0,0.0,1.0)
RGBA模式下环境光
GL_DIFFUSE
(1.0,1.0,1.0,1.0)
RGBA模式下漫反射光
GL_SPECULAR
(1.0,1.0,1.0,1.0)
RGBA模式下镜面光
GL_POSITION
(0.0,0.0,1.0,0.0)
光源位置齐次坐标(x,y,z,w)
GL_SPOT_DIRECTION
(0.0,0.0,-1.0)
点光源聚光方向矢量(x,y,z)
GL_SPOT_EXPONENT
0.0
点光源聚光指数
GL_SPOT_CUTOFF
180.0
点光源聚光截止角
GL_CONSTANT_ATTENUATION
1.0
常数衰减因子
GL_LINER_ATTENUATION
0.0
线性衰减因子
GL_QUADRATIC_ATTENUATION
0.0
平方衰减因子
表10-1函数glLight*()参数pname说明
设置光源:
我们先对启用关照才能使用光源,启用光照的函数是:
glEnable(GL_LIGHTING);
然后我们可以使用:
glEnable(GL_LIGHT0);
来启用GL_LIGHT0这个光。
基本知识就学了这么多,然后是使用它的过程,
glEnable(GL_LIGHTING);
GLfloatlight_param[]={5.0,5.0,-1.0,1.0};
glLightfv(GL_LIGHT0,GL_POSITION,light_param);
glEnable(GL_LIGHT0);
放在程序的init函数里面,因为这是初始化的一部分。
他的意思就是启用光照,设置GL_LIGHT0的属性为点光源,他为位置是:
[5.0,5.0,-1.0,1.0]对应的其次坐标。
我也不知道他具体做什么,现在就当做是他的坐标吧。
这次加了一个键盘监听的处理函数。
可以响应键盘按键了,在这个程序中用1,2,3,4等键可以切换灯光。
按4键运行结果
按5键运行结果图
3.3材质的绘制
1.材质在光的照耀下才能发挥他的作用。
没有光,材质是不能显示的。
2.他和光的设置基本一样。
光设置的函数是glLightfv(XX,XXX,XX);材质的设置是voidglMaterialf(
GLenumface, //设置材质的面片,是前面,后面,还是双面
GLenumpname, //材质的类型,是环境光材质,漫反射,反射,高光,辐射光等
GLfloatparam //参数,跟光的参数一样,表示对应的值。
);
材质有环境光,漫反射,镜面反射,辐射,高光等几种设置。
里面的颜色参数代表他对该颜色的反射强度,1,最强,0表示完全吸收。
也就是说他会跟光做一个乘法。
得出来的光就颜色就是反射的我们眼睛的颜色。
例如:
[1.0, 0.0,1.0]的材质,本来呈现紫色,如果用[1.0,1.0,1.0]的光去照射就是紫色。
如果是[0.0,1.0,1.0]的光照射就是蓝色。
因为最后他们各分量相乘得到了[0,0,1]就呈现蓝色了。
运行效果图:
3.4动态时钟的绘制
采用蓝色填充时针,红色填充分针,蓝色填充时针,黄色填充秒针;采用GL_TRIANGLES绘制时针、分针、秒针;绘制时针和秒针的刻度时调用GL_POINTS,通过设置glPointSize()以区别时针和秒针的刻度。
动态效果图:
源代码附录:
1,纹理绘制
#pragmacomment(lib,"glaux.lib")
#include"gl\glaux.h"
#include
/**//*创建纹理*/
#defineImageWidth64
#defineImageHeight64
GLubyteImage[ImageWidth][ImageHeight][3];
GLfloatsgenparams[]={1.0,1.0,1.0};
voidmakeImage(void)
{
inti,j,r,g,b;
for(i=0;i { for(j=0;j { r=(i*j)%255; g=(4*i)%255; b=(4*j)%255; Image[i][j][0]=(GLubyte)r; Image[i][j][1]=(GLubyte)g; Image[i][j][2]=(GLubyte)b; } } } voiddisplay(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清楚颜色数据和深度数据(清屏) glColor3f(1.0,1.0,1.0); glLoadIdentity();//初始变换矩阵为单位矩阵 glColor3f(1,1,1);//设置颜色为白色 //绘制一个实心的茶壶 glPushMatrix(); glTranslatef(-4,2,0); glFrontFace(GL_CW); glutSolidTeapot (1); glFrontFace(GL_CCW); glPopMatrix(); //绘制一个实心的球体 glPushMatrix(); glTranslatef(-1,2,0); glutSolidSphere(1,32,32); glPopMatrix(); //绘制一个面 glPushMatrix(); glFrontFace(GL_CW); glBegin(GL_QUADS); glTexCoord2f(0,0);glVertex3f(0,0,0); glTexCoord2f(0,1);glVertex3f(0,3,0); glTexCoord2f(1,1);glVertex3f(3,3,0); glTexCoord2f(1,0);glVertex3f(3,0,0); glEnd(); glPopMatrix(); glutSwapBuffers();//交换缓冲区。 显示图形 } //初始化 voidinit(void) { glClearColor(0.5,0.5,0.5,0.0);//清理颜色,为黑色,(也可认为是背景颜色) makeImage();//创建纹理数据 glPixelStorei(GL_UNPACK_ALIGNMENT,1);//设置像素存储方式 glTexImage2D(GL_TEXTURE_2D,0,3,ImageWidth,ImageHeight, 0,GL_RGB,GL_UNSIGNED_BYTE,&Image[0][0][0]);//设置纹理信息 //设置s方向纹理重复,为重复设置。 glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); //是指t方向的纹理重复,超出1范围的像素纹理都为1处的纹理像素 //glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); //设置滤波方式为线性滤波 glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); //设置纹理和物体表面颜色处理方式 //只用纹理颜色,不关心物体表面颜色 glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL); //和物体表面颜色做与运算。 //glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); //做融合运算,我还不知道具体是什么东东。 //glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_BLEND); //glEnable(GL_BLEND); //自动生成坐标的方式。 glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); glTexGenfv(GL_S,GL_OBJECT_PLANE,sgenparams); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); glTexGenfv(GL_S,GL_OBJECT_PLANE,sgenparams); //如果有自动生成坐标,他就会自动生成,就算你有glTexCoord2f()。 //glEnable(GL_TEXTURE_GEN_T); //glEnable(GL_TEXTURE_GEN_S);//启动自动生成s方向自动生成纹理 glEnable(GL_TEXTURE_2D);//启动一维纹理 GLfloatligPos[]={0,0,5,0}; glLightfv(GL_LIGHT0,GL_POSITION,ligPos); //glEnable(GL_LIGHTING);//启动光照 glEnable(GL_LIGHT0);//启动第一个光源light0 //glEnable(GL_AUTO_NORMAL);//XXX不知道 //glEnable(GL_NORMALIZE);//XXx不知道 //不知道是什么,用了,球就不能正常显示了。 但是不用,茶壶就不能正常显示了。 //glFrontFace(GL_CW); glMaterialf(GL_FRONT,GL_SHININESS,64.0);//设置材质的高光为64 glEnable(GL_DEPTH_TEST);//启动深度裁剪 glDepthFunc(GL_LEQUAL);//裁剪方式为小于等于 glCullFace(GL_BACK);//裁剪方式为背面剔除 glEnable(GL_CULL_FACE);//启动面片剔除 } //当窗口大小改变时,会调用这个函数 voidreshape(GLsizeiw,GLsizeih) { //这里小说明一下: 矩阵模式是不同的,他们各自有一个矩阵。 投影相关 //只能用投影矩阵。 (只是目前情况下哦,等我学多了可能就知道为什么了。 ) glViewport(0,0,w,h);//设置视口 glMatrixMode(GL_PROJECTION);//设置矩阵模式为投影变换矩阵, glLoadIdentity();//变为单位矩阵 //gluPerspective(60,(GLfloat)w/h,0,1000);//设置投影矩阵 glOrtho(-6.0,6.0,-6.0*h/w,6.0*h/w,-10,10);//为了不变形,则要长和宽成比例 glMatrixMode(GL_MODELVIEW);//设置矩阵模式为视图矩阵(模型) glLoadIdentity();//变为单位矩阵 } intmain(intargc,char**argv) { glutInit(&argc,argv);//Opnegl初始化 glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);//设置显示模式为双缓冲,RGEBA glutInitWindowSize(800,600);//窗口大小 glutInitWindowPosition(100,100);//窗口位置 glutCreateWindow("hello");//创建一个标题为hello的窗口 init();//初始化资源,这里一定要在创建窗口以后,不然会无效。 glutDisplayFunc(display);//窗口大小改变时的回调 glutReshapeFunc(reshape);//绘制图形时的回调 glutMainLoop();//主循环。 return0; } 2.光照效果 #pragmacomment(lib,"glaux.lib") #include"gl\glaux.h" #include voiddisplay(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清楚颜色数据和深度数据(清屏) glColor3f(1.0,1.0,1.0); glLoadIdentity();//初始变换矩阵为单位矩阵 glPushMatrix();//压入变换矩阵那 glTranslated(0,0,-5);//平移0,0,-5向Z负方向平移5个单位 glutSolidSphere(1,30,30);//利用库函数绘制一个半径为1的球体。 glPopMatrix();//弹出矩阵。 glutSwapBuffers();//交换缓冲区。 显示图形 } //初始化 voidinit(void) { glClearColor(0.5,0.5,0.5,0.0);//清理颜
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 04 图形 图示 设计 资料