第23卷 第3期计 算 机 仿 真2006年3月  文章编号:1006-9348(2006)03-0172-05
Delph i中O penG L三维仿真开发环境设计及应用
孙振海,陈利,张庆明
(北京理工大学爆炸灾害预防、控制国家重点实验室,北京100081)
摘要:主要对W indows环境中使用Del phi及OpenG L三维仿真开发环境建立的方法进行了研究。首先介绍了OpenG L图形
库的功能、特点以及OpenG L在W in32环境中的运行机制;然后详细阐述了在W indows环境下使用Del phi及OpenG L联合编
程,建立三维仿真开发环境的实现过程;并将这一仿真开发环境在战斗部虚拟测试系统仿真软件中进行了综合应用。用
OpenG L图形库进行三维仿真,真实感强,因而具有较高的使用价值和良好的应用前景。
关键词:开发环境;三维仿真;设计;开放图形库
中图分类号:TP391.41  文献标识码:A
D esi gn and Appli ca ti on of3D S i m ul a ti on D evelop m en t
Env i ronm en t Ba sed on O penGL by Usi n g D elph i
S UN Zhen-hai,CHEN L i,ZHANG Q ing-m ing
(State Key Lab of Preventi on and Contr ol of Exp l osi on D isasters,Beijing I nstitute of Technol ogy,Beijing,100081,China) ABSTRACT:This paper focuses on the research of how t o create a3D si m ulati on devel opment envir on ment,using
Del phi and OpenG L t o W indows System.The functi on and characteristic of OpenG L graphics class and the run mech2
anis m of OpenG L in W in32envir on ment are intr oduced at first.The app r oaches of how t o create a3D si m ulati on de2
vel opment envir onment using OpenG L and Del phi t o p r ogra m are discussed in detail.And this3D si m ulati on devel op2
ment envir on ment is app lied t o designing s ome visualizati on si m ulati on s oft w are ofW arhead virtual test syste m.It has
a str ong3D si m ulati on with OpenG L graphics class,theref ore has p referable value t o use and good foregr ound f or ap2
p licati on.
KE YWO RD S:Devel opment envir on ment;3D si m ulati on;Design;OpenG L
1 引言
可视化三维仿真技术是数值仿真技术与计算机图形学最新成果的结合。它在数值仿真的基础上,以图形和动画来表达数值仿真的过程或结果。尤其是三维模型的实时真实感动画显示技术,已广泛应用于模拟训练、虚拟现实以及其他实时动态仿真系统的图形显示,因而成为近年来研究的热点之一。
OpenG L(Open Graphics L ibrary)是由SGI开发的一套独立于操作系统和硬件环境的三维图形软件库。由于其开放性和高度的可重用性,现已成为3D图形软件接口的工业标准。OpenG L的优点是作为一个独立的工作平台,独立于硬件设备、窗口系统和操作系统,用它编写的软件可以在各个操作系统之间方便地移植。M icr os oft公司已经将OpenG L图形库连接到了W indows NT/2000,W in98/M E之
上。OpenG L 已经在计算机动画、仿真、虚拟现实等领域得到了广泛应用。
Del phi是著名的Borland公司开发的可视化软件开发工具。它具有简单、高效、功能强大的特点,一直是程序员至爱的编程工具。Del phi在W indows环境下的快速应用开发能力已在业界形成共识。将Del phi与OpenG L两者完美的结合在一起,就可以在W indows环境下开发出高品质的三维仿真应用程序。
2 W i n32下O penGL的运行机制
作为图形硬件的软件接口,OpenG L由几百条指令或函数组成。OpenG L提供了建模、坐标变换、着、光照、平滑等二维和三维图形功能以及纹理映射、NURBS曲线、带A l pha 通道的融合等高级特征,并且能够生成三维场景,绘制三维物体。OpenG L的作用机制是客户(Client)服务器(Server)机制,由客户(用OpenG L绘制图形的应用程序)向服务器(OpenG L内核)发送OpenG L命令,服务器则负责解释这些命令。在多数情况下,客户和服务器在同一机器上运行,当然,也可以在网络环境下使用,所以OpenG L具有网络透明
收稿日期:2004-12-10
性,与在W in32下的图形设备接口(G D I)把图形函数库封装在动态的连接库G D I32.DLL内一样,Open
G L的图形库也被封装在一个动态连接库opengl32.dll内。从客户应用程序发布的对OpenG L函数的调用首先被opengl32.dll处理,然后传送给服务器后,被W insrv.dll进一步处理,再传给W in32设备驱动接口(DD I),最后把处理过的图形命令送给视频显示驱动程序。图1显示了整个处理过程。
图1 O penGL在W i n dows环境下的运行机制
3 D elph i下O penGL三维仿真开发环境的建立OpenG L是一个跨平台的三维图形软件库,它的跨平台能力来自其窗口的独立性,即OpenG L本身不提供窗口管理,这一任务是由具体的平台系统来完成的。因此,要在Del2 phi/W indows环境下使用OpenG L建立三维仿真开发环境,也必须遵循固定的规范,先把W indows的窗口系统与OpenG L 关联起来,然后才能然后利用OpenG L提供的函数绘制和处理3D图形。
3.1 初始化窗口DC(D ev i ce Con texts)
首先,在要进行绘图的窗口中添加对OpenG L单元(OpenG L.pas)的引用,使得应用程序能够调用OpenG L的函数库;其次,指定窗口DC的象素格式并创建与该DC相联的RC(Render Context,OpenG L着描述表,它包含OpenG L和窗口系统关联的各种信息),使绘制窗口的DC支持Open2 G L。初始化代码如下:
p r ocedure init D C;
var
 DC:HDC;
