图形学实验指导书2009(1)_第1页
图形学实验指导书2009(1)_第2页
图形学实验指导书2009(1)_第3页
图形学实验指导书2009(1)_第4页
图形学实验指导书2009(1)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、OpenGL 简介一、 OpenGL 概述OpenGL 是图形硬件的一个软件接口( GL 代表图形库, Graphics Library )。使用 OpenGL,可以对计算机图形技术进行控制,产生逼真的现实世界的图象或虚拟的现实世界 所没有的图象。 OpenGL 包括了大约 250 个不同的函数,程序员可以用这些函数指定物体和 操作, 创建交互性三维应用程序, 而不必为许多应用程序中通用的标准函数编写代码, 同时 使应用程序避免接触过多的硬件细节。OpenGL 主要关注图象的渲染,即根据几何图形对象的规范及其属性,使用虚拟的照相 机和光源来构成一幅图象。Open GL是 跨平台的一种应用程序接

2、口( AppI ication Programmer's Interface, API ),因此不包含输入和视窗操作。对于视窗管理,我们选用 OpenGL 应用工具包 GLUT ( OpenGL Utility Toollkit )。二、 OpenGL 的组成在微机版本中, OpenGL 主要由三个函数库组成,它们是核心库、实用函数库和编程辅 助库。OpenGL 的核心库包含了 OpenGL 最基本的命令函数。在这个库中,提供了一百多个函 数,这些函数的函数名都以“ gl ”为前缀。这些函数用来建立各种各样的几何模型、进行坐 标变换、产生光照效果、进行纹理映射、产生雾化效果等几乎所有的

3、二维和三维图形操作。 这一百多个基本函数由于使用各自不同的参数而导致格式的变形, 派生出数百个命令。 而且, 对于不同的硬件和软件平台, 这些函数的使用是完全相同的, 这个特性决定了 OpenGL 的可 移植性。OpenGL 的核心库提供了创建基本几何图元的函数, 通过基本几何图元的各种组合创建 其它几何模型, 几何模型也可称为物体。 为了减少编程负担, OpenGL 实用函数库提供了 40 多个创建常用的几何对象函数,立方体、二次曲面等。OpenGL实用库中函数的函数名以 “glu” 为前缀,所有函数都是利用核心库中函数编写,使用方法和核心库中函数的使用方法相同。由于 OpenGL 是一个图

4、形标准,独立于任何操作系统和窗口系统, OpenGL 中没有提供 窗口管理和消息事件响应的函数, 也没有从鼠标和键盘读取事件的功能。 因此, 在不同的操 作系统都设计 OpenGL 了额外的编程辅助库 提供一些基本的窗口管理函数、 事件处理函数, 例如定义窗口的大小、 处理键盘和鼠标事件等。 Windows 操作系统下的编程辅助库中函数的 函数名以“ aux”为前缀。这些编程辅助库是依赖于具体操作系统的,为了支持跨平台,SGI公司的Mark Kilgard编写了 GLUT , GLUT中函数的函数名以“glut"为前缀。现在,在Windows 操作系统 GLUT 已经取代了 AUX

5、库。三、 OpenGL 的功能1、根据几何图元创建形状,建立物体的几何模型。OpenGL 中包括两种图元:几何图元和图象图元。几何图元包括:点、直线段、三角形、四边形和多边形,这些图元通过顶点 指定。图象图元,例如位图。2、在三维空间中排列物体,并选择观察复合场景的有利视角;3、计算所有物体的颜色。颜色可以由应用程序明确指定,也可以根据特定的光照条件 来确定,或通过把纹理表面贴到物体表面得到。4、把物体的数学描述以及和它们相关的颜色信息转换为屏幕上的像素。四、基于 C 语言和 OpenGL 的图形程序开发基础.疋1、 基于C语言和OpenGL的图形程序结构:根据需要在C语言程序中嵌入 Open

6、GL命令。2、程序中一般包括以下三个部分:(1)应用程序初始化;(2)生成并绘制图象;(3)main函数中调用(1)和(2)中的函数。3、OpenGL命令格式和数据类型OpenGL命令就是OpenGL中的函数调用,命令名称就是函数名,命令中的参数就是函 数调用所需的参数。OpenGL函数命名约定:函数名饿头几个字母说蜜柑内该函数来自哪个库,后面部分包 含一个根命令,一般是一个英文单词(第一个字母必须大写),表示该函数的功能,后缀中的数字和字母分别表示参数的个数和类型。例如:命令 glColor3f(1.0,1.0,1.0);前缀“gl”表示该函数属于核心库, 令有三个参数,参数类型为浮点数,

7、是C语言格式中所要求的。如果 指向矢量或数组的指针参数,例如:GLfloat color =1.0,1.0,1.0;glColor3fv(color);“Color ”表示该命令的功能为着色,“ 3f”表示该命(1.0,1.0,1.0)是函数调用时的具体参数,最后的分号“;”OpenGL命令的后缀有一个字母“ v”,表示该命令有一个OpenGL命令中后缀表示的数据类型对应的OpenGL类型对应的C语言类型b8位整数GLbyteSigned chars16位整数GLshortshorti32位整数GLint, GLsizeilongf32位浮点数GLfloat,GLclampffloatd64位

8、浮点数GLdouble, GLclampddoubleub8位无符号整数GLubyte, GLbooleanun sig ned charus16位无符号整数GLshortun sig ned shortui32位无符号整数GLui nt, GLe num, GLbitfieldun sig ned long说明一个浮点型的数组color, GLfloat是数据类型/数组color作为参数3个或4个,参数类型见下表:OpenGL命令后缀及对应的数据类型4、OpenGL中定义的符号常量OpenGL中的符号常量,以大写字母GL_或GL_开头,表示属于哪个库,所有字母都大 写,单词之间用下划线连接。

9、例如,5、头文件 gl.h、glu.h 和 glut.hOpenGL核心库的函数、类型和宏GL_COLOR_BUFFER_BIT ,表示颜色缓冲区。(符号常量)的原型包括在头文件gl.h中,实用函数OpenGL命令中的参数个数可能使个、库的原型包括在头文件glu.h中,应用工具包 GLUT的原形4包括在头文件glut.h中。OpenGL是一个标准的程序库,Win dows系统运行 OpenGL程序,需要在 windowssystem32文件夹包含动态连接库opengl32.dll和glu32.dll,使用 GLUT的用户还需要包含动态连接库glut32.dll。编译OpenGL程序需要有头文件

10、gl.h和glu.h,使用GLUT的用户需要头文件 glut.h,因为glut.h包括了 gl.h和glu.h,所以仅用glut.h即可;还需要库文 件 opengl32.lib、glu32.lib 和 glut32.lib。五.OpenGI命令 命令: glClearColor 函数原型: void gICIearCoIor(GLcIampf red,GLcIampf green,GLcIampf bIue,GLcIampf aIph); 功能:将缓存的当前清楚颜色设置为给定的颜色值(red,green,bIue,aIpha);参数:(red,green,blue指定RGB颜色空间的一个颜色

11、值,alpha指定透明度。 命令: gICIear 函数原型: void glClear(GLbitfield mask);功能:用当前的清楚值清楚 1 种或多种缓冲区。参数:mask指定需要清除的缓冲区。缓冲区对应的mask值见表1.1。如果需要同时清除多种缓冲区,则将表中的多个值通过逻辑或(|)组合在一起表示 msk 值。例如:同时清除颜色缓冲区和深度缓冲区。 mask=GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT 。命令: glColor3f 函数原型: void glColor3f(GLfloat red,GLfloat green,GLfloat b

12、lue); 功能:将当前的颜色值设置为指定的 RGBA 模式颜色值( red,green,blue,1.0f), 其中 1.0f 为默认的混合因子数值。参数:(red,green,blue,指定颜色值的R、G、B三个分量每个分量的取值范围 均为区间 0.0,1.0。命令: S 函数原型: Bool S(HDC hdc); 功能:交换缓冲区,将绘制完成的缓存图像显示在屏幕上。 要求采用双缓存机制。 参数: hdc 指定设备上下文。返回值:如果函数执行成功,返回 TRUE ,否则,返回 FALSE。 命令: glOrtho函数原型: void glOrtho(GLdouble left,GLdou

13、ble right,GLdouble bottom, GLdouble top,GLdouble zNear,GLdouble zFar);功能:产生正平行投影变换矩阵。 参数: left、 right 分别为裁剪矩形体的左、右侧两个裁剪平面的 X 轴坐标值。bottom、top分别为裁剪矩形体的底、顶端两个裁剪平面的丫轴坐标值。(-zNear)、( zFar)分别为裁剪矩形体的近、远端两个裁剪平面的 Z 轴坐标值。命令: glFrustum 函数原型: void glFrustum(GLdouble left,GLdouble right,GLdouble bottom,功能:参数:GLdo

14、uble top,GLdouble zNear,GLdouble zFar); 产生透视投影变换矩阵。命令:函数原型: void gluPerspective(GLdouble fovy,GLdouble aspect, GLdouble zNear,GLdouble zFar);功能:产生对称透视投影变换矩阵。left、 right 分别为裁剪四棱台上底面矩形的左、 右侧两条边的 X 轴坐标值。 bottom、 top 分别为裁剪四棱台上底面矩形底、 顶端两条边的 丫 轴坐标值。 (zNear)、( zFar)分别为裁剪矩形体的近、远端两个裁剪平面的 Z 轴坐标值。gluPerspectiv

15、e参数: fovy 裁剪四棱台在 Y 方向上的两个侧面夹角的度数, 0<fovy<180。asp ect裁剪四棱台上底面命令: glViewport函数原型: void glViewport(GLint x0,GLint y0,GLsizei width,GLsizei height); 功能:产生视口变换,将在三维空间中可以显示在屏幕上的点映射到视口中。 参数: x0,y0 视口左下角点在视图窗口坐标下的坐标值;width 视口的宽度;height 视口的高度。命令: glVertex3d函数原型: void glVertex3d(GLdouble x,GLdouble y,GL

16、double z); 功能:用在一对函数 glBegin 和 glEnd 之间,用来指定一个顶点的坐标值。 参数: x, y,z 顶点坐标的三个分量。命令:gIBegin 和 glEnd函数原型: void glBegin(GLenum mode);void glEnd(void);功能:函数 glBegin 和 glEnd 共同组成一个函数对。在函数 glBegin 和 glEnd 之 间的语句定义了一个或一组图形元素的顶点坐标、颜色和法向量等信息。 同时函数 glBegin 的参数 mode 指定图形元素的类型。参数: mode 指定图形元素的类型。参数 mode 所有可能取值及其含义如下

17、:GPOINTS :要求在gIBegin和glEnd之间至少包含一个顶点, 每个顶点 都是孤立的点。GL_LINES :要求在gIBegin和glEnd之间至少包含两个顶点,如果有 2n 个顶点,生成 n 条直线段。GL_LINE_LOOP :要求在 glBegin 和 glEnd 之间至少包含两个顶点,依次 相连生成一个封闭的环。GL_LINE_STRIP :要求在 glBegin 和 glEnd 之间至少包含两个顶点, 依次 相连生成一条折线段。GL_TRIANGLES :要求在 glBegin 和 glEnd 之间至少包含三个顶点, 如果 有 3n 个顶点,生成 n 个三角形。GL_TR

18、IANGLE_STRIP :要求在 glBegin 和 glEnd 之间至少包含三个顶点,如果有n个顶点,生成(n2)个二角形组成的带。GL_TRIANGLE_FAN :要求在glBegin和glEnd之间至少包含三个顶点,如果有 n 个顶点,生成 (n 2)个三角形组成的扇。GL_QUADS :要求在glBegin和glEnd之间至少包含四个顶点,如果有 4n 个顶点,生成 n 个四边形。GL_QUAD_STRIP :要求在glBegin和glEnd之间至少包含四个顶点, 如果有n个顶点,生成(n 1)个四边形组成的带。GL_POLYGON :要求在 glBegin 和 glEnd 之间至少

19、包含三个顶点,对于 n 个顶点,一次相连组成一个多边形。实验一实验目的:熟悉 VC+控制台编程环境,掌握基于C语言的OpenGL编程结构。实验内容:1. GLUT 工具包的安装;2. 基于 VC+ 控制台的 C 语言编程;3. VC+ 控制台编程环境与 OpenGL 的连接;4. 基于 VC+ 控制台的 OpenGL 编程; 实验过程:一.阅读以下程序,掌握基于C语言的OpenGL编程结构:1. 源程序#include <windows.h>#include <gl/glut.h>void display(void) glClearColor(0.0f,0.0f,1.0

20、f,1.0f); glClear(GL_COLOR_BUFFER_BIT); glFlush();void main(int &argc,char *argv) glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutCreateWindow("hello"); glutDisplayFunc( display); displayMainLoop();2. 程序内容理解(1) 两个包含文件#include <windows.h> 包含了 windows 环境下编程所

21、需要的信息。#include <gl/glut.h> 包含了 OpenGL 编程所需要的信息。第一(2) main 函数 glutInit(&argc,argv); 初始化 GLUT 库,使系统识别 GLUT 库中的命令。 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 告诉 GLUT 库在创建窗口时使用的 显示模式和颜色模型,其中参数 GLUT_SINGLE 指定单缓冲显示模式,绘图命令在用于显 示的窗口执行。 参数 GLUT_RGB 指定 RGBA 颜色模型。 单缓冲显示模式不能做动画, 个参数的另一种选择是 GLUT_DOUBLE

22、 ,指定双缓冲显示模式,可以作动画。第二个参数 的其它选择现在不常用, RGBA 颜色模型通过设置红、绿 ,、三种颜色的成分来确定颜色。glutCreateWindow("hello"); 创建应用程序窗口,参数指定窗口标题。 glutDisplayFunc( display); 通过调用用户程序绘制图形。displayMainLoop(); 只能放在 main 函数的最后,所有已经创建的窗口将在此时显示, 对创建窗口的绘制开始生效,事件处理开始启动。( 3 ) display 函数红、绿、蓝的成分,每个成分在01 (伙伴0255)0 表示透明, 1 表示不透明。用 glC

23、learColor 命令指定的颜色清除颜色缓冲区中 BIT 代表颜色缓冲区。glClearColor(0.0f,0.0f,1.0f,1.0f); 设置颜色缓冲区的颜色为蓝色,即设置背景色, 参数(0.0f, 0.0f, 1.0f, 1.0f)指定颜色中之间取值;最后一个参数指定是否透明,glClear(GL_COLOR_BUFFER_BIT); 原来的颜色,参数 GL_COLOR_BUFFER_glFlush(); 用于刷新 OpenGL 中的命令队列,使所有未被执行 OpenGL 命令得到执行。 由于 OpenGL 内部使用渲染(绘图)流水线的顺序处理命令, OpenGL 的命令常常会排队并

24、 成批处理,以便优化性能。 glFlush 函数告诉 OpenGL 应该处理到目前为止收到的命令。命 令 glFinish() ;除了具有 glFlush() 的功能外,还等待图形硬件和网络的响应,但是性能没有 glFlush() 高。3. 运行程序glut.h, glut32.lib ,glut32.dll 。(1) 安装 GLUT 工具包(只需一次) :先下载,解压。 解压后包含三个文件: 安装过程:Windows 系统的 system32 文件夹中; VC 的 lib 文件夹中;* 将 glut32.dll 复制到* 将 glut32.lib 复制到* 将 glut.h 复制到 VC 的

25、 includeGL 文件夹中。(2) 启动 VC+ ,创建基于控制台的程序框架* 启动 VC+( 3)设置 OpenGL 编程环境* 在应用程序窗口,选择“ Project” 7 “ Settings ”* 在“ Object/Library Modules ”一栏中加入: 两个文件名以及与原有内容之间用空格间隔。( 4 )运行程序* 输入代码;* 编译和连接:在应用程序窗口,选择“ Build* 运行:在应用程序窗口,选择“ Build ”7“( 5)编译、修改7“ Link ”opengl32.Lib 、 glu32.Lib”7“ Compile ”或“ Build Execute ”或

26、工具栏按钮“!、glut32.Lib”。”执行程序。* 窗口最下方显示编译和连接信息, 如果编译出错, 双击错误信息, 系统自动定位到程序中 的出错语句,修改后再次编译。4. 程序运行结果:该程序仅创建一个系统默认的应用程序窗口。save Project”glClearColor 命令中参数,观察应用程序窗口的颜色变化。Clear Project ”5. 保存 在应用程序窗口,选择“ 6修改 display 函数中的 7.清除程序(内存) 在应用程序窗口,选择“二阅读以下程序 ,掌握应用程序窗口参数的设置和渲染对象的颜色设置(前景色)1. 源程序#include <windows.h&g

27、t;#include <gl/glut.h>void init() glClearColor(0.0,0.0,1.0,1.0);void display(void) glClear(GL_COLOR_BUFFER_BIT); giColor4f(0.0,1.0,1.0,1.0); glRotatef(60,1.0,1.0,1.0); glutWireCube(0.8); glFlush();void main(int &argc,char *argv) glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT

28、_RGB); glutIniWindowSize(200,200);glutIniWindowPosition(100,100);glutCreateWindow("cube");init();glutDisplayFunc( display);displayMainLoop();2. 程序内容理解(1) main 函数glutIniWindowSize(200,200); 设置应用程序窗口的大小,参数表示宽和高。glutIniWindowPosition(100,100); 设置应用程序窗口的位置,参数表示窗口的左上角坐 标。(2) init 函数init 函数中。从 m

29、ain 函数init 函数设置应用程序的初始化,其中包括应用程序启动时执行的代码,并且往往只执 行一遍。因为颜色缓冲区的颜色设置不经常变化,所以将其放入 中的调用次序可以看出,与程序一中代码的写法没有本质区别。(3) display 函数(0.0,1.0,1.0,1.0)的含义和解释giColor4f(0.0,1.0,1.0,1.0); 设置渲染对象的颜色,其中参数与 glClearColor(0.0f,0.0f,1.0f,1.0f); 相同。glRotatef(60,1.0,1.0,1.0); 将绘制图象旋转 60 度。参数(60, 1.0, 1.0, 1.0)表示(旋转角度,x轴,y轴,z

30、轴)。其中,对应x轴、y轴、z轴的数值,如果为1表示饶该轴旋转,为 0表示不饶该轴旋转。glutWireCube(0.8);绘制一个边长为 0.8的线框(Wire)立方体(Cube)。3. 运行、保存和清除程序同程序一。4. 观察并分析程序运行结果。5. 修改程序(1) 修改立方体的颜色;(2) 修改立方体的旋转角度;(3) 修改应用程序窗口的大小和在屏幕显示位置。三.glutWireCube(GLdouble size);绘制 GLUT 中的三维物体1. GLUT中的三维物体:命令中“ Solid”表示实心物体,“ Wire”图形。下面仅给出函数原型,命令的使用利用C语言知识调用。(1) 立

31、方体函数原型:glutWireCube(GLdouble size);glutSolidCube(GLdouble size);功能:绘制一个边长为siaze的立方体,立方体中心位于原点。参数说明:size为立方体的边长。(2) 圆锥体数原型:glutWireCo ne(GLdouble base,GLdouble height,GLi nt slices,GLi nt stacks); glutSolidC on e(GLdouble base,GLdouble height,GL int slices,GL int stacks);功能:绘制一个圆锥体,圆锥底面中心位于坐标原点(0,0,0

32、),圆锥顶点位于z轴上。参数说明:base圆锥底面半径,height圆锥高。slices环绕z轴的剖面数,stacks沿着z轴的剖面数。(3) 正十二面体函数原型:glutWireDodecahedro n( void);glutSolidDodecahedr on( void);功能:绘制一个正十二面体,中心位于原点,半径为73O参数说明:没有参数。(4) 正二十面体函数原型:glutWirelcosahedro n( void); glutSolidIcosahedr on( void);功能:绘制一个正二十面体,中心位于原点,半径为 参数说明:(5)函数原型:没有参数。glutWireO

33、ctahedr on( void);glutSolidOctahedro n( void);功能:绘制一个正八面体,中心位于原点,半径为1。参数说明:没有参数。(6)函数原型:glutWireS phere(GLdouble radius,GLi nt slices,GLi nt stacks);glutSolidS phere(GLdouble radius,GL int slices,GL int stacks);功能:绘制一个球体,球体的中心位于原点,半径为 radius。参数说明:Radius球体半径,slices环绕z轴的剖面数,即球体的经线数目,stacks沿着z轴的剖面数, 即球体的纬线数目。(7)函数原型:glutWireTetrahedro n( void);glutSolidetrahedro n( void);功能:绘制一个正四面体,中心位于原点,半径为V3。glutWireTorus(GLdouble inn erRadius,GLdouble outerRadius,GL int slices,GL int stacks); glutSolidTorus(GLdouble inn erRadius,GLdouble outerRadius,GL int slices,GL int stacks); 功能:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论