计算机图形学试验优秀课件.ppt





《计算机图形学试验优秀课件.ppt》由会员分享,可在线阅读,更多相关《计算机图形学试验优秀课件.ppt(70页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、计算机图形学试验第1页,本讲稿共70页试验1:创建一个OpenGL窗口 v打开VC然后创建一个新工程,创建一个新的Win32程序(不是console控制台程序)第2页,本讲稿共70页v链接OpenGL库文件,Project-Settings,(工程设置)然后单击LINK标签:增加 OpenGL32.lib GLu32.lib 和 GLaux.lib 后单击OK按钮。第3页,本讲稿共70页v代码的前3行包括了我们使用的每个库文件的头文件。如下所示:#include /Windows的头文件#include /包含最新的gl.h,glu.h库#include /包含OpenGL实用库 第4页,本讲
2、稿共70页v完成程序的开发。如下图所示v参考程序第5页,本讲稿共70页试验2:绘制简单图形vglLoadIdentity(),重置当前的模型观察矩阵,将当前点移到了屏幕中心,X坐标轴从左至右Y坐标轴从下至上,Z坐标轴从里至外。OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。第6页,本讲稿共70页vglTranslatef(x,y,z)沿着 X,Y 和 Z 轴移动。glTranslatef(-1.5f,0.0f,-6.0f);/左移 1.5 单位,并移入屏幕 6.0 第7页,本讲稿共70页glBegin(GL_TRIANGLES);/绘制三角形 glVertex3f(0.0f,-1.0f,
3、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.0f第8页,本讲稿共70页glBegin(GL_QUADS);/绘制正方形 glVertex3f(-1.0f,1.0f,0.0f);/左上 glVertex3f(1.0f,1.0f,0.0f);/右上 glVertex3f(1.0
4、f,-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.0f第9页,本讲稿共70页v在在第一实验的基础上,在完成程序的 DrawGLScene()过程中增加代码:glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/清除屏幕及深度缓存 glLoadIdentity();/重置当前的模型观察矩阵 glTranslatef(-1.5f,0.0f,-6.0f);/
5、左移 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();第10页,本讲稿共70页glTranslatef(3.0f,0.0f,0.0f);/右移3单位 glBegin(GL_QUADS);/绘制正方形 glVertex3f(-1.0f,1.0f,0.0f);/左上 glVertex3f(1.0f,1.0f,0.0f);/右上 glV
6、ertex3f(1.0f,-1.0f,0.0f);/左下 glVertex3f(-1.0f,-1.0f,0.0f);/右下 glEnd();/正方形绘制结束画完三角形后,我们要移到右半部分来画正方形。否则两个图形会相互重叠第11页,本讲稿共70页v完成程序的开发。如下图所示v参考程序第12页,本讲稿共70页试验3 着色vglColor3f(r,g,b)。括号中的三个参数依次是红、绿、蓝三色分量。参数取值范围从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)蓝
7、色蓝色第13页,本讲稿共70页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.0f,-1.0f,0.0f);/左下左下 glColor3f(0.0f,0.0f,1.0f);/设置当前色为蓝色设置当前色为蓝色 glVertex3f(1.0f,-1.0f,0.0f);/右下右下 glE
8、nd();第14页,本讲稿共70页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.0f);/左下 glVertex3f(-1.0f,-1.0f,0.0f);/右下 glEnd();/正方形绘制结束 第15页,本讲稿共70页v完成程序的开发。如下图所示v参考程序第16页,本讲稿共70页试验4 旋转vglRota
9、tef(Angle,Xvector,Yvector,Zvector)负责让对象绕某个轴旋转。Xvector,Yvector 和 Zvector 三个参数则共同决定旋转轴的方向。比如(1,0,0)所描述的矢量经过X坐标轴的1个单位处并且方向向右。(-1,0,0)所描述的矢量经过X坐标轴的1个单位处,但方向向左。第17页,本讲稿共70页X轴您正在使用一台台锯。锯片中心的轴从左至右摆放(就像OpenGL中的X轴)。尖利的锯齿绕着X轴狂转,看起来要么向上转,要么向下转。取决于锯片开始转时的方向。这与我们在OpenGL中绕着X轴旋转什么的情形是一样的。Y轴假设您正处于一个巨大的龙卷风中心,龙卷风的中心从
10、地面指向天空(就像OpenGL中的Y轴)。垃圾和碎片围着Y轴从左向右或是从右向左狂转不止。这与我们在OpenGL中绕着Y轴旋转什么的情形是一样的。Z轴您从正前方看着一台风扇。风扇的中心正好朝着您(就像OpenGL中的Z轴)。风扇的叶片绕着Z轴顺时针或逆时针狂转。这与我们在OpenGL中绕着Z轴旋转什么的情形是一样的。第18页,本讲稿共70页v在实验3中画三角形的语句前添加 glRotatef(rtri,0.0f,1.0f,0.0f);/绕Y轴旋转三角形 在屏幕的左面画了一个彩色渐变三角形,并绕着Y轴从左向右旋转。第19页,本讲稿共70页v在实验3中画正方形的前面加上语句:glRotatef(r
11、quad,1.0f,0.0f,0.0f);/绕X轴旋转四边形 第20页,本讲稿共70页v完成程序,后效果如下:v参考程序第21页,本讲稿共70页试验5 三维图形v给三角形增加一个左侧面,一个右侧面,一个后侧面来生成一个金字塔(四棱锥)。计算好坐标,绘制其它侧面三角形的方法相同。注意所有的面三角形都是逆时针次序绘制的注意所有的面三角形都是逆时针次序绘制的 第22页,本讲稿共70页v给正方形增加左、右、上、下及背面生成一个立方体。计算好坐标,绘制其它侧面正方形的方法相同。所有的四边形都以逆时针次序绘制。第23页,本讲稿共70页v在3D空间创建对象的方法。必须将OpenGL屏幕想象成一张很大的画纸,
12、后面还带着许多透明的层。差不多就是个由大量的点组成的立方体。这些点从左至右、从上至下、从前到后的布满了这个立方体。如果您能想象的出在屏幕的深度方向,应该在设计新3D对象时没有任何问题。第24页,本讲稿共70页v程序完成的,效果如下:v参考程序第25页,本讲稿共70页试验6 纹理映射 v在第一实验代码开始处增加新代码:#include 第26页,本讲稿共70页v在 ReSizeGLScene()之前,增加了下面这一段代码。用来加载位图文件 AUX_RGBImageRec*LoadBMP(char*Filename)/载入位图图象 FILE*File=NULL;/文件句柄 if(!Filename
13、)/确保文件名已提供 return NULL;/如果没提供,返回 NULL File=fopen(Filename,“r”);/尝试打开文件 if(File)/文件存在么?fclose(File);/关闭句柄 return auxDIBImageLoad(Filename);/载入位图并返回指针 return NULL;/如果载入失败,返回 NULL 第27页,本讲稿共70页涉及到的函数vglGenTextures(1,&texture0)告诉OpenGL想生成一个纹理名字(如果想载入多个纹理,加大数字)。第28页,本讲稿共70页vglBindTexture(GL_TEXTURE_2D,tex
14、ture0)告诉OpenGL将纹理名字 texture0 绑定到纹理目标上。2D纹理只有高度(在 Y 轴上)和宽度(在 X 轴上)。主函数将纹理名字指派给纹理数据。第29页,本讲稿共70页vglTexImage2D(GL_TEXTURE_2D,0,3,TextureImage0-sizeX,TextureImage0-sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage0-data);告诉OpenGL此纹理是一个2D纹理(GL_TEXTURE_2D)。参数“0”代表图像的详细程度,通常就由它为零去了。参数三是数据的成分数。因为图像是由红色数据,绿色数据,蓝色
15、数据三种组分组成。TextureImage0-sizeX 是纹理的宽度。如果您知道宽度,您可以在这里填入,但计算机可以很容易的为您指出此值。TextureImage0-sizey 是纹理的高度。参数零是边框的值,一般就是“0”。GL_RGB 告诉OpenGL图像数据由红、绿、蓝三色数据组成。GL_UNSIGNED_BYTE 意味着组成图像的数据是无符号字节类型的。最后.TextureImage0-data 告诉OpenGL纹理数据的来源。此例中指向存放在 TextureImage0 记录中的数据。第30页,本讲稿共70页vglTexParameteri()告诉OpenGL在显示图像时,当它比放
16、大得原始的纹理大(GL_TEXTURE_MAG_FILTER)或缩小得比原始得纹理小(GL_TEXTURE_MIN_FILTER)时OpenGL采用的滤波方式。通常这两种情况下都采用 GL_LINEAR。第31页,本讲稿共70页vglBindTexture(GL_TEXTURE_2D,texture 所使用纹理对应的数字)选择要绑定的纹理。当您想改变纹理时,应该绑定新的纹理。有一点值得指出的是,您不能在 glBegin()和 glEnd()之间绑定纹理,必须在 glBegin()之前或 glEnd()之后绑定。第32页,本讲稿共70页v为了将纹理正确的映射到四边形上,您必须将纹理的右上角映射到
17、四边形的右上角,纹理的左上角映射到四边形的左上角,纹理的右下角映射到四边形的右下角,纹理的左下角映射到四边形的左下角。如果映射错误的话,图像显示时可能上下颠倒,侧向一边或者什么都不是。glTexCoord2f 的第一个参数是X坐标。0.0f 是纹理的左侧。0.5f 是纹理的中点,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坐标参数。
18、把 1.0f 改为 0.5f 将只显示纹理的左半部分,把 0.0f 改为 0.5f 将只显示纹理的右半部分。第33页,本讲稿共70页 int LoadGLTextures()/载入位图(调用上面的代码)并转换成纹理 int Status=FALSE;/状态指示器 AUX_RGBImageRec*TextureImage1;/创建纹理的存储空间 memset(TextureImage,0,sizeof(void*)*1);/将指针设为 NULL/载入位图,检查有无错误,如果位图没找到则退出 if(TextureImage0=LoadBMP(Data/NeHe.bmp)Status=TRUE;/将
19、 Status 设为 TRUE glGenTextures(1,&texture0);/创建纹理/使用来自位图数据生成 的典型纹理 glBindTexture(GL_TEXTURE_2D,texture0);/生成纹理 glTexImage2D(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);/线形滤波 glTe
20、xParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/线形滤波 第34页,本讲稿共70页if(TextureImage0)/纹理是否存在 if(TextureImage0-data)/纹理图像是否存在 free(TextureImage0-data);/释放纹理图像占用的内存 free(TextureImage0);/释放图像结构 第35页,本讲稿共70页vInitGL(GLvoid)改动为:int InitGL(GLvoid)/此处开始对OpenGL进行所有设置 if(!LoadGLTextures()/调用纹理载入子例程 r
21、eturn 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);/启用深度测试 glDepthFunc(GL_LEQUAL);/所作深度测试的类型 glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);/真正精细的透视修正 return TRUE;/初始
22、化 OK 第36页,本讲稿共70页vDrawGLScene()改动为:()改动为:添加语句添加语句glBindTexture(GL_TEXTURE_2D,texture0);/选择选择纹理纹理 在绘制正方形的在绘制正方形的 glBegin(GL_QUADS);中粘帖纹理,以前面中粘帖纹理,以前面 为例为例/前面前面 glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);/纹理和四纹理和四边形的左下边形的左下 glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);/纹理和纹理和四边形的右下四边形
23、的右下 glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,1.0f);/纹纹理和四边形的右上理和四边形的右上 glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);/纹理和四边形的左上纹理和四边形的左上 第37页,本讲稿共70页v程序完成后效果v参考程序第38页,本讲稿共70页试验7 光照效果v使用两种不同的光。v第一种称为环境光。环境光来自于四面八方。所有场景中的对象都处于环境光的照射中。v第二种类型的光源叫做漫射光。漫射光由特定的光源产生,并在您的场景中的对象表面上产生反射。处于漫射光直接照射下的任何
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 试验 优秀 课件

限制150内