ImageVerifierCode 换一换
格式:DOCX , 页数:48 ,大小:241.42KB ,
资源ID:25452423      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25452423.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(计算机图形学实验指导书.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

计算机图形学实验指导书.docx

1、计算机图形学实验指导书巢湖学院计算机与信息工程学院计算机图形学基础实验指导书主编教师:卜华龙【上机学时】:18学时【上机学分】:0.5学分【上机项目数】:6【教学对象】:计算机科学与技术、计算机科学与技术(专升本)【教学目标】:通过系列实验,让学生熟练掌握常见图形生成操作如点、直线、多边形等以及图形变换的相关知识。【教学内容】:依据计算机图形学教学内容的基本要求,结合我院学分制各专业方向特点和大纲要求,制定本上机实验项目。项目数为8,前6个项目都为必做项目。序号内容学时1学会c+环境下的opengl编程环境32空间点的绘制33空间直线的绘制34多边形的绘制35平面多面体的绘制36图形变换37颜

2、色绘制(选做)08光照效果(选做)0合计16一、 学会C/C+环境下的opengl编程环境1.C+配置1. 开发环境的配置1) 将“glut32.dll”等dll文件文件拷贝到操作系统对应的目录system32中。2) 将“glut32.h”等.h 文件拷贝到VC+6.0的Include文件夹中。3) 将“glut32.lib”等.lib文件拷贝到VC+6.0的lib文件夹中。2. 用 glut编C程程序的方法新建一个win32 console project,然后新建下面的 tut1.cpp: #include void display() int main(int argc, char*

3、argv) glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGBA); /设置显示模式:单缓冲区, RGBA颜色模式 glutInitWindowSize (200, 200); /设置窗口宽度、高度 glutCreateWindow (argv0); /弹出窗口 glutDisplayFunc (display); /设置窗口刷新的回调函数 glutMainLoop(); /开始主循环 return 0; display()是窗口刷新的回调函数。每当被遮住的窗口再次暴露出来时,系统就调用此函数刷新窗口(即在窗口里

4、作图)。因为我们的 display() 什么也不干,因此你看到窗口里是它后面的背景。我们先画个正方形。别的不变,只需要改 display() void display() glClearColor(1,1,1,1); /设置刷新背景色 glClear(GL_COLOR_BUFFER_BIT); /刷新背景 glBegin(GL_LINE_LOOP); glColor3f(1,0,0); /设置当前颜色 glVertex3f(-0.9,-0.9,0); glVertex3f(0.9,-0.9,0); glVertex3f(0.9,0.9,0); glVertex3f(-0.9,0.9,0); g

5、lEnd(); glFlush(); /更新窗口 2.C语言配置程序GLRect 中包含了4 个头文件,其中定义了程序所用的函数原形。此外,OpenGL需要下列*.lib 包含在你的工程中:opengl.lib,glu.lib,glut32.lib;另外在运行程序路径下或win98system(winNTsystem32)下需要一些动态连接库:opengl32.dll,glu32.dll,glut32.dll。实验上述内容,写出实验报告。二、空间点的绘制最简单的计算机图形就是在屏幕上某个位置绘制一个点,并用特定的颜色绘制出来。请看下面的代码:glBegin(GL_POINTS);glVerte

6、x3f(0.0f,0.0f,0.0f);glVertex3f(10.0f,10.0f,10.0f);glEnd();计算机中的图元只是把一组顶点或顶点列表解释为屏幕上绘制的某些形状,而顶点是用函数glVertex3f 来定义,该函数中的参数指明定义点的x、y 和z 坐标。OpenGL 中定义的定点到放在函数glBegin 和glEnd 之间,由函数glBegin 的参数指定绘制图元的类型。GL_POINTS 表示这个序列中绘制的是单个的点。注意一个glBegin/glEnd 序列中可以包括任意多个相同类型的图元。表2-1 列出了glBegin 可支持的OpenGL 图元。glVertex 函数

7、用于指定顶点,它可以有2,3,4 个参数。带2 个参数时指定的是空间点的x,y 坐标,其z 坐标为默认值0,在绘制平面图形时常常使用这类函数;带3 个参数时14指定的是空间点的x,y 和z 坐标;带4 个参数时,除了定义空间点的x,y,z 坐标,还有一个不为0 的w 坐标,这样,点的坐标(x,y,z,w)实际上构成了一个齐次坐标。在OpenGL中,我们仍然使用规范化齐次坐标以保证点的齐次坐标与三维坐标的一一对应关系,最后指定的空间点的坐标为(x/w,y/w,z/w,1),w 成了坐标值的一个缩放因子。在OpenGL 中绘制一个点时,点大小的默认值是一个象素。可以用函数glPointSize 修

