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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

3D游戏图形学实验一分解.docx

1、3D游戏图形学实验一分解3D游戏图形学实验指导书浙江理工大学二一五年 十月课程实验指导一、实验总体方案1. 教学目标与基本要求1)掌握本书所介绍的图形算法的原理。2)掌握通过具体的平台实现图形算法的方法,培养学生使用现代图形系统API的能力。3)通过实验培养具有开发一个基本图形软件包的能力。2. 实验平台实验主要结合OpenGL设计程序,实现各种课堂教学中讲过的图形算法。程序设计语言主要以C/C+为主,开发平台是Visual C+。3. 实验步骤1)预习教材与实验指导的实验具体方案部分相关的算法理论及原理。2)仿照教材与实验指导提供的算法,利用VC+ OpenGL进行实验。3)调试、编译、运行

2、程序,运行通过后,可考虑对程序进行修改或改进。二、实验预备知识OpenGL作为当前主流的图形API之一,在一些场合具有比DirectX更优越的特性。(1)与C语言紧密结合OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL很容易理解和学习。(2)强大的可移植性微软的Direct3D虽然也是十分优秀的图形API,但它只适用于Windows系统,而OpenGL不仅适用于Windows,还可以用于Unix/Linux等其他系统,它甚至在大型计算机、各种专业计算机上都有应用。并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。(3)高性能的图形渲染Open

3、GL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。总之,OpenGL是一个非常优秀的图形软件接口。下面对Windows下的OpenGL编程进行简单介绍。以下几点是学习OpenGL前的准备工作。1.选择一个编译环境现在Windows系统的主流编译环境有Visual C+, C+Builder,Dev-C+等,它们都支持OpenGL。 这里选择Visual C+作为学习OpenGL的实验环境。2.安装OpenGL工具包1)将OpenGL工具包dll文件夹中的*.dll文件放到操作系统目录下面的system32文件夹(其

4、路径一般为:C:WindowsSystem32)。2)打开VC,在VC中选择ToolsOptionsDirectories,然后在Show directories for中选择Include files,在下面添加OpenGL工具包中Include文件夹的路径,如下图所示:3)类似地,在Show directories for中选择library files,在下面添加OpenGL工具包中lib文件夹的路径,然后按OK。如下图所示:3.建立一个OpenGL工程打开VC后,在VC中选择FileNewProject,然后选择Win32 Console Application, 选择一个名字,然后按

5、“OK”。在弹出的对话框中点An empty project,选择Finish。然后向该工程添加一个源文件,选择一个名字。三、实验报告要求(1)有实验报告封面(2)给出简要的设计思路(原理)。(3)给出实现代码。(4)给出实验结果的屏幕截图。(5)实验的心得体会或建议。实验一 VC+6.0+OpenGL绘图环境及基本图形学算法实验项目性质:验证性实验所属课程名称:3D游戏图形学实验计划学时:3学时一实验目的1、熟悉OpenGL的主要功能;2、掌握OpenGL的绘图流程和原理;3、掌握OpenGL核心函数的使用;4、理解基本图形元素光栅的基本原理;5、掌握直线和圆的多种生成算法。二实验内容1、创

6、建一个OpenGL工程,利用OpenGL库函数进行简单图形设计与绘制;2、编程实现DDA算法和Bresenham算法生成直线;3、编程实现中点算法生成圆。三实验原理1、基本语法(C版本下的OpenGL语法)OpenGL基本函数均使用gl作为函数名的前缀,如glClearColor();实用函数则使用glu作为函数名的前缀,如gluSphere()。OpenGL基本常量的名字以GL_开头,如GL_LINE_LOOP;实用常量的名字以GLU_开头,如GLU_FILL。一些函数如glColor*()(定义颜色值),函数名后可以接不同的后缀以支持不同的数据类型和格式,如glColor3b()、glCo

