计算机图形学试验汇总课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《计算机图形学试验汇总课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 试验 汇总 课件
- 资源描述:
-
1、计算机图形学试验刘赏OpenGL的基本语法相关库2vOpenGL核心库:glvOpenGL实用程序库: gluvOpenGL编程辅助库:auxvOpenGL实用程序工具包(OpenGL utility toolkit,GLUT):glutvWindows专用库:wglOpenGL的基本语法命名规则3vOpenGL函数都遵循一个命名约定,即采用以下格式:例如函数glColor3f(),gl表示这个函数来自库gl.h,color表示该函数用于颜色设定,3f表示这个函数采用了三个浮点数参数。OpenGL的基本语法数据类型4OpenGL数据类型内部表示法定义为C类型C字面值后缀GLbyte8位整数si
2、gned charBGLshort16位整数shortSGLint,GLsizei32位整数longLGLfloat,GLclampf32位浮点数floatFGLdouble,GLclampd64位浮点数doubleDGLubyte,GLboolean8位无符号整数 unsigned charUbGLshort16位无符号整数unsigned shortUsGLuint,GLenum,GLbitfield32位无符号整数unsigned longUi表表2.1 OpenGL的数据结构的数据结构OpenGL程序实例头文件包含5v利用OpenGL实现图形绘制,首先要引入OpenGL核心库以及其他需
3、要使用的库的头文件。vGLUT保证了gl.h和glu.h被正确包含。 #include #include OpenGL程序实例窗口管理6v初始化( glutInit )v创建窗口( glutCreateWindow)v设定窗口的显示模式( glutInitDisplayMode)v指定窗口的位置和大小( glutInitWindowPosition和glutInitWindowSize )v指定窗口的显示内容函数( glutDisplayFunc)v运行框架( glutMainLoop)OpenGL程序实例绘制图形7v指定窗口背景色( glClearColor)v颜色管理,使用RGB颜色模型。
4、一种颜色用红、绿、蓝三种颜色成分混合而成,每种颜色成分使用0.0到1.0之间的任意有效浮点数来表示颜色值。OpenGL程序实例绘制图形8混合色红色成分(R)绿色成分(G)蓝色成分(B)黑0.00.00.0红1.00.00.0绿0.01.00.0黄1.01.00.0蓝0.00.01.0紫1.00.01.0青0.01.01.0深灰0.250.250.25浅灰0.750.750.75棕0.600.400.12南瓜橙0.980.6250.12粉红0.980.040.70紫红0.600.400.70白1.01.01.0表表2.2 OpenGL的一些常用混合色的一些常用混合色OpenGL程序实例绘制图形9
5、v刷新窗口的缓冲区( glClear)v设定投影参数 glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0);v绘制图形 glRectf(50.0f, 100.0f, 150.0f, 50.0f);试验1:创建一个OpenGL窗口 v打开VC然后创建一个新工程 ,创建一个新的Win32程序(不是console控制台程序) v链接OpenGL库文件 ,Project- Settings,(工程设置)然后单击LINK标签:增加 OpenGL32.lib GLu32.lib 和 GLaux.lib 后单击OK按钮。 v代码的前3行包括
6、了我们使用的每个库文件的头文件。如下所示:#include / Windows的头文件 #include / 包含最新的gl.h,glu.h库 #include / 包含OpenGL实用库 v完成程序的开发。如下图所示v参考程序试验2:绘制简单图形vglLoadIdentity() ,重置当前的模型观察矩阵 ,将当前点移到了屏幕中心,X坐标轴从左至右Y坐标轴从下至上,Z坐标轴从里至外。OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。vglTranslatef(x, y, z)沿着 X, Y 和 Z 轴移动。 glTranslatef(-1.5f,0.0f,-6.0f); / 左移 1.5
7、 单位,并移入屏幕 6.0 glBegin(GL_TRIANGLES); / 绘制三角形 glVertex3f( 0.0f, 1.0f, 0.0f); / 上顶点 glVertex3f(-1.0f,-1.0f, 0.0f); / 左下顶点 glVertex3f( 1.0f,-1.0f, 0.0f); / 右下顶点 glEnd(); / 三角形绘制结束 0.0f, 1.0f,0.0f0.0f, 1.0f,0.0f-1.0f, -1.0f,0.0f-1.0f, -1.0f,0.0f1.0f, -1.0f,0.0f1.0f, -1.0f,0.0fglBegin(GL_QUADS); / 绘制正方形
8、glVertex3f(-1.0f, 1.0f, 0.0f); / 左上 glVertex3f( 1.0f, 1.0f, 0.0f); / 右上 glVertex3f( 1.0f,-1.0f, 0.0f); / 左下 glVertex3f(-1.0f,-1.0f, 0.0f); / 右下 glEnd(); / 正方形绘制结束 -1.0f, 1.0f, 0.0f1.0f, 1.0f, 0.0f1.0f, -1.0f, 0.0f-1.0f, -1.0f, 0.0fv在在第一实验的基础上,在完成程序的 DrawGLScene()过程中增加代码: glClear(GL_COLOR_BUFFER_BIT
9、| GL_DEPTH_BUFFER_BIT); / 清除屏幕及深度缓存 glLoadIdentity(); / 重置当前的模型观察矩阵 glTranslatef(-1.5f,0.0f,-6.0f); / 左移 1.5 单位,并移入屏幕 6.0 glBegin(GL_TRIANGLES); / 绘制三角形 glVertex3f( 0.0f, 1.0f, 0.0f); / 上顶点上顶点 glVertex3f(-1.0f,-1.0f, 0.0f); / 左下左下 glVertex3f( 1.0f,-1.0f, 0.0f); / 右下右下 glEnd(); glTranslatef(3.0f,0.0f
10、,0.0f); / 右移3单位 glBegin(GL_QUADS); / 绘制正方形 glVertex3f(-1.0f, 1.0f, 0.0f); / 左上 glVertex3f( 1.0f, 1.0f, 0.0f); / 右上 glVertex3f( 1.0f,-1.0f, 0.0f); / 左下 glVertex3f(-1.0f,-1.0f, 0.0f); / 右下 glEnd(); / 正方形绘制结束画完三角形后,我们要移到右半部分来画正方形。否则两个图形会相互重叠v完成程序的开发。如下图所示v参考程序试验3 着色vglColor3f(r,g,b)。括号中的三个参数依次是红、绿、蓝三色分
11、量。参数取值范围从0,0f到1.0f。glColor3f(1.0f,0.0f,0.0f)红色红色glColor3f(0.0f,1.0f,0.0f)绿色绿色glColor3f(0.0f,0.0f,1.0f)蓝色蓝色v修改实验2中,画三角形的代码为:glBegin(GL_TRIANGLES); / 绘制三角形 glColor3f(1.0f,0.0f,0.0f); / 设置当前色为红色设置当前色为红色 glVertex3f( 0.0f, 1.0f, 0.0f); / 上顶点上顶点 glColor3f(0.0f,1.0f,0.0f); / 设置当前色为绿色设置当前色为绿色 glVertex3f(-1.
12、0f,-1.0f, 0.0f); / 左下左下 glColor3f(0.0f,0.0f,1.0f); / 设置当前色为蓝色设置当前色为蓝色 glVertex3f( 1.0f,-1.0f, 0.0f); / 右下右下 glEnd();v修改实验2中,画正方形的代码为:glColor3f(0.5f,0.5f,1.0f); / 一次性将当前色设置为蓝色 glBegin(GL_QUADS); / 绘制正方形 glVertex3f(-1.0f, 1.0f, 0.0f); / 左上 glVertex3f( 1.0f, 1.0f, 0.0f); / 右上 glVertex3f( 1.0f,-1.0f, 0.
13、0f); / 左下 glVertex3f(-1.0f,-1.0f, 0.0f); / 右下 glEnd(); / 正方形绘制结束 v完成程序的开发。如下图所示v参考程序试验4 旋转vglRotatef(Angle,Xvector,Yvector,Zvector)负责让对象绕某个轴旋转。 Xvector , Yvector 和 Zvector 三个参数则共同决定旋转轴的方向。比如(1,0,0)所描述的矢量经过X坐标轴的1个单位处并且方向向右。(-1,0,0)所描述的矢量经过X坐标轴的1个单位处,但方向向左。X轴您正在使用一台台锯。锯片中心的轴从左至右摆放(就像OpenGL中的X轴)。尖利的锯齿绕
14、着X轴狂转,看起来要么向上转,要么向下转。取决于锯片开始转时的方向。这与我们在OpenGL中绕着X轴旋转什么的情形是一样的。Y轴假设您正处于一个巨大的龙卷风中心,龙卷风的中心从地面指向天空(就像OpenGL中的Y轴)。垃圾和碎片围着Y轴从左向右或是从右向左狂转不止。这与我们在OpenGL中绕着Y轴旋转什么的情形是一样的。Z轴您从正前方看着一台风扇。风扇的中心正好朝着您(就像OpenGL中的Z轴)。风扇的叶片绕着Z轴顺时针或逆时针狂转。这与我们在OpenGL中绕着Z轴旋转什么的情形是一样的。v在实验3中画三角形的语句前添加 glRotatef(rtri,0.0f,1.0f,0.0f); / 绕Y
15、轴旋转三角形 在屏幕的左面画了一个彩色渐变三角形,并绕着Y轴从左向右旋转。v在实验3中画正方形的前面加上语句:glRotatef(rquad,1.0f,0.0f,0.0f); / 绕X轴旋转四边形 v完成程序,后效果如下:v参考程序试验5 三维图形v给三角形增加一个左侧面,一个右侧面,一个后侧面来生成一个金字塔(四棱锥)。 计算好坐标,绘制其它侧面三角形的方法相同。注意所有的面三角形都是逆时针次序绘制的注意所有的面三角形都是逆时针次序绘制的 v给正方形增加左、右、上、下及背面生成一个立方体。 计算好坐标,绘制其它侧面正方形的方法相同。所有的四边形都以逆时针次序绘制。 v在3D空间创建对象的方法
16、。必须将OpenGL屏幕想象成一张很大的画纸,后面还带着许多透明的层。差不多就是个由大量的点组成的立方体。这些点从左至右、从上至下、从前到后的布满了这个立方体。如果您能想象的出在屏幕的深度方向,应该在设计新3D对象时没有任何问题。 v程序完成的,效果如下:v参考程序v微分的思想:画圆是由很多个小的三角形组成glBegin(GL_TRIANGLE_FAN); glVertex3f(0,0,0.0f ); for( i=0;i=360;i+=30) float p=(float)(i*3.14/180); glVertex3f(float)sin(p),(float)cos(p),0.0f );
17、glEnd();画圆柱试验6 纹理映射 v在第一实验代码开始处增加新代码: #include v在 ReSizeGLScene() 之前,增加了下面这一段代码。用来加载位图文件 AUX_RGBImageRec *LoadBMP(char *Filename) / 载入位图图象 FILE *File=NULL; / 文件句柄 if (!Filename) / 确保文件名已提供 return NULL; / 如果没提供,返回 NULL File=fopen(Filename,“r”); / 尝试打开文件 if (File) / 文件存在么? fclose(File); / 关闭句柄 return
18、auxDIBImageLoad(Filename); / 载入位图并返回指针 return NULL; / 如果载入失败,返回 NULL 涉及到的函数vglGenTextures(1, &texture0) 告诉OpenGL想生成一个纹理名字(如果想载入多个纹理,加大数字)。 vglBindTexture(GL_TEXTURE_2D, texture0) 告诉OpenGL将纹理名字 texture0 绑定到纹理目标上。2D纹理只有高度(在 Y 轴上)和宽度(在 X 轴上)。主函数将纹理名字指派给纹理数据。 vglBindTexture(GL_TEXTURE_2D, texture 所使用纹理对
19、应的数字 ) 选择要绑定的纹理。当您想改变纹理时,应该绑定新的纹理。有一点值得指出的是,您不能在 glBegin() 和 glEnd() 之间绑定纹理,必须在 glBegin() 之前或 glEnd() 之后绑定。vglTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage0-sizeX, TextureImage0-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0-data); 告诉OpenGL此纹理是一个2D纹理 ( GL_TEXTURE_2D )。参数“0”代表图像的详细程度,通常就由它为零去了。参数三是
20、数据的成分数。因为图像是由红色数据,绿色数据,蓝色数据三种组分组成。 TextureImage0-sizeX 是纹理的宽度。如果您知道宽度,您可以在这里填入,但计算机可以很容易的为您指出此值。 TextureImage0-sizey 是纹理的高度。参数零是边框的值,一般就是“0”。 GL_RGB 告诉OpenGL图像数据由红、绿、蓝三色数据组成。GL_UNSIGNED_BYTE 意味着组成图像的数据是无符号字节类型的。最后. TextureImage0-data 告诉OpenGL纹理数据的来源。此例中指向存放在 TextureImage0 记录中的数据。 vglTexParameteri( )
21、告诉OpenGL在显示图像时,当它比放大得原始的纹理大 ( GL_TEXTURE_MAG_FILTER )或缩小得比原始得纹理小( GL_TEXTURE_MIN_FILTER )时OpenGL采用的滤波方式。通常这两种情况下都采用 GL_LINEAR 。 v为了将纹理正确的映射到四边形上,您必须将纹理的右上角映射到四边形的右上角,纹理的左上角映射到四边形的左上角,纹理的右下角映射到四边形的右下角,纹理的左下角映射到四边形的左下角。如果映射错误的话,图像显示时可能上下颠倒,侧向一边或者什么都不是。 glTexCoord2f 的第一个参数是X坐标。 0.0f 是纹理的左侧。 0.5f 是纹理的中点
22、, 1.0f 是纹理的右侧。 glTexCoord2f 的第二个参数是Y坐标。 0.0f 是纹理的底部。 0.5f 是纹理的中点, 1.0f 是纹理的顶部。v所以纹理的左上坐标是 X:0.0f,Y:1.0f ,四边形的左上顶点是 X: -1.0f,Y:1.0f 。其余三点依此类推。v测试glTexCoord2f 的X,Y坐标参数。把 1.0f 改为 0.5f 将只显示纹理的左半部分,把 0.0f 改为 0.5f 将只显示纹理的右半部分。 int LoadGLTextures() / 载入位图(调用上面的代码)并转换成纹理 int Status=FALSE; / 状态指示器 AUX_RGBIma
23、geRec *TextureImage1; / 创建纹理的存储空间 memset(TextureImage,0,sizeof(void *)*1); / 将指针设为 NULL / 载入位图,检查有无错误,如果位图没找到则退出 if (TextureImage0=LoadBMP(Data/NeHe.bmp) Status=TRUE; / 将 Status 设为 TRUE glGenTextures(1, &texture0); / 创建纹理 / 使用来自位图数据生成 的典型纹理 glBindTexture(GL_TEXTURE_2D, texture0); / 生成纹理 glTexImage2D
24、(GL_TEXTURE_2D, 0, 3, TextureImage0-sizeX, TextureImage0-sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0-data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); / 线形滤波 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); / 线形滤波 if (TextureImage0) / 纹理是否存在 if (TextureImage
25、0-data) / 纹理图像是否存在 free(TextureImage0-data); / 释放纹理图像占用的内存 free(TextureImage0); / 释放图像结构 vInitGL(GLvoid) 改动为:int InitGL(GLvoid) / 此处开始对OpenGL进行所有设置 if (!LoadGLTextures() / 调用纹理载入子例程 return FALSE; / 如果未能载入,返回FALSE glEnable(GL_TEXTURE_2D); / 启用纹理映射 glShadeModel(GL_SMOOTH); / 启用阴影平滑 glClearColor(0.0f,
展开阅读全文