begin
 DC:=Get D C(Handle);//取窗口Handle的DC
 PreparePixelFor mat(DC);//调整好DC的象素格式,详见后面说明
end;
这个工作具体分三步:
1)指定象素格式应有的特性
帧缓冲器是OpenG L所能使用到的颜缓冲器、深度缓冲器、模板缓冲器和累积缓冲器的总和。为了有效使用这些缓冲器,必须指定OpenG L绘图窗口的象素格式。因此,当在W indows系统下初始化OpenG L绘图时,必须首先设置象素格式,使其符合OpenG L对象素格式的需要。象素格式包含OpenG L设备绘图界面的属性,如颜模式(RG BA或者颜索引)、颜位数、缓存类型(单缓存还是
双缓存)、深度缓存和模板缓存位数等。在W in32下使用结构PixelFor mat D e2 scri p t or来描述象素格式,该格式共包含26个参数信息(详细参数信息参见Del phi帮助文件)。
2)出系统支持的最近格式
设置完结构变量PixelFor mat D escri p t or的成员的值以后,需要以此变量为参数调用W indows AP I函数ChoosePixelFor2 mat(),获得一个最匹配的像素格式的格式索引号。其声明如下:
functi on ChoosePixelFor mat(DC:HDC;p2:PPixelFor mat2 Descri p t or):I nteger;
参数DC表示所选择的象素格式设备描述表的句柄,参数p2表示指向结构PixelFor mat D escri p t or的指针。如果函数调用失败则返回0,调用成功则返回象素格式索引号。
3)指定第二步中的格式为DC的象素格式。
利用AP I函数SetPixelFor mat(),根据第二步获得的像素格式索引号,将其设置为当前像素格式。其声明如下: functi on SetPixelFor mat(DC:HDC;PixelFor mat:I nteger; For mat D ef:PPixelFor mat D escri p t or):BOOL;
其中参数DC表示设备描述表句柄,参数PixelFor mat表示象素格式索引号,参数For mat D ef表示指向结构PixelFor2 mat D escri p t or的指针。函数调用失败则返回F ALSE,调用成功则返回TRU E。
完整的设置代码如下:
p r ocedure T MainFor m.PreparePixelFor mat(var DevC: HDC);
var
 hHeap:THandle;
 nCol ors,i:I nteger;
 PF D:TPixelFor mat D escri p t or;
 ChosenPixelFor mat:I nteger;
Begin
//第一步:指定象素格式应有的特性
Fill Char(PF D,Size Of(TPixelFor mat D escri p t or),0);//清零,以免干扰
with PF D do
begin
 nSize:=Size Of(TPixelFor mat D escri p t or);//指定PixelFor mat D escri p t or结构的大小
 n Versi on:=1;//指定PixelFor mat D escri p t or的版本,这个值必须为1
 d wFlags:=PF D DRAW T O W I N DOW or//必需的,如果要画在内存中填M E MORY
  PF D S UPP ORT OPE NG L or//必需的,要求支持OpenG L
  PF D DOUBLE BUFFER;//指定要用双缓冲,这可
以改善动画的性能
 iPixelType:=PF D TYPE RG BA;//象素格式要求用RedGreen B lueA l pha格式
cCol or B its:=16;//16位颜
c Dep th B its:=32;//32位深度缓冲
i L ayerType:=PF D MA I N P LANE;//在W in32中必须用此值
end;
//第二步:选取系统支持的最接近的象素格式
ChosenPixelFor mat:=ChoosePixelFor mat(DevC,@ PF D);
if ChosenPixelFor mat=0then
 Raise Excep ti on.Create(’C hoosePixelFor mat failed!’);