7、lor3d()、glColor3f()和glColor3bv()等,这几个函数在功能上是相似的,只是适用于不同的数据类型和格式,其中3表示该函数带有三个参数,b、d、f分别表示参数的类型是字节型、双精度浮点型和单精度浮点型,v则表示这些参数是以向量形式出现的。OpenGL定义了一些特殊标识符,如GLfloat、GLvoid,它们其实就是C中的float和void。2、程序的基本结构OpenGL程序的基本结构可分为三个部分:第一部分是初始化,主要是设置一些OpenGL的状态开关,如颜色模式(RGBA或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验、裁剪等。这些状态一

8、般都用函数glEnable()、glDisable()来设置,“”表示特定的状态。第二部分设置观察坐标系下的取景模式和取景框位置大小,主要利用了三个函数:函数void glViewport(left, top, right, bottom) 设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个角上的坐标(以像素表示);函数void glOrtho(left, right, bottom, top, near, far) 设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体;函数void gluPerspective(fovy, aspect, zNear, zFar) 设置投影

9、方式为透视投影,其取景体积是一个截头锥体。第三部分是OpenGL的主要部分,是使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系、几何变换、光照处理等。3、OpenGL状态机制OpenGL的工作方式是一种状态机制,它可以进行各种状态或模式设置,这些状态或模式在重新改变它们之前一直有效。例如,当前颜色就是一个状态变量,在这个状态改变之前,绘制的每个像素都将使用该颜色,直到当前颜色被设置为其他颜色为止。OpenGL中大量地使用了这种状态机制,如颜色模式、投影模式、单双显示缓存区的设置、背景色的设置、光源的位置和特性等。许多状态变量可以通过glEnabel()、glDis

10、able()这两个函数来设置成有效或无效状态,如是否设置光照、是否进行深度测试等;在被设置成有效状态之后,绝大部分状态变量都有一个缺省值。四实验代码1、如预备知识所述,安装OpenGL工具包,创建一个OpenGL工程,在源文件上输入如下代码:#include #include /初始化OpenGL场景void myinit (void)glClearColor (0.0, 0.0, 0.0, 0.0); /将背景置成黑色glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,200.0,0.0,150.0); glShadeModel (GL_FLAT); /设置

11、明暗处理/用户的绘图过程void display(void) glClear (GL_COLOR_BUFFER_BIT);/清除缓存 glBegin(GL_LINES); /开始画一根白线 glColor3f (1.0f, 1.0f, 1.0f); /设置颜色为白色/设置第一根线的两个端点,请注意:OpenGL坐标系的原点是在屏幕左下角 glVertex2f(10.0f, 50.0f); glVertex2f(110.0f, 50.0f); glColor3f (1.0f, 0.0f, 0.0f); /设置颜色为红色/设置第二根线的两个端点 glVertex2f(110.0f, 50.0f);

12、 glVertex2f(110.0f, 150.0f); glEnd(); /画线结束 glFlush (); /绘图结束/主过程:/ 初始化Windows的窗口界面/ 并初始化OpenGL场景,绘图int main(int argc, char* argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); /初始化窗口的显示模式glutInitWindowSize(400,300); /设置窗口的尺寸glutInitWindowPosition(100,120); /设置窗口的位置glutCreatWindow(“

13、”); /创建一个名为“”的窗口glutDisplayFunc(Display); /设置当前窗口的显示回调函数myinit(); /完成窗口初始化glutMainLoop(); /启动主GLUT事件处理循环 return(0);glaux.libglu32.libglut32.libopengl32.lib注:glShadeModel选择平坦或光滑渐变模式。GL_SMOOTH为缺省值,为光滑渐变模式,GL_FLAT为平坦渐变模式。该程序是在一个黑色的窗口中画两条线,分别用白色和红色绘制。首先,需要包含头文件#include ,这是GLUT的头文件。本来OpenGL程序一般还要包含和,但GLU

14、T的头文件中已经自动将这两个文件包含了,不必再次包含。然后是main函数,其使用GLUT库实现窗口管理。我们关注的是display()函数,它是我们真正绘图的地方。函数glColor3f()以RGB方式设置颜色,格式为:glColor3f(red, green, blue),每种颜色值在(0.0, 1.0)之间。函数glVertex2f(x, y)设置二维顶点。函数glBegin(UINT State)、glEnd()是最基本的作图函数,下面对它作一介绍。如上所述,OpenGL是一个状态机,glBegin(UINT State)可以设定如下状态:GL_POINTS 画点GL_LINES 画线,

15、每两个顶点(Vertex)为一组GL_LINE_STRIP 画线,把若干个顶点顺次连成折线GL_LINE_LOOP 画线,把若干个顶点顺次连成封闭折线GL_TRIANGLES 画三角形,每三个顶点为一组GL_QUADS 画四边形,每四个顶点为一组GL_POLYGON 画多边形还有GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS_STRIP 等等。大家把每一种状态都试一试。另外,程序可以有多组glBegin()、glEnd()并列的形式,如:. . glBegin(GL_LINES); .glEnd();glBegin(GL_QUADS); . .glEn

16、d();. . 除了上述的基本图元外,函数glRectf(x1, y1, x2, y2)可以画一个矩形,但这个函数不能放在glBegin()和glEnd()之间,下面的两句程序是画一个蓝色的矩形。glColor3f (0.0f, 0.0f, 1.0f);glRectf(10.0f, 10.0f, 50.0f,50.0f);要求:利用OpenGL库函数绘制基本图形,输出绘制结果。void display(void) glClear(GL_COLOR_BUFFER_BIT); /清除缓存 glBegin(GL_LINES); /开始画一根白线 glColor3f(1.0f, 1.0f, 1.0f)

17、; /设置颜色为白色 /设置第一根线的两个端点,请注意:OpenGL坐标系的原点是在屏幕左下角 glVertex2f(10.0f, 50.0f); glVertex2f(110.0f, 50.0f); glColor3f(1.0f, 0.0f, 0.0f); /设置颜色为红色 /设置第二根线的两个端点 glVertex2f(110.0f, 50.0f); glVertex2f(110.0f, 150.0f); glEnd(); glColor3f(0.0f, 0.0f, 1.0f); glRectf(10.0f, 10.0f, 50.0f, 50.0f); /画线结束 glFlush(); /

18、绘图结束2、创建一个新的OpenGL工程,在源文件上输入如下代码:/DDA算法# includevoid LineDDA(int x0, int y0, int x1, int y1) int x, dy, dx, y; float m; dx=x1-x0; dy=y1-y0; m=dy/dx; y=y0; glColor3f(1.0f, 1.0f, 0.0f); glPointSize(1); for(x=x0;x=x1;x+) glBegin(GL_POINTS); glVertex2i(x,(int)(y+0.5); glEnd(); y+=m; void myDisplay(void)

19、 glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f,0.0f,0.0f); glRectf(25.0,25.0,75.0,75.0); glPointSize(5); glBegin(GL_POINTS); glColor3f(0.0f,1.0f,0.0f); glVertex2f(0.0f,0.0f); glEnd(); LineDDA(0,0,200,300); glBegin(GL_LINES); glColor3f(1.0f,0.0f,0.0f); glVertex2f(100.0f,0.0f); glColor3f(0.0f,1.0f,0.0f

20、); glVertex2f(180.0f,240.0f); glEnd(); glFlush();void Init() glClearColor(0.0,0.0,0.0,0.0); glShadeModel(GL_FLAT);void Reshape(int w, int h) glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,(GLdouble)w,0.0, (GLdouble)h);int main(int argc, char * ar

21、gv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE); glutInitWindowPosition(100,100); glutInitWindowSize(400,400); glutCreateWindow(Hello World!); Init(); glutDisplayFunc(myDisplay); glutReshapeFunc(Reshape); glutMainLoop(); return 0;介绍一下glutReshapeFunc()函数:首次打开窗口、移动窗口和改变窗口大小时,窗口系统都