8、改这个值:void glPointSize(GLfloat size);这个函数采用一个参数来指定画点时以象素为单位的近似直径。但是不是任意大小点都支持,通常使用下面的代码来获取点大小的范围和它们之间最小的中间值:GLfloat sizes2; /保存绘制点的尺寸范围GLfloat step; /保存绘制点尺寸的步长glGetFloatv(GL_POINT_SIZE_RANGE,sizes);glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);在数组seize 中包含两个元素,分别保存了glPointSize 的最小有效值和最大有效值,而变量step 将保

9、存点大小之间允许的最小增量。指定范围之外的大小不会被解释为错误,而是使用最接近指定值的可支持的最大或最小尺寸。在OpenGL 程序中,我们常可以利用离散的点来拟合一些常见的曲线,如圆,螺旋线等等。新建一个 win32 console project,然后加入 下面的 tut2.cpp: #include void display() int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGBA); /设置显示模式:单缓冲区, RGBA颜色模式 glutInit

10、WindowSize (200, 200); /设置窗口宽度、高度 glutCreateWindow (argv0); /弹出窗口 glutDisplayFunc (display); /设置窗口刷新的回调函数 glutMainLoop(); /开始主循环 return 0; display()是窗口刷新的回调函数。每当被遮住的窗口再次暴露出来时,系统就调用此函数刷新窗口(即在窗口里作图)。因为我们的 display() 什么也不干,因此你看到窗口里是它后面的背景。我们先画单个点。别的不变,只需要改 display() 。/PointAndLine.c#include #include #in

11、cludevoid RenderScene(void)glClear(GL_COLOR_BUFFER_BIT); /用当前背景色填充窗口glColor3f(0.0f, 0.0f, 0.0f); /设置当前的绘图绘图RGB 颜色GLfloat sizes2; /保存绘制点的尺寸范围GLfloat step; /保存绘制点尺寸的步长GLfloat curSize; /当前绘制的点的大小glGetFloatv(GL_POINT_SIZE_RANGE,sizes); /获得点的尺寸范围glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step); /获得点尺寸的步长/绘制不

12、同大小的点curSize=sizes0;for (int i=0;i25;i+)glPointSize(curSize); /设置点的大小glBegin(GL_POINTS);glVertex3f(25.0+i*8,200.0f,0.0f);glEnd();curSize +=step*2;glDisable(GL_LINE_STIPPLE);glFlush();/刷新OpenGL 命令队列 void ChangeSize(GLsizei w, GLsizei h)if(h = 0) h = 1;glViewport(0, 0, w, h); /设置视区尺寸/ 重置坐标系统glMatrixMo

13、de(GL_PROJECTION);glLoadIdentity();/ 建立修剪空间的范围if (w = h)glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0f, -1.0f);elseglOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0f, -1.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();void SetupRC(void)glClearColor(1.0f, 1.0f, 1.0f, 1.0f); / 设置窗口的背景色void main(void)glutIni

14、tDisplayMode(GLUT_SINGLE | GLUT_RGB);glutCreateWindow(点与线);glutDisplayFunc(RenderScene); / 设置当前窗口的显示回调函数glutReshapeFunc(ChangeSize); / 为当前窗口设置窗口再整形回调函数SetupRC();glutMainLoop(); /启动主GLUT 事件处理循环如果要修改点的大小,颜色等,只要在display()里做相应修改就可以了。实验上述内容,要求写出实验报告。三、空间直线的绘制使用模式 GL_LINES 可以在两点之间画线,如下面的代码在两点(0,0,0)和(10,1

15、0,10)之间画一条直线:glBegin(GL_LINES);glVertex3f(0.0f,0.0f,0.0f);glVertex3f(10.0f,10.0f,10.0f);glEnd();注意,在glBegin/glEnd 序列中两个顶点指定了一个图元(直线),如果序列中指定的点为奇数个,那么最后一个顶点将被忽略。有时我们需要在一系列的顶点之间绘制连续直线,此时需要用到GL_LINE_STRIP 或GL_LINE_LOOP 模式。GL_LINE_STRIP 模式可以根据指定的一系列顶点,从一个顶点到另一个顶点用连续的线段画线。glBegin(GL_LINE_STRIP);glVertex3

