《电子技术应用》
您所在的位置:首页 > 其他 > 设计应用 > 一种虚拟现实建模的新方法
一种虚拟现实建模的新方法
邵延华,吴 斌,张红英,楚红雨,方艳红
摘要: 介绍了OpenGL和Matlab2009a各自的特点,在结合各自特点基础上,建立了基于二者的虚拟现实三维建模开发平台;以建立的虚拟现实建模开发平台为例,对比已有的使用Matlab外部接口的方法,证明了基于OpenGL和Matlab开发方法的优越性和有效性。
Abstract:
Key words :

  摘 要:介绍了OpenGL和Matlab2009a各自的特点,在结合各自特点基础上,建立了基于二者的虚拟现实三维建模开发平台;以建立的虚拟现实建模开发平台为例,对比已有的使用Matlab外部接口的方法,证明了基于OpenGL和Matlab开发方法的优越性和有效性。
  关键词:OpenGL;Matlab;三维建模;虚拟现实

   VR(Virtual Reality)技术的主要目标之一是允许用户以尽可能自然的方式与虚拟世界直接交互。可以简明定义:虚拟现实是计算机生成的给人多种感官刺激的虚拟世界(环境),是一种高级的人机交互系统[1]。近年来,虚拟现实的概念已经深入人心,因此,作为虚拟现实技术的重要环节——三维物体的建模技术成了近几年的研究热点。
  但是虚拟现实中物体对象的绘制和运动,涉及到大量的数学运算,特别是矩阵运算。作为图形硬件的软件开发接口OpenGL已经成为事实的工业标准。在选用OpenGL的基础上,现有的建模方法要么单独利用高级语言;要么需要复杂的设置利用Matlab和其他高级语言的接口进行混合编程;要么算法方面利用Matlab进行仿真,实际构建虚拟环境时再用其他高级语言另起炉灶构建平台,增加了开发的复杂度[2-4]。本文提出一种新的基于OpenGL和Matlab进行建模的方法,它充分利用了Matlab的高速算法验证优势和OpenGL的三维建模优势。在本文创作时,国内还几乎没有介绍相似方法的文献公开发表。本文提出的开发方法仅在2009年3月6日发布的最新版本Matlab2009a或后续版本平台上可以实现。
1 Matlab、OpenGL和Tao介绍
  本文实现方法选用Matlab和Tao类库中的OpenGL实现作为系统实现的软件平台。
1.1  OpenGL简介
  OpenGL是由美国SGI公司推出的开放式图形硬件的软件开发接口(目前由Khronos小组负责),OpenGL独立于窗口系统和操作系统,在各种平台之间方便移植,能灵活方便地实现二维和三维的高级图形技术。它提供了建模、变换、光照处理、色彩处理、动画以及其他更先进的功能,例如纹理映射、运动模糊和雾化效果等,为实现逼真的三维绘制效果及建立交互式三维场景奠定了良好的基础。OpenGL以其高性能的交互式三维图形建模能力和易于编程开发等优越性,已经成为一种事实高性能图形和交互性场景处理的工业标准,是从事三维图形开发工作的必备工具[4]。
  OpenGL必须依赖于一定的软件开发环境才能进行软件开发,目前几乎所有的应用程序开发工具都支持OpenGL的集成,但是绝大部分开发人员都出于执行效率考虑而采用C/C++等语言平台作为开发工具。
1.2  Matlab简介
  Matlab由美国MathWorks开发推出的,作为科学计算应用软件的突出代表,已发展成为应用学科计算机辅助分析、设计、仿真及教学不可缺少的基础软件。在Matlab环境中进行动态仿真,用户可借助Simulink软件包方Matlab作为工程计算及数据分析软件,它的应用范围涵盖了当今所有的工业、电子、医疗、建筑等各个领域。通过Matlab可以在短时内完成复杂的科研难题,能迅速地测试构思,综合评测系统性能,并能快速设计出更多解决方案确保更高的技术要求。Matlab还有出色的图形处理功能,三维仿真形象逼真,是优秀的动态仿真软件[5]。