//第三步:指定为DC的象素格式
 SetPixelFor mat(DevC,ChosenPixelFor mat,@PF D);
end;
然后建立与这个DC相连的RC。
RC:HG LRC;
RC:=wgl Creat Context(DC);//创建适合该DC的RC
wgl M akeCurrent(DC,RC);//指定该DC和RC为当前使用
3.2 初始化O penGL视见环境
初始化窗口DC以后,还要对OpenG L视见环境进行必要的设置,才能在二维屏幕上显示出立体的三维图形。主要工作包括清除背景、定义视点、光源、颜材质、投影模式等。
具体代码如下:
p r ocedure initG L;
begin
 gl Clear(G L COLOR BUFFER B I T or G L DEPTH BUFFER B I T);//清屏命令,清除颜缓冲和深度缓冲 gl M atrix Mode(G L PROJECTI O N);//指定以后的矩阵操作为投影矩阵堆栈
 gl L oad I dentity;//把当前矩阵变为单位矩阵
 glEnable(G L L I GHTI N G);//启用光源
 glEnable(G L L I GHT0);//启用第0个光源
 gl O rtho(-1,1,-1,1,-1,50);//创建一个正投影矩阵,把当前矩阵乘以该正投影矩阵,其结果作为当前矩阵
 gl M atrix Mode(G L MODE LV I E W);//指定以后的矩阵操作为模型矩阵堆栈
 gl L oad I dentity;//把当前矩阵变为单位矩阵
 glEnable(G L DEPTH TEST);//启用深度缓存
 glEnable(G L COLOR MATER I A L);//启动颜材质
 glShade Model(G L S MOOT H);//填充模式为使用光滑着
 glu Look A t(2,4,6,0,0,0,0,1,0);//指定视点
 S wapBuffers(DC);//当前设备的前台缓存和后台缓存交换
end;
以上过程(p r ocedure)一般在绘图窗体的onCreate事件中调用。
3.3 设置视口(V i ewport)
视口是在屏幕窗口内定义的一个矩形,视景体投影后的图形就在视口内显示。缺省的视口是和窗体一样大。为了使图形不因窗口的大小发生变化而变形,需要在窗体大小改变时重新定义视口大小和投影变换矩阵。
可在窗体的onResize事件中添加如下代码:
 inherited;//继承默认的消息处理程序
 gl V ie wport(1,1,Client W idth,Client Height);//定义视口的大小
 gl M atrix Mode(G L PROJECTI O N);//指定以后的矩阵操作为投影矩阵堆栈
 gl L oad I dentity;//把当前矩阵变为单位矩阵
delphi app gluPers pective(45.0,Client W idth/Client Height,1.0, 100.0);//定义透视投影
 gl M atrix Mode(G L MODE LV I E W);//指定以后的矩阵操作为模型矩阵堆栈
3.4 绘制仿真动画
计算机动画是用程序或工具生成一系列的静态画面,然后通过画面的连续播放来反映对象的运动变化
过程的技术。计算机动画中的驱动要素是时间,通过足够快的速度显示一系列单个帧以生成活动的感觉。OpenG L支持双缓存技术(Double Buffer),该技术提供了一种生成平滑动画的机制。程序把帧缓存看成是两个视频缓存,在任意时刻只有两者中的一个内容能被显示出来。当前可见视频缓存称为前台视频缓存,不可见的正在画的视频缓存称为后台视频缓存。当后台视频缓存中的内容被要求显示时,OpenG L就会将它拷贝至前台视频缓存。显示硬件则不断地读可见视频缓存中的内容,把结果显示在屏幕上。当完整的画面在后台视频缓存中画出后就调用S wapBuffers()函数,使其成为可见的视频缓存。在交换前后台视频缓存中的内容之前,应调用同步操作函数glFlush()或glFinish()。
OpenG L提供了点、线、面三种几何图元的绘制功能,由于物体的拓扑结构是由点、线、面构成,因此,OpenG L就是借助已有的绘制点线面的方法,再辅以适当的变换,就能够绘制出任何复杂的三维场景。建立了场景的几何形体后,还需要给各个对象或对象内部的基元进行材质定义、光照、发线或多边形反走样、光顺、透明与融合处理、文理映射、雾化等一系列图像处理,以实现所期望的真实感。
在主窗体中添加RenderScene过程,在此过程中编写OpenG L的绘图语句,所有的绘图工作都可以通过它来完成。然后在窗体的Paint事件中调用RenderScene过程就可以绘
制出三维图形了。
3.5 释放资源
最后在程序结束时必须将一些环境变量释放,因此需要断开记录,并销毁RC及DC。可以在窗口的Destr oy事件中添加下面的代码:
wgl M akeCurrent(0,0);//断开当前使用的DC和RC
 wgl D eleteContext(RC);//删除RC