16、f(0.0f,0.0f,0.0f);glVertex3f(10.0f,10.0f,0.0f);glVertex3f(20.0f,5.0f,0.0f);glEnd();上面这段代码实际上在xy 平面内绘制了两条直线(0,0,0)到(10,0,0)和(0,10,0)到(20,5,0)。特别的,当沿着某条曲线指定一系列靠的很近的点,使用GL_LINE_STRIP模式可以绘制一条曲线。GL_LINE_LOOP 模式与GL_LINE_STRIP 模式类似,只是会在指定的最后一个顶点与第一个顶点之间画最后一条线。直线的属性包括线宽和线型。在OpenGL 中可用glLineWidth 指定线宽:void g

17、lLineWidth(GLfloat width) 与点的大小类似,glLineWidth 函数采用一个参数来指定要画的线以象素计的近似宽度,可以用下面的代码来获取线宽范围和它们之间的最小间隔:GLfloat sizes2; /保存线宽的尺寸范围GLfloat step; /保存线宽尺寸的最小间隔glGetFloarv(GL_LINE_WIDTH_RANGE,sizes);glGetFloatv(GL_LINE_WIDTH_GRANULARITY,&step);数组seize 中保存了glLineWidth 的最小有效值和最大有效值,而变量step 将保存线宽之间允许的最小增量。OpenGL

18、规范只要求支持一种线宽:1.0。Microsoft 的OpenGL 实现允许线宽从0.5 到10.0,最小增量为0.125。除了修改线宽,可以用虚线或短划线模式创建直线,为此需要先调用:glEnable(GL_LINE_STIPPLE);然后,函数glLineStipple 将建立用于画线的模式:glLineStipple(GLint factor,GLushort pattern);其中,pattern 是一个16 位值,他指定了画线时所用的模式。每一位代表线段的一部分是开还是关。默认情况下,每一位对应一个象素,但factor 参数充当倍数可以增加模式的宽度。例如,将factor 设为2 会

19、使模式中的每一位代表一行中2 个象素的开或关。另外,在应用模式时,pattern 是逆向使用的,即模式的最低有效位最先作用于指定线段。图2.1 说明了模式0X00FF 是如何应用到线段上的。 在下面的程序演示了点的大小,线型以及线宽等等,输出图形如图2.2 所示。程序清单3:点的大小,直线线型和线宽的示例/PointAndLine.c#include #include #includevoid RenderScene(void)glClear(GL_COLOR_BUFFER_BIT); /用当前背景色填充窗口glColor3f(0.0f, 0.0f, 0.0f); /设置当前的绘图绘图RGB

20、颜色GLfloat sizes2; /保存绘制点的尺寸范围GLfloat step; /保存绘制点尺寸的步长GLfloat curSize; /当前绘制的点的大小glGetFloatv(GL_POINT_SIZE_RANGE,sizes); /获得点的尺寸范围glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step); /获得点尺寸的步长/绘制不同大小的点curSize=sizes0;for (int i=0;i25;i+)glPointSize(curSize); /设置点的大小glBegin(GL_POINTS);glVertex3f(25.0+i*8,200

21、.0f,0.0f);glEnd();curSize +=step*2;/绘制一条宽度为5 的直线glLineWidth(5); /设置线宽glBegin(GL_LINES);glVertex3f(25.0f,160.0f,0.0f);glVertex3f(225.0f,160.0f,0.0f);glEnd();/绘制一条虚线glEnable(GL_LINE_STIPPLE);glLineStipple(1,0x00FF); /设置点划线模式glBegin(GL_LINES);glVertex3f(25.0f,120.0f,0.0f);glVertex3f(225.0f,120.0f,0.0f)

22、;glEnd();/绘制一条宽度为3 的点划线glLineWidth(3);glLineStipple(1,0xFF0C);glBegin(GL_LINES);glVertex3f(25.0f,80.0f,0.0f);glVertex3f(225.0f,80.0f,0.0f);glEnd();/增加重复因子绘制的点划线glLineStipple(4,0xFF0C);glBegin(GL_LINES);glVertex3f(25.0f,40.0f,0.0f);glVertex3f(225.0f,40.0f,0.0f);glEnd();glDisable(GL_LINE_STIPPLE);glFl