1.3 Tao类库简介
  Tao框架类库是为多媒体开发而产生的一个跨平台的类库,可以运行在Windows和Linux平台。它基于著名的.NET和Mono项目。其最新版本是2.1.0,内部集成了Tao.OpenGl 2.1.0.12、Tao.Platform.Windows 1.0.0.5、Tao.FreeGlut 2.4.0.2等重要的类库,为本文开发方法的实现提供了基础。
2  基于OpenGL和Matlab的建模过程
2.1  编程环境设置

  传统上采用Visual C++结合三维图形开发接口OpenGL作为软件开发平台,设置包括添加OpenGL的4个静态库文件gluax.lib、glu32.lib、glut32.lib、opengl32.lib;然后在视图类的cpp文件中加入以上静态库的头文件: gl\gl.h、gl\glaux.h、gl\glut.h。由于微软提供的OpenGL版本较低,可能有部分功能无法使用,还需要手动升级库文件,其设置比较繁琐。下面详细分析在Matlab2009a平台上设置Tao.OpenGl并进行开发的过程。
  在当前路径中建立TaoLight文件夹,并将Tao.OpenGl.dll和Tao.Platform.Windows.dll复制到该文件夹中;建立Functions文件夹,放置配置文件及自编的函数。为了提高程序的可移植性,把程序集的动态链接库放入自建文件夹。更一般的方法是到http://www.taoframework.com/下载Tao Framework 2.1.0并安装。
(1)建立LoadTaoOpenGl的M文件,写入以下内容[6]:
  % 设置TAO OpenGL  程序集%
  functionname='LoadTaoOpenGl.m';
  functiondir=which(functionname);
  %得到当前目录%
  functiondir=functiondir(1:end-length(functionname));
  disp('Ignore next 2 warnings (bug in R2009a)');
  NET.addAssembly([functiondir '/TaoLight/Tao.OpenGl.dll']);
  NET.addAssembly([functiondir '/TaoLight/Tao.Platform.Windows.dll']);
  disp('Tao OpenGL .NET assemblies loaded');
  % 添加函数和数据文件路径%
  addpath([functiondir '/Functions']);
  addpath([functiondir '/ExampleData']);
  disp('function and example data Path added');
  (2)在Functions文件夹中编制OpenGL_Window函数,进行一些环境设置,例如完成窗口绑定及鼠标操作的映射设置。绑定鼠标移动操作的代码如下:
  addlistener(simpleOpenGlControl1,'MouseMove',eval(['@(src,evnt)OpenGL_Window(''MouseMove'',src,evnt,' str_id ')']))主要参考Tao类库的说明文档、微软的MSDN和Matlab的用户手册,这里不再详述。
  (3)在Functions文件夹中编制OpenGL_Matlab_Figure函数,除进行相关的图形控制设置外还进行以下操作:
  添加必须的 Windows 程序集:
  NET.addAssembly('System');
  NET.addAssembly('System.Windows.Forms');
  创建一个新的窗口(.NET window):
  Form1=System.Windows.Forms.Form;
  Form1.Width=data.Width;
  Form1.Height=data.Height;   
  Form1.Visible=false;
  Form1.Text='SWUST-邵延华';
                                              //所创建窗体的标题条
  为.NET窗口创建一个OpenGL 控制集:
  simpleOpenGlControl1 = Tao.Platform.Windows.SimpleOpenGlControl;
  设置OpenGL 控制集simpleOpenGlControl1的参数:
  simpleOpenGlControl1.AccumBits = 0;
                                                    //accumulation buffer depth
  simpleOpenGlControl1.AutoCheckErrors = false;
  simpleOpenGlControl1.AutoFinish = false;
  simpleOpenGlControl1.AutoMakeCurrent = false;
  simpleOpenGlControl1.AutoSwapBuffers = false;
  simpleOpenGlControl1.BackColor = System.Drawing.Color.Black;
  simpleOpenGlControl1.ColorBits = 32;
                                                 //color buffer depth
  simpleOpenGlControl1.DepthBits = 24;
                                                //depth buffer (Z-buffer) depth
  simpleOpenGlControl1.Location = System.Drawing.Point(1, 1);
  simpleOpenGlControl1.Name = 'simpleOpenGlControl1';
  the height and width of the control:
  simpleOpenGlControl1.Size = System.Drawing.Size(Form1.Width-17, Form1.Height-38);
  simpleOpenGlControl1.StencilBits = 0;      //stencil buffer
  the tab order of the control within its container :
  simpleOpenGlControl1.TabIndex = 0;
  初始化控制集:
  simpleOpenGlControl1.InitializeContexts();
  添加控制集到图形实例:
  Form1.Controls.Add(simpleOpenGlControl1);
  等待初始化:
  pause(1)
  为使用Tao.Opengl类库的Opengl函数,载入所需要的程序集:
  import Tao.OpenGl.*
