工程计算机图形学第三章 二维基本图形生成算法_第1页
工程计算机图形学第三章 二维基本图形生成算法_第2页
工程计算机图形学第三章 二维基本图形生成算法_第3页
工程计算机图形学第三章 二维基本图形生成算法_第4页
工程计算机图形学第三章 二维基本图形生成算法_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、SHU Graphics & Image Group工程计算机图形学第三章 二维基本图形生成算法浙江大学工程及计算机图学所浙江大学工程及计算机图学所 工程及计算机图形学工程及计算机图形学主要内容 10.1 OpenGL概述概述 10.2 OpenGL编程基础编程基础工程及计算机图形学工程及计算机图形学10.1 OpenGL概述10.1.1 OpenGL使人们进入三维图形世界 10.1.2 OpenGL提供直观的三维图形开发环境10.1.3 OpenGL成为目前三维图形开发标准 工程及计算机图形学工程及计算机图形学工程及计算机图形学工程及计算机图形学10.1.1 OpenGL使人们进入三

2、维图形世界 最近几年计算机图形学的发展使得三维表现技术得以形成,这些三维表现技术使我们能够再现三维世界中的物体,能够用三维形体来表示复杂的信息,这种技术就是可视化 ( Visualization ) 技术。 可视化技术赋予人们一种仿真的、三维的并且具有实时交互的能力,这样人们可以在三维图形世界中用以前不可想象的手段来获取信息或发挥自己创造性的思维。机械工程师可以从二维平面图中得以解放直接进入三维世界,从而很快得到自己设计的三维机械零件模型。医生可以从病人的三维扫描图象分析病人的病灶。军事指挥员可以面对用三维图形技术生成的战场地形,指挥具有真实感的三维飞机、军舰、坦克向目标开进并分析战斗方案的效

3、果。 工程及计算机图形学工程及计算机图形学工程及计算机图形学工程及计算机图形学 人们对计算机可视化技术的研究已经历了一个很长的历程,而且形成了许多可视化工具,其中SGI公司推出的GL三维图形库表现突出,易于使用而且功能强大。GL已经进一步发展成为OpenGL,OpenGL已被认为是高性能图形和交互式视景处理的标准,目前包括ATT公司UNIX软件实验室、IBM公司、DEC公司、SUN公司、HP公司、Microsoft公司和SGI公司在内的几家在计算机市场占领导地位的大公司都采用了OpenGL图形标准。10.1.1 OpenGL使人们进入三维图形世界工程及计算机图形学工程及计算机图形学10.1.2

4、 OpenGL提供直观的三维图形开发环境 OpenGL实际上它是图形软件和硬件的接口,有115个核心函数,可以在任何OPENGL平台上使用, 函数以gl开头;实用库41个,比上面这115个函数高一级,提供高级调用,函数以glu开头;辅助库31个,函数以aux开头;Windows专用库函数6个,以wgl开头;Win32API函数5个,函数前无专门前缀。 . OpenGL提供一系列的三维图形单元供开发者调用 . OpenGL提供一系列的图形变换函数 . OpenGL提供一系列的外部设备访问函数,使开发者可以方便地访问鼠标、键盘、空间球、数据手套等这种直观的三维图形开发环境体现了OpenGL的技术优

5、势,这也是许多三维图形开发者热衷于OpenGL的缘由所在。工程及计算机图形学工程及计算机图形学工程及计算机图形学工程及计算机图形学10.1.3 OpenGL成为目前三维图形开发标准没有一种三维工具软件包在交互式三维图形建模能力、外部设备管理以及编程方便程度上能够OpenGL相比拟。OpenGL作为一个三维图形软件包,它提供了建模、变换、颜色模式设置、光照和材质设置、双缓存动画、纹理映射、位图显示和图像增强七大功能。OpenGL在硬件、窗口、操作系统方面是相互独立的。OpenGL是网络透明的,在客户服务器(Client-Server)体系结构中,OpenGL允许本地和远程绘图。 OpenGL应用

6、程序具有广泛的移植性。因此,OpenGL已成为目前的三维图形开发标准,是从事三维图形开发工作的技术人员所必须掌握的开发工具。工程及计算机图形学工程及计算机图形学工程及计算机图形学工程及计算机图形学10.2.1 OpenGL基本概念 10.2.2 OpenGL工作流程 10.2.3 OpenGL基本语法与程序结构工程及计算机图形学工程及计算机图形学10.2 OpenGL编程基础工程及计算机图形学工程及计算机图形学 OpenGL中的模型绘制过程就多种多样,对三维物体的绘制方式主要提供了以下几种:1)网格线绘图方式(wireframe)2)深度优先网格线绘图方式(depth_cued)3)反走样网格

7、线绘图方式(antialiased)4)平面消隐绘图方式(flat_shade)5)光滑消隐绘图方式(smooth_shade)6)加阴影和纹理的绘图方式(shadows、textures)7)运动模糊的绘图方式(motion-blured)8)大气环境效果(atmosphere-effects)9)深度域效果(depth-of-effects)工程及计算机图形学工程及计算机图形学10.2.1 OpenGL基本概念工程及计算机图形学工程及计算机图形学 OpenGL的工作顺序就是一个从定义几何要素到把像素段写入帧缓冲区的过程。1). 构造几何要素(点,线,多边形,图象,位图),创建对象的数学描述

