摘要:GLStudio是一个虚拟仪表开发软件。本文介绍了GLStudio的开发环境、建模方法、与VC混合编程的方法,并将其应用到航空发动机训练仿真中,开发了一套发动机控制显示面板。
关键词:仿真;航空发动机;GLStudio
中图分类号:TP391
来越困难。随着计算机技术的突飞猛进,虚拟现实技术逐步走向成熟,军事发达国家都十分重视基于虚拟现实的仿真训练系统的建设,利用虚拟现实技术进行训练系统的开发,可以大大提高训练的效果,摆脱实装的制约。在训练实践中,我军使用虚拟仿真训练训练系统后,训练效率比传统方式提高10~20倍,而且可以实现故障重现、进行特情处理训练,使训练效果又上了一个新台阶。利用虚拟现实技术实现航空发动机机务训练,需要对飞机座舱中发动机的中大量的仪器面板的行为,如开关的操作、指针的摆动、指示灯的闪烁、旋钮的转动、油门杆的推收等进行仿真。发动机仪表面板的功能、结构复杂,利用传统的建模工具,如3DMax、UG等,建模工作量大,效率低,难度大。为此,引进了一种新型的建模工具—GLStudio。GLStudio是一个与操作系统无关的快速的易用的原型工具,用来创建实时的、照片级别的、可交互的图形界面,可以创建发动机的仪表面板。GLStudio编辑器允许一个图形艺术家(美工)迅速而且容易地绘制美观的图形界面,并且能快速地建立模型,从而大大降低了建模难度,减小了工作量,提高了效率,而且建模效果非常逼真,可以达到照片级的效果。GLStudio还可以生成VisualC++直接可用的代码,可与程序员熟悉的MFC混合编程。由于其简洁高效的开发方式,GLStudio被誉为“真实仪器面板的选择”。
1利用GLStudio开发仪表面板
GLStudio是由分布式交互仿真技术公司(DistributedSimulationTechnologyInc.)开发的,用于建立实时的、三维的、照片级的交互图形显示界面。它能与HLA/DIS(HighLevelArchitecture/DistributedInteractiveSimulation)仿真应用相连;生成C++和OpenGL源代码,并且这些源代码可以单独运行,也可以嵌入其它应用中。
GLStudio代码生成器把GLStudio编辑器创建的文件生成C++、Java、涉及安全的C++和OpenGL源代码。任何可由GLStudio编辑器绘制出的图形对象都能生成C++、Java和涉及安全的C++源代码。代码生成器允许把对象组生成为定制的C++类,这些C++类能被轻松集成到用户的各种应用程序中。
1.1设计交互式三维图形
在GLStudio中设计交互式三维图形,一般可以分为如下4个步骤:
(1)设计图形界面。GLStudio设计器是一个经过长时间实践验证的三维所见即所得的绘制工具。设计器有一个现代的、直观的用户图形界面,包括了用户所期望的所有现代用户图形界面的元素。
(2)生成代码。GLStudio代码生成器把GLStudio编辑器创建的文件生成C++、Java、涉及安全的C++和OpenGL源代码。任何可由GLStudio编辑器绘制出的图形对象都能生成C++、Java和涉及安全的C++源代码。代码生成器允许把对象组生成为定制的C++类,这些C++类能被轻松集成到用户的各种应用程序中。
(3)将生成的代码添加到自己的应用程序中。代码生成器允许把对象组生成为定制的C++类,这些C++类能被轻松集成到仿真应用程序中。
(4)编译、连接、运行,生成可执行文件。
GLStudio设计器包括两个主要的控制窗口和一个或多个编辑窗口。除了众多图形应用程序提供的画布外,GLStudio设计器也包含了结构视图,它显示了所有设计中的对象的列表,用一个可折叠的树状结构来显示。
GLStudio支持照片级纹理的应用。一切多边形对象都可以贴纹理。纹理工具可以让你使用大多数格式的纹理,如PNG、TIFF、JPEG、SGI、BMP等。纹理能轻松地在对象上缩放、旋转和平铺,以达到所期望的效果。
在图形界面中,最为重要的元素就是“输入设备”(InputDevice)。它是组(group)的一个子类,包含了组的所有属性,还有一些额外的特性。输入设备是能够根据用户输入或程序输入改变状态(state)的一组对象,即输入设备可以与用户交互,例如,把指示灯定制为一个输入设备,则可以定义鼠标点击(事件发生)时点亮或熄灭。开发人员需要为输入设备添加事件处理的C++代码,以处理事件或改变状态。这些代码放在“对象属性/输入设备”(ObjectProperties/InputDevice)标签的“回调定义”(CallbackDefinition)域中,有一些预定义的宏函数可以利用。回调函数将包含在生成的源文件中,用户在自己编写的应用程序中调用它们,以响应事件,包括键盘和鼠标事件。
代码生成器对话框控制着GLStudio生成代码的设置,包括头文件名、源文件名、代码输出路径、派生类名、实例名等,这些都要加到用户的应用程序中。应用类型(ApplicationType)包括Standalone、glxComponent和wglComponent3种,分别用于将GLStudio代码独立运行、加入UNIX系统已有程序和加入MicrosoftWindows系统已有程序中。在与MFC混合编程时,新建工程向导自动将所需要的程序文件(如头文件等)加入到用户的工程中。
1.2使用GLStudio生成的代码编程
如上所述,GLStudio生成的代码有3种类型,由于大多数的开发人员使用VisualC++的MFC编程,这里重点介绍GLStudio生成的代码与MFC的混合编程方法。
(1)GLStudio代码生成器应生成Wglcomponent类型的代码。
(2)用户要建立一个MFCEXE程序,然后将GLStudio生成的头文件和源文件(包含完整的路径名)加入工程中。
(3)在自己的应用程序中,生成GLStudio生成类的一个实例,并使用该类的Draw函数在窗口中绘制图形。
(4)在GLStudio中,根据面板仪表的功能,设计输入/输出属性,从而响应交互和显示。在响应用户事件(如鼠标事件)时,需要将鼠标位置坐标传递给GLStudio所生成的类,将Windows坐标转换为GLStudio下的坐标。GLStudio的坐标原点在左下角,与Windows的左上角不同。另外,GLStudio与Windows事件消息在种类和描述上都有所不同。
3GLStudio在发动机仿真中具体应用
3.1建模和贴图处理
建模的基本方法为采用二维仪表技术来实现大多数虚拟仪表,在降低系统资源占用的同时,使其依然具有三维效果。所有的开关、旋钮、按钮、指示灯、表头、多功能显示器(MFD)等,都采用二维技术实现。对于油门杆、驾驶杆等,只能采用三维的建模方法实现。三维模型采用层次结构OpenFlight格式。OpenFlight格式是虚拟现实技术标准的数据格式,以数据库的结构方式对模型进行后期处理、显示。图1就是利用二维技术实现的开关、转速表模型,虽然模型是二维的,但是加上阴影等处理后,显示效果明显具有立体感。当然,在后期GLStudio处理中要注意Z-Buffer的设置。
为了提高调入和渲染速度,贴图大小要求满足OpenGL对图形图像驱动的要求,即大小为2m×2n。例如有一幅图像大小为30×40,则最终处理时大小应为32×64。贴图的大小尽量不要超过1024×1024。
为了方便改变贴图的透明度,图片采用了PNG的格式。
3.2创建工程
在VC或VC.Net中生成GLStudio工程。注意VC中的GLStudio工程分为Standalone和Component,为了便于调试,最初制作时应生成Standalone。在完成基本设计之后,根据需要,后期可以打包生成Component工程,从而生成.dll控件,方便集成后插入其它程序环境中。
3.3代码设计
对于不同的面板仪表功能,将其划分如表1所示几类。
表1虚拟仪表设计分类
例如对于开关,只需要把其DetenVal值传出即可。但是对于多位开关,GLStudio自动对其DtentVal进行编号,这种编号有可能不是我们想要的,而且由于多位开关的动作也是与DtentVal一致的,由GLStudio自动编号,所以如果直接用GLStudio中的GlsSwitch来制作有可能达不到要求,此时可以把要作的元件转化成基本的InputDevice,通过代码实现开关的动作及属性值的外传。
在客户程序中,要把事件消息(例如鼠标按下)传递给GLStudio生成的代码,GLStudio的“InputDevice”接收到这个消息(通常是鼠标击中、键盘按下等),才能响应用户的操作,实现预先定义的功能。
以鼠标左键按下为例,在InputDevice的回调函数中定义:
ON-MOUSE-DOWN(MOUSE-LBUTTON)
{
……
}
其中,ON-MOUSE-DOWN(MOUSE-LBUTTON)是GLStudio预定义的宏,表示鼠标左键按下。
以下是一个具体的开发实例的部分代码,具体功能为响应鼠标点击、拖动,STICK_1实现转动。
intstick_1Class::moveStick_Class_Cb(InputDevice*self,DisplayEvent*ev)
{
MouseEvent*mev=(MouseEvent*)ev;
stick_1Class*frame=(stick_1Class*)self->Parent();
……
ON_MOUSE_DOWN(MOUSE_RBUTTON)
{
lastx=mev->lx;
lasty=mev->ly;
……
}
……
if(ev->eventSubtype==MOUSE_DRAG)
{
x=mev->lx;
y=mev->ly;
……
STICK_1->DynamicRotate(dx,Y_AXIS);
STICK_1->DynamicRotate(-dy,X_AXIS);
}
return1;
}
其中,stick_1是一个MFCEXE工程;moveStick_Class是GLStudio的一个派生实例;moveStick_Class_Cb是GLStudio中定义的一个InputDevice。值得注意的是,在响应用户事件(如鼠标事件)时,需要将Windows坐标转换为GLStudio下的坐标。
GLStudio的坐标原点在左下角,与Windows的左上角不同。在用户程序中可以这样转换:
CRectrect;
GetClientRect(&rect);
mouse.y=rect.bottom2rect.top2point.y;
mouse.x=point.x;
mouse.ly=rect.bottom2rect.top2point.y;
mouse.lx=point.x;
mouse.lz=0;
另外,Windows与GLStudio对事件消息的描述不一样,例如,鼠标左键按下事件,在MFC消息映射时,用OnLButtonDown就可以描述了,但在GLStudio中要描述如下:
MouseEventmouse;
mouse.eventType=EVENT-MOUSE;
mouse.buttonMask=MOUSE-LBUTTON;
mouse.eventSubtype=MOUSE-DOWN;
再者,GLStudio与Windows定义的事件消息种类不同,如GLStudio中有MouseDrag事件,可以直接拖动对象,而Windows中没有这个事件,必须通过MouseMove或其他方式来实现。
3.4系统集成
将建立的发动机仪表面板发布成Component,在VC的开发环境中进行集成。集成后,建立了一个发动机操作显示的座舱环境。编制发动机操作逻辑代码,接受处理虚拟仪表的输出属性值,向响应仪表输入属性进行显示驱动,实现发动机的训练功能。
4结束语
在航空发动机虚拟训练系统中利用GLStudio开发发动机面板仪表,建立了仿真度高、易用的。利用GLStudio进行面板仪表开发,建模形象逼真、速度快、效率高,生成代码可读性好,确实是仪表面板仿真的开发利器。
参考文献:
[1]DistributedSimulationTechnologyInc.GLStudioUsersManual.2004.
[2]DistributedSimulationTechnologyInc.GLStudioReleaseNotes.2004.
[3]樊世友,邸彦强,朱元昌,GLStudio软件在视景仿真建模中的应用,军械工程学院,2001.3.
[4]黄柯棣.系统仿真技术[M].长沙:国防科技大学出版社,1998