基于OpenGL三维软件的设计
更新时间:2023-12-29 08:01:01 阅读量: 教育文库 文档下载
- opengl三维坐标系推荐度:
- 相关推荐
第五章 基于OpenGL技术的软件系统设计
机器人三维运动仿真是机器人各项仿真中一个很重要的组成部分。它对于验证机器人工作原理、工作空间及进行碰撞检测等都具有非常重要的指导意义[4]。本章通将如何在Windows环境下使用VC++、OpenGL实现物体的三维实时运动仿真,并利用“模糊神经网络算法”来解决机械手臂到达指定环境中的某点位置运动的问题,为机械运动控制系统的三维运动仿真及操作控制提供了一种新的方法[52]。
5.1 OpenGL技术的实现
5.1.1 OpenGL的概述
OpenGL(全称:Open Graphics Library)是定义了一个跨编程语言、跨平台的编程接口的规格,它用于三维图象(二维的亦可)。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。IRIS GL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL。OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接口”。虽然Direct X在家用市场全面领先,但在专业高端绘图领域,OpenGL是不能被取代的主角。
OpenGL是与硬件无关的软件接口,可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。因此,支持OpenGL的软件具有很好的移植性,可以获得非常广泛的应用。由于OpenGL是图形的底层图形库,没有提供几何实体图元,不能直接用以描述场景。但是通过一些转换程序,可以很方便地将AutoCAD、3DS/3DSMAX等3D图形设计软件制作的DXF和3DS模型文件转换成OpenGL的顶点数组。在OpenGL的基础上还有Open Inventor、Cosmo3D、Optimizer等多种高级图形库,适应不同应用,其中,Open Inventor应用最为广泛。该软件是基于OpenGL面向对象的工具包,提供创建交互式3D图形应用程序的对象和方法,提供了预定义的对象和用于交互的事件处理模块,创建和编辑3D场景的高级应用程序单元,有打印对象和用其它图形格式交换数据的能力。
OpenGL的发展一直处于一种较为迟缓的态势,每次版本的提高新增的技术很少,大多只是对其中部分做出修改和完善。1992年7月,SGI公司发布了
OpenGL的1.0版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。1995年OpenGL的1.1版本面市,该版本比1.0的性能有许多提高,并加入了一些新的功能。其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。OpenGL 1.5又新增了“OpenGL Shading Language”,该语言是“OpenGL 2.0”的底核,用于着色对象、顶点着色以及片断着色技术的扩展功能。
OpenGL 2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3DLabs。2.0版本首先要做的是与旧版本之间的完整兼容性,同时在顶点与像素及内存管理上与DirectX共同合作以维持均势。OpenGL 2.0将由OpenGL 1.3的现有功能加上与之完全兼容的新功能所组成,如图5-1。借此可以对在ARB停滞不前时代各家推出的各种纠缠不清的扩展指令集做一次彻底的精简。此外,硬件可编程能力的实现也提供了一个更好的方法以整合现有的扩展指令[51]。
5.1.2 OpenGL三维成形过程
OpenGL具有超强的图形绘制能力,包括绘制物体、启动光照、管理位图、纹理映射、动画、图形增强及交互技术等功能。综合以上功能,作为图形硬件的软件接口,OpenGL主要是将三维的物体投影到一个二维平面上,之后处理得到像素,进行显示。OpenGL首先将物体转化为可以描述物体几何性质的顶点(Vertex)与描述图像的像素(Pixel),在执行一系列操作后,最终将这些数据转化成像素数据。也就是说,OpenGL是基于点的。在OpenGL中,无论何种情况,指令总是被顺序处理。有一组顶点定义的图元(Pirmitive)执行完绘制操作后,后继图元才能作用[53]。简单的图形生成过程如图1.1所示。
(1) 对图元的定义:图元由一组顶点定义,这一组顶点可以是一个或是多个顶点。每个顶点信息可以是二维的也可以是三维的,可以使用2~4个坐标。顶点信息可以由位置坐标、颜色值、法向量、纹理坐标组成。法线、纹理、颜色值会在处理每个顶点的过程中被使用和改变。纹理坐标决定图元上纹理图像的映射方式;法线是用于光照计算的;颜色与颜色的变化取决于是否有光照。OpenGL将点、线段、多边形等通过在函数glBegin()和glEnd()之间一系列顶点的数据绘制出图形。
(2) 对图元的操作:OpenGL用交换矩阵、光照、反走样、像素操作等方法控制图元的绘制。图元的操作处理过程结束后,只留下图元可见部分,准备进行
光栅化(投影)处理[54]。像素处理比较特殊:对像素、位图、影像直接进行像素操作,然后进行光栅化,后者是有些数据被存储在纹理中供顶点使用。
(3) 光栅化(Rasterization)过程:将图元转化为二维图像,完成每个图像点的颜色与深度的计算,生成结果为基片(Fragment),即各图元的二维结果。
(4) 基片操作:处理过程包括基片是否遮挡、测试、融合等,最后得到像素,存入显示帧缓冲中,完成整个绘制过程。
顶点法向颜色纹理像素顶点图元基 片基本操作帧缓冲图5-1 OpenGL图形绘制过程
像素图元、像素操作光栅化顶点零件加工
5.2 基于VC++中的OpenGL技术的实现
基于OpenGL的开放性接口,利用目前流行功能强大的Visual C++开发环境编程,Visual C++以其与OpenGL接口的高兼容性,是的开发过程简单易用。 5.2.1 VC++ 编程平台
几乎所有世界级的软件,从Web浏览器到面向任务的企业级应用,都是使用Microsoft Visual C++开发系统来开发的。要用C++来开发Windows的高性能应用程序,Visual C++是效率较高的首选工具之一。Visual C++作为一种程序设计语言,它同时也是一个集成开发工具,提供了软件代码自动生成和可视化的资源编辑功能。本次设计采用Visual C++ 6.0作为开发软件。 5.2.2 OpenGL 3D建模工具
OpenGL能够建立两种三维几何模型。一种是线框模型.一种是表面模型。在进行建模时任意复杂的三维实体用一个个小的多边形面来近似表示。OpenGL的辅助库实际上也采用了这种方式来绘制图形。建模的关健就是设法把复杂的三维实体分解为小多边形。OpenGL通过以下格式来定义多边形:
glBegin(GL_POl, YGoN); glVertex3f(0.0, 0.0, 0.0); glVertex3f (0.0, 3.0,0.0); giVertex3f(3.0, 3.0, 0.0); glVertex3f(4.0, 1.5, 0.0); glVertex3f(3.0, 0.0, 0.0); glEnd();
OpenGL的建模实质上就是根据所给定的顶点数据和面信息建立起各个多边形面元,并将其存储到显示列表中,在需要时予以调用。目前较为常用的有3几种建模方案。
(1) 利用OpenGL的辅助库函数。如前所述,辅助库也提供了一些绘制简单实体的函数,如果所要绘制的几何形状比较简单可直接采用,若对于复杂的几何形体则显得有些力不从心。辅助库中绘制实体的函数.命令格式也限制得很死。例如,绘制圆柱体的函数。只能为沿z向伸展,且以原点为圆心。绘蒯这些形体虽然可只执行一条指令。可是必须经过平移和旋转变换后才能满足最终要求,使建模过程变得非常繁琐,同时也影响了系统的效率。
(2) 利用现有的CAD系统来完成建模。商品化的CAD软件(如AutoCAD、lAG lI、Solidworks等),具有很强的三维建模能力。能够用交互的方式十分方便地建立起复杂的几何模型,用它们来辅助完成建模工作是十分合适的。关键是如何从几何造型文件中提取出几何形体数据,用于OpenGL绘图。这就需要对图形文件的格式有深入的了解。 5.2.3 三维建模应用中的考虑
综合以上三种方法,对于简单标准的实体,直接采用辅助库函数建模;对简单的实体如多边形的拉伸、回转体等则采用自定义手工建模的方法。而对于比较复杂的曲面等,则利用AutoCAD等CAD软件绘制所需图形在OpenGL中读取显示的方法。
在VC++6.0开发环境下开发OpenGL应用程序需解决OpenGL与VC++6.0窗口系统的接口问题,主要是为OpenGL创建适当的图形操作描述表并设置正确的像素格式。此外就是要将OpenGL编程与VC++中的事件编程相结合。在VC++ 6.0事件处理程序中,利用OpenGL进行图形绘制,从而真正地将OpenGL融入到程序中,使之于程序的其他部分有机地结合成为一个整体。
OpenGL的绘图方式与Windows的一般的绘图方式是不同的,其区别主要表现在以下3个方面:
(l) Windows用GDI绘图。GDI是Windows中二维图形的绘图接口,GDI绘图内容包括点、线、面以及一系列绘图笔刷等。这些绘制内容可以输出到屏幕内存或打印机等设备。这种方式是在Windows的设备描述表(DevieeConiexts简称为DC) [52]中进行的。所有的Windows图形程序中都需要申请一个DC并在DC中完成各种绘图操作。
(2) OpenGL采用的是渲染描述表(RenderContext简称RC)绘图。实际上,在OpenGL应用程序中RC与DC的工作方式是相同的。对于GDI,DC存储了各种图形绘图操作的状态变量;而Rc中存储了OpenGL所需的渲染信息如象素格式等。
(3) 象素格式。象素格式决定了子象素颜色的设置与DC和RC相关联的辅助缓冲区象素格式的设置,其内容是OpenGL调用与Windows绘制操作之间的中间转换设置。因此要在Windows环境下实现OpenGL函数功能,就必须先设置象素格式。OpenGL为windows提供了一系列处理象素格式的函数,这些函数是:ehoosePixelFormat,用来比较传过来的象素格式描述和OpenGL支持的象素格式,返回一个最佳匹配的象素格式索引:setPixelFormat,用格式索引来设置DC的象素格式,另外OpenGL窗口风格必须包含wsCLIPCHILDREN和 wsCLIPSIBLINGS类型,否则设置失败。
在VC++6.0可以编写只有一个窗口需要绘制的单文档程序和多个窗口需要绘制的多文档程序。在本文中只需要一个窗口来绘制机械手模型,所以采用单文档模式。基于单文档的OpenGL图形程序框架的基本步骤如下:
(1) 设置编程环境
为了能够使用即OpenGL命令,首先需要在预编译头文件STDAFX.H中添加:#include gl/gl.h 、#include gl/glu.h、#include gl/glaux.h,这样预编译头文件才能提供对OpenGL库和用户库的支持[34}。还应当通过Project菜单下的 “Settings?”选项在Link选项卡中链接以下库:OPENGL32.LIB、GLU32.LIB以及GLAUX.LIB。
(2) 建立程序框架
新建一个基于单文档的工程,利用MFCClasswizard添加消息WMCREATE、 WMDESTROY、WMSIZE和WMTIMER的响应函数。按OpenGL的要求设置好窗口的属性和风格,并设置好显示的象素格式。在PreCreateV石ndow函数中设置视窗口为具有 WSCLIPCHILDREN和wsCUPSIBLINGS风格的窗口,以保证成功地设置像素格式。
在setupPixelFormat函数中设置象素格式:
PIXELFORMATDESCRIPTOR Pfd={sizeof(PixELFoRMATDEseRToR)
//pfd结构的大小 1, //版本号
PFD_DRAW_TO_WINDOW, //支持在窗口中绘图 PFD_SUPPORT_OPENGL, //支持OpenGL PFD_DOUBLEBUFFER, //双缓存模式 PFD_TYPE_RGBA, //RGBA颜色模式 24, //24位颜色深度 0, 0, 0, 0, 0, 0, //忽略颜色位 0, //没有非透明度缓存 0, //忽略移位位 0, //无累加缓存 0, 0, 0, 0, //忽略累加位 32, //32位深度缓存 0, //无模板缓存 0, //无辅助缓存 PFD_MAIN_PLANE, //主层 0, //保留
0, 0, 0 //忽略层,可见性和损毁掩模 };
一般说来上述象素结构,需要用户改动的地方较少,最有可能改动的就是PFD_DOUBLEBUFFER,这个参数的意义是支持双缓存机制,若要用OpenGL实现动画,则必须选择此参数。在结构pfd(PixelFormatDescriptor)定义完之后,调用ChoosepixelFormat确定pfd结构是否存在。若返回值为TRUE,则调用函数setPixelFormat为DC设置象素格式。
(3) 获得Windows设备描述表,然后为其设置象素格式,并与的渲染描述表联系起来。在InitializeOPenoL中关联DC和RC。M_pDC=pDC:获取Windows设备描述表;SetUppixelFormat():为DC设置象素格式;M_hRC :: wglCreateContext( m_pDC->GetsafeHde()),用设置好象素格式的DC来创建OpenGL的M_hRC::wglMakeCurrent(M_pDC->GetsafeHdc(), M_hRC),该函数把RC和DC相连接起来,并且通过该函数,应用程序可以随时连接到一个不同的RC。另外,释放RC也可通过该函数来完成。
(4) 调用OpenGL命令进行图形绘制。在Renderscene函数中进行图形绘制和控制。SwapBuffers(m_pDC->GetSafeHdc()):该函数是Win32API提供的一个用于OpenGL的函数。当OpenGL使用双缓存技术以支持动画显示时,需要使用
该函数将在BackBuffer上绘制的场景交换到FrontBuffer中显示,SwapBuffers()需要与图形操作描述表相联的设备描述表句柄作为参数。在该函数之后可以编写控制过程的函数。
(5) 退出程序,在onDestroy函数中释放DC和RC。wglMakeCurrent(hDC ,NULL):释放绘制描述表;wglDeleteContext(hRC):删除绘制描述表;ReleaseDC(hwin,hDC):释放设备描述表[53]。
完成上述操作后,基于OpenGL的开发平台就创建好了。
5.3 基于WIN Driver的USB驱动开发
在当前较为流行的驱动开发工具有:Windrver、WIN DDK、DRIVER STDIO等,其中Windriver 具有简洁高效、不涉及操作系统底层编程并且具有很好的兼容性的特点[56]。只要掌握一种编程语言、熟悉相应设备的工作机制,任何人都能在短时间内利用Windriver 开发出令人满意的设备驱动。这是因为Windrver 把所有繁杂的底层操作都封装在一个内核模块中,而提供给用户标准的Windriver API 函数来实现硬件访问。如此则将驱动开发的繁杂工作变成了仅仅是调用硬件操作的标准API函数,大大的简化了驱动开发者的工作、加快了开发周期。而且它支持包括Windows系列、Windows CE、Linux和Solars等多种操作系统。同时可以利用多种集成开发环境和编程语言来实现,支持的集成开发环境包括VB、VC、Delphi和C++ Builder等,编程语言包括C、Pascal 和Basic 等[57]。在同类工具中,Windriver 在这方面具有明显的优势。
Windriver 开发设备驱动的一般方法是:在配置并安装好设备之后,用户可以打开Windriver的驱动向导Driver Wizard,首先在向导中配置设备资源,包括I/O 地址范围,如有必要还可以设置内存、寄存器地址范围以及用到的中断口;然后用户可以对设备进行一些测试操作,检验硬件的有效性;设置完成之后,用户可以选择一种特定的开发环境或编程语言,让Windriver根据用户的先前设置生成一个相应开发环境下的设备驱动样本。用户可以直接利用驱动样本中的标准Windriver API 函数来实现对硬件的操作和访问[58]。而API 函数实际上要通过Windrivrer 的内核模块才能实现硬件访问,其结构框架如图一所示。这属于用户模式的驱动程序,一般情况下此种模式便已够用。如果用户模式驱动的性能不能满足实际需要,效率不够高,用户可以在此基础上开发内核模式的驱动(Kernel PlugIn)。内核模式[59]的驱动性能一般要优于用户模式的驱动,只是其开发过程稍微复杂一点。
具体如何利用Windriver开发USB驱动包括以下步骤[60]: (1) 配置并安装设备到 PC 机;
(2) 运行 Driver Wizard,配置设备资源,并完成设备测试;
(3) 选择驱动开发环境,利用 Driver Wizard 产生相应的设备驱动样本; (4) 在相应的开发环境中,移植驱动样本中的 API 函数代码,并编写具体的功能代码,
建立用户模式的驱动程序;
(1) 动态加载 Windriver 的内内核模块; (2) 打包发布驱动程序。
用户级驱动(EXE or DLL)用户驱动代码Windriver 代码用户模式WinDriver API 函数(Windrvr.h)用户所写代码内核级驱动(SYS or VXD)用户内核函数(SYS or VXD)WinDriver内核嵌入WinDriver 内核模块(SYS or VXD)内核模式硬 件 图5-2 Windriver结构框
本系统使用Windriver配合VC++ 6.0开发USB D12的驱动,编译发布后包含“My_USBDriver.inf”和“My_USBDriver.sys”两个文件,其具体操作不再叙述。
5.4 软件系统的设计
通过上述关键设计技术,使用VC++设计了本控制系统软件。软件设计的主题思想是模块化设计,将各需要的模块打包设计,使用dll动态程序链接库的模式调用,其软件结构图如图5-3所示。
从图中可以看出,本软件一共使用了4条线程,分别为USB通讯线程、OPEGL三维模型线程、用于操作界面线程、推理线程,各个线程采用Windows消息队列的形式实现数据的交互,USB线程负责采集数据后交与交与推理线程计算控制电压角度,同时采集的位置信息交与OpenGL线程绘制三维图形,在用户更改参数后,用户界面操作线程将数据交与推理机制或者USB通讯线程。使用Windows线程技术,有效的防止了消息冲突和误处理,提高了数据交互速度。
机器手臂物理模型参数模糊神经网络模型推理线程用户界面线程用户编程文本Windows message pipe编译::POWER_INIT_USB()底层物理硬件通讯事件机制::USB POINT1Read()::USB POINT1Read()::USB POINT2Read()::USB POINT3Read()USB通讯线程excut_Pos()arm1_Pos()arm2_Pos()arm3_Pos()arm4_Pos()arm5_Pos()基于OPENGL机器人模型线程手臂顶点计算顶点着色引擎三维成像锐化、晶格处理显存显示器物理硬件物理硬件
图5-3 软件设计结构框图
通过上述设计出系统软件界面如图5-4所示。
图5-4 系统软件界面图
图5-5 关键操作对话框
该软件的使用方式如下:
(1) 连接六自由度机器手臂电气线缆; (2) 检查各个连接部件是否完好,通电; (3) 插入USB六自由度控制系统;
(4) 打开软件,此时软件将自动检测是否有设备连接,如果设备连接良好,则在会在连接状态上显示“设备已连接”,如果设备断线,则显示“设备离线”,此时需要检查线路后重新连接USB电缆,然后点击“刷新设备连接”;
(5) 点击“操作控制区”中的“设备归零位”,此时手臂的各个关节将运动起来,自动找到设备0点;
(6) 编写控制程序
a) 在“程序控制”界面中,选择“新建”控制文件。此时将有文本框将显示“000 START”、“空行”、“001 END”;
b) 在基本运动中选取基本控制,如选取“S轴旋转”,将出现图5-5对话框,旋转“左旋”、“0-60”度、中速后确定,文本控制将显示“000 START”、“001 L1B-L-ZS60”、“空行”、“002 END”;
c) 如此选取其他轴的运动,和运动之间穿插上述完成后执行下面程序指令、延时执行以下指令等,具体指令表见表5-1所示;
(8) 点击“运行”、或“演示”按钮。
(9) 同时观察三维窗口中或机械手臂的运行状态。
表5-1 六自由度机器手臂伪码指令表
指令名称 1号关节旋转 2号关节旋转 3号关节旋转 4号关节旋转 5号关节旋转 6号关节抓取 左旋或+旋 左旋或-旋 下笔旋转 当前转动范围 原点转动范围 爪抓取力度 爪松开 开始 结束 延时 等待执行 跳转 伪码 L1B1 L2B L3B L4B L5B L6B L R LB NS ZS GN RN START END T(n)2 W JP(n)2
正在阅读:
基于OpenGL三维软件的设计12-29
重庆市西南师大附中—度高一物理上期期中考试试题人教版必修一11-17
亳州市2014年考试录用公务员职位表06-09
【完整版】2022-2025年中国香槟行业需求变化趋势及新的商业机遇04-11
求稳怕乱,整改措施08-15
福州市区及闽侯县公交线路一览表01-12
CM-葡聚糖凝胶固定化脂肪酶的研究07-26
毕业设计--基于PLC的桥式起重机的设计01-05
车工(数控)中级操作试卷1103-07
高中体育教师招聘考试试卷集锦10-07
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 三维
- 基于
- OpenGL
- 设计
- 软件
- 七年级语文上学期期末考试试题新人教版(2)
- 教育现代化实施方案
- 评职称
- 赏识教育的六大原则
- 前山小学父亲节信息
- 发动机5A-FE - 图文
- 驳宋立强磁感线真实存在说
- 最新七年级上册复习提纲(结合课本) 冀教版
- 南京港龙潭集装箱有限公司双文明建设目标管理图
- 如何进一步深化高校后勤改革、提高后勤服务质量
- 于都城市综合体建设项目12.13 - 图文
- 考研政治史纲中各个时期土地问题汇总
- 毕业设计(论文)模板(1)
- 福建省太姥山中学中考数学第一轮复习 第26课时 尺规作图
- 厦门市人民政府办公厅关于开展第四届政府系统网站绩效评估活动的通知
- 2011职称英语强化班新增教材讲义
- 以学习促反思 以反思促成长
- 2014年北京市密云县初三第二次化学综合检测 - 图文
- 2018中考物理电路与电流专题复习练习题
- 九年级数学上册 21·1教案 人教新课标版 - 图文