8、。在三维空间上放置对象,选择有利的场景观察点。2). 计算对象的颜色,这些颜色可能直接定义,或由光照条件及纹理间接给出。图10-1OpenGL基本工作流程3). 光栅化,把对象的数学描述和颜色信息转换到屏幕的像素。 工程及计算机图形学工程及计算机图形学10.2.2 OpenGL工作流程 图10-2-1工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构1.数据类型与函数名2. 状态机制3. OpenGL程序的基本结构工程及计算机图形学工程及计算机图形学工程及计算机图形学工程及计算机图形学1.数据类型与函数名 OpenGL的数据类型定义可以与其它语言一致,但建议在AN

9、SI C下最好使用以下定义的数据类型(以GL开头),例如GLint、GLfloat等。具体类型见表10-1。 OpenGL函数按以下格式命名:例如glColor4f(),gluSphere();工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构工程及计算机图形学工程及计算机图形学2. 状态机制 OpenGL的工作方式是一种状态机,它可进行各种状态或模式设置,这些状态或模式在重新改变它们之前一直有效例:LSX中void CGLView:OnInitialUpdate() /glEnable(GL_LINE_SMOOTH);/glEnable(GL_BLEND);/去

10、掉注释观看效果void CMannequinView:ShowAllLinesAndPts()glDisable(GL_LIGHTING);glEnable(GL_LIGHTING);/ 加上注释观看效果工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构工程及计算机图形学工程及计算机图形学3. OpenGL程序的基本结构 初始化:主要是设置一些OpenGL的状态开关。 设置观察坐标系下的取景模式和取景框位置及大小 使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系,几何变换,光照处理等等。 (结合例子分析) 工程及计算机图形学工程及计算

11、机图形学10.2.3 OpenGL基本语法与程序结构工程及计算机图形学工程及计算机图形学 1.头文件 2. 主体程序 3.主要函数简介 4.实例例: 圆柱相交程序分析工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构工程及计算机图形学工程及计算机图形学#include #include #include #include #include /数学运算库 这些头文件包含了程序所用的函数原型。所有Windows应用程序都需要windows.h头文件,它包含大多数WIN32函数原型。其实GULT的WIN32版本的glut.h中包含了windows.h。接下来的几个头文件

12、定义OpenGL的gl、glu、glut函数库的函数原型。math.h则定义了数学运算库的函数原型。1. 头文件工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构工程及计算机图形学工程及计算机图形学int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutCreateWindow(两圆柱相交); SetupRC(); glutReshapeFunc(ChangeSize); glutS

13、pecialFunc(SpecialKeys); glutKeyboardFunc(KeyBoardHandler); glutDisplayFunc(RenderScene); cylinder= gluNewQuadric(); glutMainLoop(); return 0;2.主体程序工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构工程及计算机图形学工程及计算机图形学glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); /改成GLUT_SINGLE,看效果 SetupRC(); /改变一些控

14、制开关,看效果ChangeSize();将 glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange*2.0f, nRange*2.0f);替换为glOrtho (-nRange, nRange, -nRange, nRange, -nRange*2.0f, nRange*2.0f); 效果?3主要函数简介工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构工程及计算机图形学工程及计算机图形学OpenGL变换(1)相机模拟工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构图10

15、-2-2工程及计算机图形学工程及计算机图形学工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构图10-2-3工程及计算机图形学工程及计算机图形学实际上,从三维空间到二维平面,就如同用相机拍照一样,通常都要经历以下几个步骤 将相机置于三角架上,让它对准三维景物(视点变换,Viewing Transformation); 将三维物体放在适当的位置(模型变换,Modeling Transformation ); 选择相机镜头并调焦,使三维物体投影在二维胶片上(投影变换,Projection Transformation ) 决定二维像片的大小(视口变换,Viewport

16、 Transformation )。工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构工程及计算机图形学工程及计算机图形学(1)模型变换视图变换 (两者合称几何变换)glMatrixMode (GL_MODELVIEW )glTranslate (); /模型、视图变换glRotate (); /模型、视图变换glScale (); /模型变换gluLookAt(); / 视图变换工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构图10-2-4工程及计算机图形学工程及计算机图形学(2)投影变换正投影:void glOrtho(GLdo

17、uble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far)透视投影 void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构图10-2-5图10-2-5图10-2-6工程及计算机图形学工程及计算机图形学(3)裁剪变换 附加裁平面和视景体void glClipPlane(

18、GLenum plane,Const GLdouble *equation); 函数定义一个附加的裁剪平面。其中参数equation指向一个拥有四个系数值的数组,这四个系数分别是裁剪平面Ax+By+Cz+D=0的A、B、C、D值。因此,由这四个系数就能确定一个裁剪平面。参数plane GL_CLIP_PLANEi(i=0,1,.),指定裁剪面号。GLdouble eqn4 = 1.0, 0.0, 0.0, 0.0; glClipPlane (GL_CLIP_PLANE0, eqn);glEnable (GL_CLIP_PLANE0);工程及计算机图形学工程及计算机图形学10.2.3 OpenG