Release DC(Handle,DC);//释放DC
4 三维仿真开发环境的应用
下面结合战斗部虚拟测试系统仿真软件简要说明如何在Del phi中应用上述OpenG L三维仿真开发环境实现战斗部模型的三维再现。
战斗部是导弹的有效载荷,是直接完成预定战斗任务的分系统。对战斗部来说,无论是方案论证阶段、技术设计阶段还是定型阶段,都需要测试其各项参数进行性能鉴定。传统的战斗部性能鉴定方法主要采用理论计算、数值模拟和地面爆炸实验方法。计算机性能及其相关技术的发展给试验测试技术提供了新手段。虚拟测试技术是综合先进测试技术及虚拟仿真技术、多媒体仿真技术、分布交互仿真技术、智能仿真技术的一种新兴技术。战斗部虚拟测试系统就是基于虚拟测试技术研发的一个仿真软件。
在战斗部虚拟测试系统中,战斗部模型的构建与三维再现是必不可少的组成部分。利用三维模型来检验、评价战斗部的结构、性能设计,无疑是最方便、最直观和最生动的。通过模拟战斗部发射、飞行、爆炸的实际过程,根据视觉、运动感觉和时间变化,来检验评价战斗部的设计以及战斗部的杀伤效果和发现设计中的不足之处,以便设计者能及时更正,使设计更加完美。
首先启动Del phi,新建一个App licati on,命名为m issile,然后按照上述步骤初始化OpenG L,设置OpenG L与W indows 图形接口,建立三维仿真开发环境。
战斗部虚拟测试系统仿真软件以ANSYS公司的LS-DY NA作为仿真求解器,仿真结果可得到战斗部爆炸瞬间各个部件(重点是破片)的受力情况及运动参数,可以得到每个破片的初速度。LS-DY NA的仿真结果数据库种类很多,经过分析得知,AVSF LT文件存储了模型节点单元信息,节点随时间变化的位移、速度、加速度等状态信息,并可以通过.k文件的设置,控制文件包含的状态输出量。因此,战斗部虚拟测试系统采用AVSF LT文件作为与dyna仿真求解器的接口,在虚拟测试系统中对该文件进行读取、分析,从单纯的节点单元信息中提取出战斗部各个原始部件及其外表面,在虚拟测试系统中实现战斗部模型的动态三维重建。
AVSF LT文件中的数据包括战斗部模型各个结点在飞行过程中的三维坐标(x,y,z)、速度、加速度、受力及塑性应变数据以及模型每个有限元分析单元的结点组成信息。有限元方法划分出的网格单元有多种
情况。对于战斗部三维模型来说,通常采用的是s olid164单元类型。其中亦包括四面体、五面体和六面体三种情况,均看作由8节点构成,即认为对于四面体和五面体两种情况属于六面体单元的退化情况,在AVSF LT文件中仍然以8个节点的形式输出,只是最后两个(对应四面体)或一个(对应五面体)节点重复列出。其单元结构示意图如图2所示
图2 六面体单元结构示意图
程序首先分析读取文件中各个单元所包含的结点的三维坐标,然后用OpenG L中的gl B egin(G L QUADS)、gl V er2 tex3fv(@N i)、glEnd()命令绘制出单元的六个表面(其中N i 为保存单元结点N i坐标的三维数组)。
除了绘制出战斗部模型的三维形状以外,还要根据有限元软件LS-DY NA计算的结果绘制出模型表面或任一截面某一物理参量(如内应力)的等值域图、等值线图等,以可视化的手段来反映计算结果,不仅形象直观,而且容易发现计算中的错误。战斗部模型绘制等值域图的基本思路是先建立内应力等物理量值的极值与颜极值的对应关系,中间值采用内插的方法将应力值由小到大分成若干等级,分别用不同的颜表示。在绘制每个单元时,先判断量值所在的区间,得到对应的颜值,然后在绘制单元前调用gl Col or3f()函数设定每个单元的颜。另外OpenG L本身具有颜均匀过渡的能力,使得等值域图的绘制更加方便。
战斗部模型在三维场景中的运动画面可利用定时器控制每隔100m s绘制一帧来实现。在每帧中战斗部模型的方位和姿态可使用OpenG L中的平移命令glTranslate()和旋转命令gl Rotate()操纵,通过矩阵变换来实现。
图3是战斗部虚拟测试系统仿真软件的最终显示画面。
5 结束语
计算机图形处理和仿真在各行各业不断地得到广泛的应用。通过本文的叙述可以看出利用在Del phi中建立的OpenG L三维仿真开发环境,不但可以比较方便地开发出立体感强,结果清晰,效果逼真的三维仿真程序,而且简化了编写程序的过程,提高了开发效率和程序的可靠性。本文所阐述的方法,已经在实际的战斗部虚拟测试系统中得到应用,图像生动、逼真、流畅,仿真效果良好。同时,它也适用于其他需要实现显示三维动态图形的应用程序中,例如产品的三
图3 战斗部模型的三维仿真结果维动态演示等,具有一定的实用价值。参考文献:
[1] 费广正.可视化OpenG L程序设计[M].北京:清华大学出版
社.2001-3.
[2] 白燕斌,史惠康.OpenG L三维图形库编程指南[M].北京:机
械工业出版社.1998-8.
[3] (美)Steve Teixeira,Xavier Pacheco,任旭钧,王永波译.Del phi
5开发人员指南[M].北京:机械工业出版社.2000-7.
[4] 康凤举.现代仿真技术与应用[M].西安:西安电子科技大学
出版社.2001-9.
[5] 向世民.OpenG L编程实例[M].北京:电子工业出版社,1999.
[6]
 郭云芳,欧阳玲,刘继美.计算机仿真技术[M].北京:北京航