23、ush();/刷新OpenGL 命令队列 void ChangeSize(GLsizei w, GLsizei h)if(h = 0) h = 1;glViewport(0, 0, w, h); /设置视区尺寸/ 重置坐标系统glMatrixMode(GL_PROJECTION);glLoadIdentity();/ 建立修剪空间的范围if (w = h)glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0f, -1.0f);elseglOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0f, -1.0f);glMatrixM

24、ode(GL_MODELVIEW);glLoadIdentity();void SetupRC(void)glClearColor(1.0f, 1.0f, 1.0f, 1.0f); / 设置窗口的背景色void main(void)glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutCreateWindow(点与线);glutDisplayFunc(RenderScene); / 设置当前窗口的显示回调函数glutReshapeFunc(ChangeSize); / 为当前窗口设置窗口再整形回调函数SetupRC();glutMainLoop();

25、/启动主GLUT 事件处理循环 四、多边形的绘制1. 三角形的绘制在OpenGL 中,面是由多边形构成的。三角形可能是最简单的多边形,它有三条边。可以使用GL_TRIANGLES 模式通过把三个顶点连接到一起而绘出三角形。下面的代码绘制了一个三角形:glBegin(GL_TRIANGLES);glVertex2f(0.0,0.0);glVertex2f(15.0,15.0);glVertex2f(30.0,0.0);glEnd();注意,这里三角形将被用当前选定的颜色填充,如果尚未指定绘图的颜色,结果将是不确定的。使用GL_TRIANGLE_STRIP 模式可以绘制几个相连的三角形,系统根据前

26、三个顶点绘制第一个多边形,以后每指定一个顶点,就与构成上一个三角形的后两个顶点绘制新的一个三角形。使用GL_TRIANGLE_FAN 模式可以绘制一组相连的三角形,这些三角形绕着一个中心点成扇形排列。第一个顶点构成扇形的中心,用前三个顶点绘制出最初的三角形之后,随后的所有顶点都和扇形中心以及紧跟在它前面的顶点构成下一个三角形,此时是以顺时针方向穿过顶点。这两种模式的推进如图2.3 和图2.4 所示。2. 绕法在绘制三角形的过程中,三个顶点将三角形封闭的过程是有序的,即三角形的构成路径具有方向性,我们把指定顶点时顺序和方向的组合称为“绕法”。比如上面的例子中画出的三角形的绕法就是顺时针的,若把后

27、两个顶点的位置互换,就得到了逆时针绕法。绕法是任何多边形图元的一个重要特性。一般默认情况下,OpenGL 认为逆时针绕法的多边形是正对着的,这一特性对于希望给多边形的正面和背面赋予不同的物理特性十分有用。如果要反转OpenGL 的默认行为,可以调用函数:glFrontFace(GL_CW);CL_CW 告诉OpenGL 应该把顺时针缠绕的多边形为正对着的。为了改回把逆时针绕法视为正面,可以使用CL_CCW。3. 明暗处理在绘制多边形时,我们常常要指定绘制的颜色,而在OpenGL 中,颜色实际上是对各个顶点而不是对各个多边形指定的。多边形的轮廓或者内部用单一的颜色或许多不同的颜色来填充的处理方式

28、称为明暗处理。在OpenGL 中,用单一颜色处理的称为平面明暗处理(FlatShading),用许多不同颜色处理的称为光滑明暗处理(Smooth Shading),也称为Gourand 暗处理(Gourand Shading)。设置明暗处理模式的函数为:void glShadeModel(GLenum mode);其中参数mode 的取值为GL_FLAT 或GL_SMOOTH,分别表示平面明暗处理和光滑明暗处理。应用平面明暗处理模式时,多边形内每个点的法向一致,且颜色也一致,OpenGL用指定多边形最后一个顶点时的当前颜色作为填充多边形的纯色;应用光滑明暗处理模式时,多边形所有点的法向是由内插生成的,具有一定的连续性,因此每个点的颜色也相应内插,故呈现不同色。这种模式下,插值方法采用的是双线性插值法Gouraud 明暗处理通常算法为:先用多边形顶点的光强线性插值出当前扫描线与多边形边交点处的光强,然后再用交点的光强线插值处扫描线位于多边形内区段上每一象素处的光强值。图2.5 中显示出一条扫描线与多边形相交,交线的端点是A 点和B 点,P 点是扫描线上位于多边形内的任一点,多边形三个顶点的光强分别为I1、I2 和I3。取A 点的光强Ia 为I1 和I2 的线性插值,B 点的光强Ib 为I1 和I3

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1