19、L基本语法与程序结构图10-2-7工程及计算机图形学工程及计算机图形学(4)视口变换 视景体到视口的映射定义视口 glViewport(GLint x,GLint y,GLsizei width, GLsizei height); 注意:在实际应用中,视口的长宽比率总是等于视景体裁剪面的长宽比率。如果两个比率不相等,那么投影后的图像显示于视口内时会发生变形!工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构图10-2-8工程及计算机图形学工程及计算机图形学4. 显示回调函数RenderScene();glMatrixMode();该函数指定哪个矩阵为当前的矩阵,参

20、数为GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE;指定当前的矩阵之后,接下来的所有矩阵变换都是针对当前的矩阵进行的。RenderScene中接下来的平移、旋转操作都是对视图矩阵进行的。而在ChangeSize函数中要修改修剪区则必须把当前矩阵设为投影矩阵。glPushMatrix()、glPopMatrix();这两个函数主要是压入和弹出当前模型视图矩阵,具体作用在前面的矩阵堆栈中有说明。gluCylinder(cylinder, 20.0, 20.0, 40.0, 40, 2);void gluCylinder( GLUquadricObj * qobj, GL

21、double baseRadius, GLdouble topRadius, GLdouble height, GLint slices, GLint stacks); 工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构工程及计算机图形学工程及计算机图形学 glutSwapBuffers();该函数执行缓冲区的交换,同时隐含一次刷新,即让所有尚未执行的OpenGL命令都被执行。双缓冲技术使得用户看到的始终是完整的最终合成好的复杂图形;对于动画制作来说,每一帧都在缓冲区绘制,完成后再很快的交换到屏幕上,使得动画效果平滑流畅。5.建立圆柱体的函数RenderShaft

22、(void) glBegin(GL_QUAD_STRIP); glEnd(); glBegin/glEnd对中可以包括多个顶点,但它们必须是用于相同的图元类型,如glVertex、glColor、glIndex、glNormal、glEvalCoord、glCallList、glCallLists、glTexCoord、glEdgeFlag、glMaterial 工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构工程及计算机图形学工程及计算机图形学 GlBegin函数中的参数为指定要构造的图元,它支持以下OpenGL图元:GL_POINTS、GL_LINES、GL

23、_LINE_STRIP、GL_LINE_LOOP、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN、GL_QUADS、GL_QUAD_STRIP、GL_POLYGON。工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构图10-2-9工程及计算机图形学工程及计算机图形学ReduceToUnit(normal); OpenGL中,通过点光源和法线之间的夹角来判断多边形表明的明暗效果。 glNormal3fv(normal);指定随后顶点或顶点集合定义一个表面法线。工程及计算机图形学工程及计算机图形学10.2.3 OpenGL

24、基本语法与程序结构工程及计算机图形学工程及计算机图形学glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);/ glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);GLfloat nRange = 100.0f; /50;glEnable(GL_DEPTH_TEST);/ 隐藏被挡住的表面/glDisable(GL_DEPTH_TEST);glEnable(GL_LIGHTING); / 打开光照/glDisable(GL_LIGHTING); 工程及计算机图形学工程及计算

25、机图形学10.2.3 OpenGL基本语法与程序结构工程及计算机图形学工程及计算机图形学4.Bolt 程序步骤浅析 建立一个工程 添加工程所需的OpenGL文件和库 添加控件 创建OpenGL图形类实现MFC中的三维图形绘制 关联draw对象m_list到IDC_LIST1控件中 CBoltView初始化 PreCreateWindow()函数 注册窗口风格 响应窗口消息命令工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构工程及计算机图形学工程及计算机图形学 设置 OpenGL 绘图窗口的风格cs.style |= WS_CLIPSIBLINGS | WS_CL

26、IPCHILDREN | CS_OWNDC 创建 OpenGL 的绘图设备 OpenGL 绘图的机制是: 先用 OpenGL 的绘图上下文 RC 把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的 绘图上下文 DC。注意,程序运行过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图后,要立即释放 RC,以便其它DC使用 SetWindowPixelFormat(hDC)函数设置像素格式 , 为执行OpenGL绘制任务的窗口专门指定像素格式 。 CreateViewGLContext(hDC) 创建绘制描述表并使之为当前设备描述表。 OpenGL场

27、景的常规初始设置 工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构工程及计算机图形学工程及计算机图形学 断开DC和RC的关联,释放DC,删除RC wglMakeCurrent(NULL,NULL);/解除 RC和DC关联 wglDeleteContext(m_hGLContext); /删除 RC 其他。u处理 OnEraseBkgnd() /return CListCtrl:OnEraseBkgnd(pDC);/把这句话注释掉,若不然,Window 会用白色背景来刷新,导致画面闪烁 u处理 OnPaint() u处理OnSize()setprojectmodel()u显示列表的使用工程及计算机图形学工程及计算机图形学10.2.3 OpenGL基本语法与程序结构

温馨提示

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

评论

0/150

提交评论