空航天工业出版社.1991.
[作者简介]
孙振海(1978.3-),男(汉族),山东人,北京理工
大学硕士研究生,研究方向为智能系统与专家系统;
陈 利(1969.8-),女(汉族),湖南人,北京理工
大学副教授,研究方向为武器系统仿真;
张庆明(1963.10-),男,汉族,湖南人,北京理工大学教授,博导,研究方向为爆炸与毁伤过程的虚拟与仿真技术。
(上接第122页)
5 结论与展望
基于协作的规划模型简单有效,不仅能够提高单个智能体的反应速度,还可以提高整个多智能体系统的运行效率,运用到RoboCup中,可以较大地提高球队的进攻能力,增加射门成功率。通过对经常出
现的状态提前规划,可以提高单个智能体和整个球队的反映速度,对一些常用的进攻防守模型提前规划,可以提高整个球队的进攻防守水平。
多智能体系统是一个复杂的,动态的,实时的环境,其状态具有不确定性,在提前规划的基础上还应进行在线的实时规划。在本文中,状态与规划是一一映射的关系,没有可选性,下一步工作还应为一个状态设定多个规划,通过学习来对规划进行最优选择,这种基于学习的规划能够加强规划的灵活性。
参考文献:
[1] Peter St one and Manuela.Towards collaborative and Adversial
Learning A Case Study in Robotic Soccer[C].PH.  D.Thesis.
Carnegie Mell on University,C MU-CS-98-187,1998. [2] E H Durfee and V R Lesser.Partial gl obal p lanning:A coordina2
ti on fra me work for distributed hypothesis for mati on[J].I EEE
Transacti ons on Syste m,Man,and Cybernetics,Sep
te mber1991,21(5):1167-1183.
[3] K Decker,V Lesser.Designing a fam ily of coordinati on algorithm s
[C].Pr oceedings of the First I nternati onal Conference on Multia2
gent Syste m s,73~80San Francisco,CA,June1995.
[4] E H Durfee,V Lesser.Negotiating task decompositi on and app li2
cati on using partial gl obal p lanning[J].D istributed A rtificial I ntel2
ligence:1989,2:229-244.
[5] 钟碧良.张祺.杨宜民.足球机器人多智能体协作策略[J].
计算机工程与应用2003,(24).
[6] Huang H Bui,Svetha Venkatesh,and Dor ota Kier onska.A Fra me2
work for Coordinati on and Learning a mong Tea m of Agents[M].
Morgan Kauf mann,1998.
[作者简介]
谢 雅(1982-),女(汉族),湖南省常德市人,硕
士生,主要研究方向为计算机应用、计算机网络和多
智能体系统;
彭 军(1967-),女(汉族),湖南省长沙市人,副
教授,主要研究方向为多智能体系统和通信与信息系统;
吴 敏(1963-),男(汉族),广东省化州市人,教授,博导,主要研究方向为先进控制和智能系统。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。