22、将发送一个事件,以通知程序员。如果使用的是GLUT,通知将自动完成,并调用向glutReshapeFunc()注册的函数。该函数必须完成下列工作:a重新建立用作新渲染画布的矩形区域;b定义绘制物体时使用的坐标系。如:void Reshape(int w, int h)glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h); 在GLUT内部,将给该函数传递两个参数:窗口被移动或修改大小后的

23、宽度和高度,单位为像素。glViewport( )调整像素矩形,用于绘制整个窗口。接下来三个函数调整绘图坐标系,使左下角位置为(0,0),右上角为(w,h)。要求:1)根据所给的直线光栅化的示范源程序,在计算机上编译运行,输出正确结果(示范代码有错误,指出并改正);示范代码展示:void LineDDA(int x0, int y0, int x1, int y1) float x, dy, dx, y; float m; dx = x1 - x0; dy = y1 - y0; m = dy / dx; y = y0; glColor3f(1.0f, 1.0f, 0.0f); glPointS

24、ize(1); for (x = x0; x = x1; x+) glBegin(GL_POINTS); glVertex2i(x, (int)(y + 0.5); glEnd(); y += m; 2)根据示范程序采用的算法,以此为基础将其改造为Bresenham算法,写入实验报告;void Bresenhamline(int x0, int y0, int x1, int y1, int color) int x, y, dx, dy; float k, e; dx = x1 - x0, dy = y1 - y0, k = dy / dx; e = -0.5, x = x0, y = y0

25、; for (int i= 0; i = 0) y+, e = e - 1; 3)根据示范代码,将其改造为圆的光栅化算法,要求实现圆的中点算法,并利用八分法画出整圆。圆的光栅化算法:void setRound(GLint xc, GLint yc, GLint N) for (int i = 0; i x) if (d = 0) d += deltaE; deltaSE += 8; else d += deltaSE; deltaSE += 16; y-; deltaE += 8; x+; glBegin(GL_POINTS); glVertex2i(x, y); glVertex2i(x, -y); glVertex2i(-x, y); glVertex2i(-x, -y); glVertex2i(y, x); glVertex2i(y, -x); glVertex2i(-y, x); glVertex2i(-y, -x); glEnd();

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

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