版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、工程计算机图形学第三章 二维基本图形生成算法浙江大学工程及计算机图学所 主要内容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使人们进入三维图形世界 最近几年计算机图形学的发展使得三维表现技术得以形成,这些三维表现技术使我们能够再现三维世界中的物体,能够用三维形体来表示复杂的信息,这种技术就是可视化 ( Visualization ) 技术。 可视化技术赋予人们一
2、种仿真的、三维的并且具有实时交互的能力,这样人们可以在三维图形世界中用以前不可想象的手段来获取信息或发挥自己创造性的思维。机械工程师可以从二维平面图中得以解放直接进入三维世界,从而很快得到自己设计的三维机械零件模型。医生可以从病人的三维扫描图象分析病人的病灶。军事指挥员可以面对用三维图形技术生成的战场地形,指挥具有真实感的三维飞机、军舰、坦克向目标开进并分析战斗方案的效果。 工程及计算机图形学 人们对计算机可视化技术的研究已经历了一个很长的历程,而且形成了许多可视化工具,其中SGI公司推出的GL三维图形库表现突出,易于使用而且功能强大。GL已经进一步发展成为OpenGL,OpenGL已被认为是
3、高性能图形和交互式视景处理的标准,目前包括ATT公司UNIX软件实验室、IBM公司、DEC公司、SUN公司、HP公司、Microsoft公司和SGI公司在内的几家在计算机市场占领导地位的大公司都采用了OpenGL图形标准。10.1.1 OpenGL使人们进入三维图形世界10.1.2 OpenGL提供直观的三维图形开发环境 OpenGL实际上它是图形软件和硬件的接口,有115个核心函数,可以在任何OPENGL平台上使用, 函数以gl开头;实用库41个,比上面这115个函数高一级,提供高级调用,函数以glu开头;辅助库31个,函数以aux开头;Windows专用库函数6个,以wgl开头;Win32
4、API函数5个,函数前无专门前缀。 . OpenGL提供一系列的三维图形单元供开发者调用 . OpenGL提供一系列的图形变换函数 . OpenGL提供一系列的外部设备访问函数,使开发者可以方便地访问鼠标、键盘、空间球、数据手套等这种直观的三维图形开发环境体现了OpenGL的技术优势,这也是许多三维图形开发者热衷于OpenGL的缘由所在。工程及计算机图形学10.1.3 OpenGL成为目前三维图形开发标准没有一种三维工具软件包在交互式三维图形建模能力、外部设备管理以及编程方便程度上能够OpenGL相比拟。OpenGL作为一个三维图形软件包,它提供了建模、变换、颜色模式设置、光照和材质设置、双缓
5、存动画、纹理映射、位图显示和图像增强七大功能。OpenGL在硬件、窗口、操作系统方面是相互独立的。OpenGL是网络透明的,在客户服务器(Client-Server)体系结构中,OpenGL允许本地和远程绘图。 OpenGL应用程序具有广泛的移植性。因此,OpenGL已成为目前的三维图形开发标准,是从事三维图形开发工作的技术人员所必须掌握的开发工具。工程及计算机图形学10.2.1 OpenGL基本概念 10.2.2 OpenGL工作流程 10.2.3 OpenGL基本语法与程序结构工程及计算机图形学10.2 OpenGL编程基础 OpenGL中的模型绘制过程就多种多样,对三维物体的绘制方式主要
6、提供了以下几种:1)网格线绘图方式(wireframe)2)深度优先网格线绘图方式(depth_cued)3)反走样网格线绘图方式(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)
7、. 构造几何要素(点,线,多边形,图象,位图),创建对象的数学描述。在三维空间上放置对象,选择有利的场景观察点。2). 计算对象的颜色,这些颜色可能直接定义,或由光照条件及纹理间接给出。图10-1OpenGL基本工作流程3). 光栅化,把对象的数学描述和颜色信息转换到屏幕的像素。 工程及计算机图形学10.2.2 OpenGL工作流程 图10-2-110.2.3 OpenGL基本语法与程序结构1.数据类型与函数名2. 状态机制3. OpenGL程序的基本结构工程及计算机图形学1.数据类型与函数名 OpenGL的数据类型定义可以与其它语言一致,但建议在ANSI C下最好使用以下定义的数据类型(以G
8、L开头),例如GLint、GLfloat等。具体类型见表10-1。 OpenGL函数按以下格式命名:例如glColor4f(),gluSphere();工程及计算机图形学10.2.3 OpenGL基本语法与程序结构2. 状态机制 OpenGL的工作方式是一种状态机,它可进行各种状态或模式设置,这些状态或模式在重新改变它们之前一直有效例:LSX中void CGLView:OnInitialUpdate() /glEnable(GL_LINE_SMOOTH);/glEnable(GL_BLEND);/去掉注释观看效果void CMannequinView:ShowAllLinesAndPts()g
9、lDisable(GL_LIGHTING);glEnable(GL_LIGHTING);/ 加上注释观看效果工程及计算机图形学10.2.3 OpenGL基本语法与程序结构3. OpenGL程序的基本结构初始化:主要是设置一些OpenGL的状态开关。设置观察坐标系下的取景模式和取景框位置及大小使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系,几何变换,光照处理等等。 (结合例子分析) 工程及计算机图形学10.2.3 OpenGL基本语法与程序结构1.头文件2. 主体程序3.主要函数简介4.实例例: 圆柱相交程序分析工程及计算机图形学10.2.3 OpenGL基本语法
10、与程序结构#include #include #include #include #include /数学运算库 这些头文件包含了程序所用的函数原型。所有Windows应用程序都需要windows.h头文件,它包含大多数WIN32函数原型。其实GULT的WIN32版本的glut.h中包含了windows.h。接下来的几个头文件定义OpenGL的gl、glu、glut函数库的函数原型。math.h则定义了数学运算库的函数原型。1. 头文件工程及计算机图形学10.2.3 OpenGL基本语法与程序结构int main(int argc, char* argv) glutInit(&argc, ar
11、gv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutCreateWindow(两圆柱相交); SetupRC(); glutReshapeFunc(ChangeSize); glutSpecialFunc(SpecialKeys); glutKeyboardFunc(KeyBoardHandler); glutDisplayFunc(RenderScene); cylinder= gluNewQuadric(); glutMainLoop(); return 0;2.主体程序工程及计算机图形学10.2.3 Ope
12、nGL基本语法与程序结构glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); /改成GLUT_SINGLE,看效果 SetupRC(); /改变一些控制开关,看效果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
13、.2.3 OpenGL基本语法与程序结构OpenGL变换(1)相机模拟工程及计算机图形学10.2.3 OpenGL基本语法与程序结构图10-2-2工程及计算机图形学10.2.3 OpenGL基本语法与程序结构图10-2-3实际上,从三维空间到二维平面,就如同用相机拍照一样,通常都要经历以下几个步骤 将相机置于三角架上,让它对准三维景物(视点变换,Viewing Transformation); 将三维物体放在适当的位置(模型变换,Modeling Transformation ); 选择相机镜头并调焦,使三维物体投影在二维胶片上(投影变换,Projection Transformation )
14、 决定二维像片的大小(视口变换,Viewport Transformation )。工程及计算机图形学10.2.3 OpenGL基本语法与程序结构(1)模型变换视图变换 (两者合称几何变换)glMatrixMode (GL_MODELVIEW )glTranslate (); /模型、视图变换glRotate (); /模型、视图变换glScale (); /模型变换gluLookAt(); / 视图变换工程及计算机图形学10.2.3 OpenGL基本语法与程序结构图10-2-4(2)投影变换正投影:void glOrtho(GLdouble left,GLdouble right,GLdou
15、ble 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(GLenum plane,Const GLdouble *equation); 函数定义一个附加的裁剪平面。其中参
16、数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 OpenGL基本语法与程序结构图10-2-7(4)视口变换 视景体到视口的映射定义视口 glViewport(GLint x,GLint y,
17、GLsizei width, GLsizei height); 注意:在实际应用中,视口的长宽比率总是等于视景体裁剪面的长宽比率。如果两个比率不相等,那么投影后的图像显示于视口内时会发生变形!工程及计算机图形学10.2.3 OpenGL基本语法与程序结构图10-2-8. 显示回调函数RenderScene();glMatrixMode();该函数指定哪个矩阵为当前的矩阵,参数为GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE;指定当前的矩阵之后,接下来的所有矩阵变换都是针对当前的矩阵进行的。RenderScene中接下来的平移、旋转操作都是对视图矩阵进行的。而在Cha
18、ngeSize函数中要修改修剪区则必须把当前矩阵设为投影矩阵。glPushMatrix()、glPopMatrix();这两个函数主要是压入和弹出当前模型视图矩阵,具体作用在前面的矩阵堆栈中有说明。gluCylinder(cylinder, 20.0, 20.0, 40.0, 40, 2);void gluCylinder( GLUquadricObj * qobj, GLdouble baseRadius, GLdouble topRadius, GLdouble height, GLint slices, GLint stacks); 工程及计算机图形学10.2.3 OpenGL基本语法与
19、程序结构 glutSwapBuffers();该函数执行缓冲区的交换,同时隐含一次刷新,即让所有尚未执行的OpenGL命令都被执行。双缓冲技术使得用户看到的始终是完整的最终合成好的复杂图形;对于动画制作来说,每一帧都在缓冲区绘制,完成后再很快的交换到屏幕上,使得动画效果平滑流畅。5.建立圆柱体的函数RenderShaft(void) glBegin(GL_QUAD_STRIP); glEnd(); glBegin/glEnd对中可以包括多个顶点,但它们必须是用于相同的图元类型,如glVertex、glColor、glIndex、glNormal、glEvalCoord、glCallList、g
20、lCallLists、glTexCoord、glEdgeFlag、glMaterial 工程及计算机图形学10.2.3 OpenGL基本语法与程序结构 GlBegin函数中的参数为指定要构造的图元,它支持以下OpenGL图元:GL_POINTS、GL_LINES、GL_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-9ReduceToUnit(normal);
21、OpenGL中,通过点光源和法线之间的夹角来判断多边形表明的明暗效果。 glNormal3fv(normal);指定随后顶点或顶点集合定义一个表面法线。工程及计算机图形学10.2.3 OpenGL基本语法与程序结构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_
22、DEPTH_TEST);glEnable(GL_LIGHTING); / 打开光照/glDisable(GL_LIGHTING); 工程及计算机图形学10.2.3 OpenGL基本语法与程序结构4.Bolt 程序步骤浅析建立一个工程 添加工程所需的OpenGL文件和库 添加控件 创建OpenGL图形类实现MFC中的三维图形绘制 关联draw对象m_list到IDC_LIST1控件中 CBoltView初始化 PreCreateWindow()函数 注册窗口风格响应窗口消息命令工程及计算机图形学10.2.3 OpenGL基本语法与程序结构设置 OpenGL 绘图窗口的风格cs.style |=
23、WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC 创建 OpenGL 的绘图设备 OpenGL 绘图的机制是: 先用 OpenGL 的绘图上下文 RC 把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的 绘图上下文 DC。注意,程序运行过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图后,要立即释放 RC,以便其它DC使用 SetWindowPixelFormat(hDC)函数设置像素格式 , 为执行OpenGL绘制任务的窗口专门指定像素格式 。CreateViewGLContext(hDC) 创建绘制描
24、述表并使之为当前设备描述表。OpenGL场景的常规初始设置 工程及计算机图形学10.2.3 OpenGL基本语法与程序结构 断开DC和RC的关联,释放DC,删除RC wglMakeCurrent(NULL,NULL);/解除 RC和DC关联 wglDeleteContext(m_hGLContext); /删除 RC 其他。处理 OnEraseBkgnd() /return CListCtrl:OnEraseBkgnd(pDC);/把这句话注释掉,若不然,Window 会用白色背景来刷新,导致画面闪烁 处理 OnPaint() 处理OnSize()setprojectmodel()显示列表的使
25、用工程及计算机图形学10.2.3 OpenGL基本语法与程序结构 创建两个视图 m_wndSplitter.CreateStatic(this, 1, 2,WS_CHILD | WS_VISIBLE) m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS (CFormCommandView), CSize(200,200), pContext)访问视图指针CToolApp *pApp = (CToolApp *)AfxGetApp();CMainFrame *pMainFrame = (CMainFrame *)pApp-m_pMainWnd;CChildF
26、rame *pFrame = (CChildFrame *)pMainFrame- GetActiveFrame();CView *pView = (CView *)pFrame-m_wndSplitter.GetPane(0,1);CRenderView:OnCreate()中初始化OpenGLCRenderView:OnDestroy() 销毁OpenGL场景CRenderView:OnSize()工程及计算机图形学10.2.3 OpenGL基本语法与程序结构 设置背景色与光源颜色设置OpenGL属性设置转动设置缩放工程及计算机图形学10.2.3 OpenGL基本语法与程序结构 SetVi
27、ewportOrg与SetWindowOrg函数使用参数交互输入控制图形图形坐标系的设置与图形的绘制满屏显示:m_rect=CRect(0,0,2*m_Radius,2*m_Radius) ;pDC-SetMapMode(MM_ISOTROPIC) ;pDCSetWindowExt(m_rect.right,m_rect.bottom) ;pDC-SetViewportExt(rc.right,rc.bottom) ;工程及计算机图形学Curve程序演示要点10.2.3 OpenGL基本语法与程序结构爱是什么?一个精灵坐在碧绿的枝叶间沉思。风儿若有若无。一只鸟儿飞过来,停在枝上,望着远处将要成
28、熟的稻田。精灵取出一束黄澄澄的稻谷问道:“你爱这稻谷吗?”“爱。”“为什么?”“它驱赶我的饥饿。”鸟儿啄完稻谷,轻轻梳理着光润的羽毛。“现在你爱这稻谷吗?”精灵又取出一束黄澄澄的稻谷。鸟儿抬头望着远处的一湾泉水回答:“现在我爱那一湾泉水,我有点渴了。”精灵摘下一片树叶,里面盛了一汪泉水。鸟儿喝完泉水,准备振翅飞去。“请再回答我一个问题,”精灵伸出指尖,鸟儿停在上面。“你要去做什么更重要的事吗?我这里又稻谷也有泉水。”“我要去那片开着风信子的山谷,去看那朵风信子。”“为什么?它能驱赶你的饥饿?”“不能。”“它能滋润你的干渴?”“不能。”爱是什么?一个精灵坐在碧绿的枝叶间沉思。风儿若有若无。一只鸟儿飞过来,停在枝上,望着远处将要成熟的稻田。精灵取出一束黄澄澄的稻谷问道:“你爱这稻谷吗?”“爱。”“为什么?”“它驱赶我的饥饿。”鸟儿啄完稻谷,轻轻梳理着光润的羽毛。“现在你爱这稻谷吗?”精灵又取出一束黄澄澄的稻谷。鸟儿抬头望着远处的一湾泉水回答:“现在我爱那一湾泉水,我有点渴了。”精灵摘下一片树叶,里面盛了一汪泉水。鸟儿喝完泉水,准备振翅飞去。“请再回答我一个问题,”精灵伸出指尖,鸟儿停在上面。“你要去做什么更重要的事吗?我这里又稻
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年超市数字化运营面试题库及答案
- 2025年平顶山医美中心面试题库及答案
- 2025年江苏省事业单位面试题库及答案
- 2025年惠州业务员笔试题目及答案
- 2025年三选一二选一面试题库及答案
- 2025年六盘水教师面试题库答案
- 餐饮业经营模式研究与探讨
- 超算技术实现方法介绍
- 华工科技深度研究:全球光模块机遇已至光电领军企业乘势而起
- 某家政公司扫地机使用规范
- ISO 55001-2025 资产管理-资产管理体系-要求(中文版-翻译-2025)
- django基于深度学习的旅游系统设计与实现-论文13000字
- 《采煤机》课件-第二章 采煤机截割部
- 医院复工复产安全培训课件
- 民营企业工作作风存在的问题及整改措施
- GB/T 6075.6-2024机械振动在非旋转部件上测量评价机器的振动第6部分:功率大于100 kW的往复式机器
- 2025年湖南劳动人事职业学院高职单招职业技能测试近5年常考版参考题库含答案解析
- 教学大纲-跨境电子商务法律法规
- 肺曲霉病护理
- 上海市历年中考语文现代文之议论文阅读6篇(含答案)(2003-2022)
- 重症感染治疗指南
评论
0/150
提交评论