2.2  三维物体显示过程
  将所创建的虚拟环境中的三维物体在计算机屏幕上显示出来是一个从三维空间到二维平面的投影过程,一般都要经历下面一系列步骤[3]:视点变换(Viewing Transformation),即调整视点的位置;模型变换(Modeling Transformation),即对模型进行旋转、平移和缩放;投影变换(Projection Transformation),即把三维模型投影到二维屏幕上的过程;视口变换(Viewport Transformation),即规定了屏幕上显示场景的位置和尺寸。
  通过上面的几个步骤,一个三维空间里的物体就可以在二维的电脑屏幕上正确显示了。三维物体的显示过程如图1所示。

 

2.3  快速绘制技术
  在计算机中模拟复杂场景动作时,会降低渲染速度,因而造成画面的不连续。原因有很多,本文系统的延时主要是当仿真机器人运动、碰撞和其他场景更新时,会出现处理延迟。这是因为机器人运动的过程中,每一个关节都涉及局部坐标和全局坐标的相互转化,需要引入大量的矩阵运算。此情况下,使用有关的快速绘制方法以帮助提高渲染速度显得尤为重要。
  目前复杂场景快速绘制主要有下面三大类方法:可见性判断、层次细节LOD(Level of Detail)和基于图像的绘制。
  不可见面的剔除是根据场景中几何对象的空间关系,对物体之间的遮挡关系进行估计。可以简单分为三大类:背面剔除(Back-Face Culling)、视域剔除(View Frustum Culling)和遮挡剔除(Occlusion Culling),这个过程在真正的消隐处理之前,对不可见面的大量删除省去了很多后期处理时间。避免绘制无用的、对于视点而言的不可见区域。本文使用可见性判断来加速绘制场景。
2.4  程序实例
  通过上文所述设置,编写M文件调用OpenGL相关库函数,M文件主要功能有:设置背景色、设置颜色和深度缓存、设置深度测试、读取图像、启用纹理和光照、绘制三维模型。通过图1所示变换把现实世界中的三维物体以二维的平面形式显示在计算机屏幕上,绘制出逼真的三维实体模型,如图2所示。其操作和其他高级语言平台利用OpenGL建模基本一致,在此不再详述。


  三维建模对提高虚拟环境的真实感有至关重要的作用,是构建虚拟环境最重要环节。本文所提出的一种新的三维建模方法,可有效地应用于虚拟现实环境的构建和计算机图形学算法的验证,基于Matlab和OpenGL,通过运用快速绘制算法,建立三维仿真场景。仿真结果表明,本方法能充分利用Matlab高速数学运算、便利图形场景绘制和事实的工业标准OpenGL,无论从降低开发设置的难度上还是对新算法开发验证效率上都增强了三维建模的效力。所以,对三维建模而言,本方法极具应用价值。
参考文献
[1] 石教英.虚拟现实基础及实用算法[M].北京:科学出版社,2002.
[2] 石琼,沈春林,谭皓.基于OpenGL的三维建模实现方法[J].计算机工程与应用, 2004,40(18) :122-124.
[3] 翟雪琴,郝矿荣,曹自洋.基于OpenGL的工业机器人动力学仿真的研究[J].机床与液压,200,41(17):14-15.
[4] 徐波译.OpenGL编程指南(第六版)[M].北京:机械工业出版社,2008.
[5] MATLAB builder NE user’s guide version 3.1 (Release 2009a).The MathWorks, Inc.2009:44-47.

此内容为AET网站原创,未经授权禁止转载。