
2 创建虚拟仪表DLL
2.1 制作纹理
制作纹理有多种方法,一般采用数码相机拍摄实物照片,然后运用图形编辑软件处理。获取高质量的实物照片是制作纹理的关键,所以在拍摄直升机座舱仪表照片时需要设置好背景,调节好光线,选取合适的角度。制作纹理时,将仪表照片经过图形编辑软件处理后保存为*.png格式。
在进行纹理制作的过程中,采用3D MAX和Photoshop制作仪表纹理非常方便。以直升机仪表中最常见的气压高度表为例,介绍仪表纹理的制作过程。
首先,在3D MAX中,创建一个圆柱体作为盘底,再创建一个白色的小长方体作为长刻度。调整好长方体大小,将旋转轴心设为表盘中心。选择工具中的阵列选项,设置好旋转角度为36°,阵列维数为1D,数量10,按确定。同理阵列出短刻度。对立体图进行渲染,保存为*.png格式。用Photoshop打开进行编辑,添加相应的刻度数字。这种方法制作出来的表盘非常美观,而且比处理仪表照片的效率高。


2.2 设计图形界面
设计图形界面即创建仪表模型,创建的模型分为静态模型和动态模型。以气压高度表为例,高度表盘为静态模型,仪表上的指针、旋钮、气压表盘为动态模型。
GL Studio设计器支持的所见即所得绘制方式,使开发仪表工作变得简单、直观。在GL Studio中进行绘制图形和添加纹理。纹理添加完毕后,注意调整各元件之间的层次关系,确定图形的正确显示。仪表界面的最终效果如下,给气压高度表每个独立的部件进行合理命名,以方便行为代码的编写。
场压选择旋钮的制作方法:在设计面板“Geometry”栏中,高亮“PBS”点功能键“Converts Selected to GlsKnob”创建旋钮。右击生成的旋钮,在“Knob”选项卡中设置旋钮转动的角度及连续性。

2.3 定义接口
气压高度表只有一个输入接口:气压值。最少只需要添加一个属性,Baro_hPa(),通过飞行动力学模型给该属性接口传值,单位统一为hPa。

2.4 编写行为代码
气压表左下角的旋钮为场压选择旋钮。仪表右边的气压表盘会随着场压选择旋钮转动指示设定的场压值。添加变量PBS_hPa,该变量记录设定的场压值。
(1)场压选择旋钮代码编写。
旋钮的位置范围为0~100,用来设定场压PBS_hPa,气压修正范围为950~1 050 hPa。在设计气压高度表的时候,假设初始场压在1 013 hPa。
>场压选择旋钮的初始化代码
self->PositionVal(63.of);//旋钮初始位置设为63PBS_hPa=950.0+(self->PositionVal());//63.0对应场压1 013 hPa
PBSDisc->DynamicRotate(2.4 * self->Posi-tionVal(),Z_AXIS);
//气压刻度盘初始旋转角151.2°,即1 013 hPa气压值所在角度
>场压选择旋钮回调函数代码
if(ObjectEventIs(ev,“PositionVal”))
{
PBS hPa=950.0+(self->PositionVal());
//旋钮位置范围0~100,对应的气压修正范围为950~1 050 hPa。
PBSDisc->DynamicRomte(2.4 * self->Posi-tionVal(),Z_AXIS);
//气压刻度盘通过换算在0~240°逆时针旋转,与气压表盘950~1 050 hPa场压对应
}
(2)Baro_hPa()属性函数编写。
Baro_hPa()为输入接口,用来接收主程序传来的外界气压大小(静压" title="静压">静压)。3 000m以下,每升高12m气压下降133.3Pa。通过静压和旋钮设定的场压,即可算出直升机所在的高度。
>Baro_hPa()属性函数的行为代码
_baro_hPa=value;
float altitude=(PBS_hPa*100-_baro_hPa * 100)*12.0/133.3://通过静压和场压差算出高度
float alt_long=(float)fmod(altitude,1 000.of);
longNeedle->DynamicRotate(-(alt_long*(360.0/1 000)),Z_AXIS);//长指针根据高度值大小旋转,1 000 m转动360°
float alt_short=(float)fmod(altitude,10 000.Of);
shortNeedle->DynamicRotate(-(alt_short*(36.0/1 000)),Z_AXIS);
//短指针根据高度值大小旋转,1 000m转动36°
2.5 生成代码、发布DLL
选择菜单栏中code->Generate All生成代码,在Microsoft Visual Studio.NET 2003中选择编译选项为Live Component Release,编译、连接,即可生成气压高度表DLL,在Licensed LiveComponent Release文件夹下可以找到生成的Barometric Altimeter.dll。
3 DLL的加载" title="加载">加载
3.1 插入虚拟仪表DLL
在程序中,有以下两种加载动态链接库的方式:隐式链接和显式加载。而GL Studio中对DLL的加载方式更加简便,程序员不需要了解底层的加载方式即可对DLL进行操作。
在工具栏中点击“
(Inserts a Component)”,选中需要加载的仪表DLL,即可将该虚拟仪表插入到GL Studio编辑器中。调整该虚拟仪表的大小,放到仪表板底板合适的位置。插入进来的虚拟仪表DLL实际上是一个类对象指针。
3.2 给虚拟仪表DLL传递参数
插入虚拟仪表DLL并进行合适的命名后,剩下的工作就是在Calculate()对该虚拟仪表的接口进行读写操作,即传递控制参数。
在GL Studio中,Resource()函数可以读写DLL的属性,这也是在创建虚拟仪表DLL的时候将所有输入输出接口定义为属性的原因。调用方式如下:

在总仪表板程序的calculate()中给各虚拟仪表DLL传递参数,以model_作为前缀的变量是根据直升机飞行动力学模型解算出来的值:

3.3 调试并完善
在项目后期联合调试和完善的过程中,如果需要对某个仪表的功能进行修改和扩充,只需要修改该虚拟仪表的程序代码,编译连接生成新的DLL。用新的DLL替换原有的DLL文件即可。
4 结束语
当CBT系统越来越逼真,每个虚拟仪表的设计也必然会越复杂。这时采用本文所介绍的方法,将各分立仪表做成单独的DLL。采用DLL编程可以使程序层次清晰,既细化了前期开发过程中项目的分工,又使得项目后期的修改和扩展变得简单方便,极大地提高了程序的可扩充性和可维护性。
凡《网络安全与数据治理》(原《信息技术与网络安全》)录用的文章,如作者没有关于汇编权、翻译权、印刷权及电子版的复制权、信息网络传播权与发行权等版权的特殊声明,即视作该文章署名作者同意将该文章的汇编权、翻译权、印刷权及电子版的复制权、信息网络传播权与发行权授予本刊,本刊有权授权本刊合作数据库、合作媒体等合作伙伴使用。同时,本刊支付的稿酬已包含上述使用的费用,特此声明。