APP下载

基于GL Studio的虚拟仪器仪表设计与仿真

2015-06-08孙艳丽王玲玲陈佳琪

系统仿真技术 2015年2期
关键词:旋钮示波器纹理

孙艳丽,王玲玲,陈佳琪

(1.海军航空工程学院 基础实验部,山东烟台264001;2.海军航空工程学院 控制工程系,山东烟台264001)

1 引 言

近年来本科学员、在职培训及预选士官等教学任务逐年增大,但新参训人员直接操作容易因误操作导致损坏设备,增大维修成本,而且有限设备无法同时供应大量人员使用,使得耗时较长,通过仿真软件开发虚拟仪器仪表是提高效率,解决院校实验教学、装备培训、部队操练的重要途径。

GL Studio是一个面向对象,用于创建实时的二维或三维、照片级交互式的图形界面开发软件。纹理工具可以导入数字照片,完成仪表仿真。GL Studio有内建代码生成器,把图形设计器创建的文件生成可移植的VC代码。可进行人机互动,实时显示仪表之间的动态关联,效果直观逼真[1-2]。GL Studio开发流程主要包括创建纹理、图形界面设计、软件设计、系统实现四大方面[3]。

2 创建纹理

纹理创建的好坏直接关系所创建虚拟仪表真实程度,纹理图片的获取是创建纹理的第一步,获取纹理通常有两种方法:① 用数码相机直接拍摄真实的仪表,将所拍摄的照片经过处理后作为纹理;② 用图形编辑工具创建纹理[4]。目前,采用第一种方法获得纹理比较常用。得到高质量的实物照片后,去除照片中的背景,将所有能动部件(如仪表盘上指针、动态数字、开关、旋钮、按钮等)从主仪表板上逐个移除,并拷贝到新图层中,最后保存纹理图片。本文中根据不同需求电源柜的界面是由数码照片处理而成,示波器的仿真则为了增强立体效果采用3dmax创建纹理。

2.1 基于数码照片的纹理创建

制作的第一步就是要直接使用相机拍摄到其实物照片,并且在拍摄照片时一定要注意保持照相机的垂直,防止因拍摄角度的原因造成照片的倾斜,以至于最后影响到所制作的电源柜的真实度。其中需要一张电源控制柜的整体照片来作为背景。当纹理图片的像素太大时,GL Studio软件使用对象属性窗口进行添加纹理图片时是无法显示的。可是如果降低图片的像素,清晰度将会受到影响,本文中采取将图片进行分割的方法,这样既保证了单张图片像素不会太高,又兼顾了清晰度的问题。

将面板图片上所有能动的部件给抠出来,并将所有状态都拍摄下来,在拍摄完照片后使用Photoshop对电源柜的面板照片进行处理,消除掉因为人为因素所造成的照片倾斜、亮度不均匀等种种会影响到其真实度的问题。将所有抠下的各种小部件纹理图片综合放置于同一张纹理图上,以避免各个部件的纹理图片的比例不同,从而导致在后续的工作中需要频繁地调整其大小。

2.2 基于3ds max的示波器纹理创建

在3ds max软件界面中,画出示波器图片中线的截面,设置其路径,使用放样法制作线的三维模型。使用挤出法在3ds max中制作示波器上凸出的按钮等。对于示波器上的金属接口,设置其材质为金属。对于示波器的屏幕采用先分割平面再挤出的方法来制作,最后设置其纹理使其更接近于真实物体。取得用3ds max制作的示波器的立体模型的图片,用Photoshop调整其大小使其能够被GL Studio软件使用的示波器虚拟仪器背景的纹理图片,如果纹理图片的像素过大的话则在GL Studio中是显示不出来的。再将示波器上所有的按钮以及旋钮用Photoshop逐个将其抠下来,并将其拷贝到新的图层上,获得纹理图片。

3 图形界面设计

首先用 VC6.0 在 GL Studio 3.0 Standalone AppWizard中建立设计器,完成初始化,当 GL Studio初始化完毕后,GL Studio已经生成了大量的代码,包括三个文件,两个源文件和一个头文件。一个源文件是win_main.cpp,在该文件中有int WINAPI WinMain函数,这是程序的入口函数,该函数调用了另一个源文件里的int main(int argc,char*argv[])函数,这个源文件的名字是根据用户定义的工程的名字来定义[5]。同时 GL Studio又定义了一个指针全局变量,名字也是工程的名字,该指针指向的类是glsDisplayFrame类的派生类,在 int main(int argc,char*argv[])中在堆上创建glsDisplayFrame类的派生类对象。在该类的构造函数中做了一些初始化工作,然后调用Create();函数,该函数用来产生程序窗口,具体如下:

void testClass::Create(void)

{

theWindow=new OpenGLWindow(0,0,_width,_height,Name(),this);

theWindow->end();

theWindow->resizable(theWindow);

BackgroundColor(255,255,255,255);

FrameInterval(33333);

theWindow->resize(0,0,_width,_height);

theWindow->show();

theWindow->make_current();

}

之后即可在GL Studio编辑器的设计窗口中利用工具栏中的创建工具和“所见即所得”的设计环境创建一个和电源柜背景图像相似的图形对象[6]。将经过处理的控制柜的背景纹理图片通过对象属性窗口中的Texture窗口添加到当前的图形对象之中,并将其设置为当前纹理。通过设计窗口上工具栏中的模式工具对纹理进行调整,使其正好铺满图形,在主控制窗口中给创建好的图形对象命以恰当的名字,以便于更好地管理、编辑对象。除了设计画布外,GL Studio设计器包含了分层视图,在视图中显示所有设计中对象列表,以树状结构显示,如图1所示。

图1 状态设置图Fig.1 State diagram

根据背景纹理上各个所抠下的部件的形状,再分别创建出与它们各自相近的图形对象,依照对电源柜背景纹理的处理方法分别对其进行处理,最后得到所要设计的图形界面。

在画面中用到不少文本框,要实现文本框的数据、文本的改变,首先要把文本格式化到一个缓存里。设文本框指针名为firsttextgrid,要把数值100显示在文本框里,可以首先创建一个属性成员函数,通过在CODE主窗口点右键添加即可实现,此时会得到一个成员变量,只需要选定SET方法,然后输入:

int index=100;

char buffer[10];

sprintf(buffer,"%d",index);

firsttextgrid->string(buffer);

因为电源柜是单层画面,只有一个Calculate()函数,只要选择classmenthods在Calculate()函数中调用刚才的SET方法,然后保存,生成代码,编译连接运行,就可以在文本框中看到修改了的数据。

产生窗口以后绘制的画面,由函数CreateObjects()生成[7]。在该函数里,首先在堆上生成对象,该对象代表每个画面中的控件,名字是用户绘制画面时候,在主控制面板中生成的名字。GL Studio根据绘制的对象不同,会生成从不同类中派生的对象,指针的定义已经在头文件中定义好,在CreateObjects()中,生成对象后调用该类成员函数,产生画面。该类成员函数的具体定义已经封装在GL Studio的动态库中,GL Studio会根据用户绘制的画面,把画面的必要信息,如顶点颜色、顶点位置、名字、纹理大小等以参数的方式传过去。GL Studio将根据这些参数,自动生成与用户在画布绘制的一样的图像。这就是GL Studio的所见机所得的工作机制。图片绘制完毕后,进入do-while语句,这个循环将不断调用一个虚函数Calculate(),实现所有画面的刷新,如图2所示。

图2 各功能模块的调用关系Fig.2 Call relationship of each function module

在设计好图形界面之后,依据实际面板的操作需要将各个控制部件创建成合适的装置,工作方式开关创建成旋钮,选中工作方式图形对象,点击工具栏中转化工具的旋钮装置,如图3所示。打开旋钮装置的对象属性窗口,在Knob标签下,选择General标签顶部的Angle Range,即角度范围。设置旋钮旋转角度为0°~70°,即旋钮旋转的起始位置和终点位置,如图4所示。

图3 转化为旋钮装置Fig.3 Device into a knob

图4 设置旋转范围Fig.4 Set the rotation range

之后设置起点和终点间的挡位,在Detents标签下的Number of Detents输入框中填入数字“3”,即共有3个挡位,分别为“0”、“平时”、“忙时”。滑动Detent Positions的滑块使每一挡位对应合适的角度。在主控制窗口的代码窗口中添加新变量。变量类型为float,名字设为_newRoll,初始值设为0.0f。最后在对象属性窗口的Object Code栏的Initialization Code中输入如下代码:

Self->DetentVal(1);∥旋钮初始挡位为1

在Event callback Code即事件回调代码中写入以下代码:

bool rval=false;

if(ObjectEventIs(ev,"DetentVal"))

{switch(rollGlsKnob-> DetentVal())

{case1:

_newRoll=0.0f;∥0°时为挡位 1

break;

case2:

_newRoll=50.0f;∥50°时为挡位 2

break;

case3:

_newRoll=70.0f;∥70°时为挡位 3

break;

}

Rval=true;

}

Return rval;

剩余的部件创建成按钮装置,在所有创建的GlsPushButton(按钮装置)对象的对象属性窗口的Object Code窗口的Event callback Code即事件回调代码中写入以下代码:

chekonggui_click_value=self->State();

return 0;

其中 chekonggui处填写每个对象各自的名字。

在主控制窗口的代码窗口的类变量中点击Add将所有的GlsPushButton对象逐个添加进去,在设定其类型为int,初始值为0。编写行为代码。

4 软件整体设计

为了达到实现虚拟电源柜功能的目的,需要对图形界面中的开关、旋钮、按钮、指示灯、屏幕以及指针等动态的部件进行控制,而这就需要在主控制窗口中的代码窗口类方法的Calculate区域内进行编程来实现各部件的动作,如图5所示。

图5 软件编程图Fig.5 Software program

5 编译、链接和测试

编程完成即可进行电源柜的仿真,测试其是否满足可正常工作,满足设计要求。首先需要生成.h 和.cpp 文件,之后打开.dsp 文件,在 C++环境下对电源柜进行测设。在.dsp文件中对电源柜进行运行,即可生成.exe可执行文件。在.exe可执行文件上按编写的行为程序点击按钮,测试其功能是否正常,如图6所示。

图6 示波器的测试Fig.6 Test of oscilloscope

6 结 论

经过测试发现电源柜和示波器均能按照所编写的行为程序动作,能够实现使用虚拟仪器进行院校装备训练,实现提高效率、节省损耗的效果。

[1] 于辉,赵经成,付战平.Gl Studio虚拟仪表技术应用与系统开发[M].北京:国防工业出版社,2010.YU Hui,ZHAO Jingcheng,FU Zhanping.Gl Studio virtual instrument technology application and system development[M].Beijing:National Defence Industry Press,2010.

[2] 张文,朱元昌,樊世友.Gl Studio及其在雷达面板仿真中的应用[J].测控技术,2012,21(12):50-53.ZHANG Wen,ZHU Yuanchang,FAN Shiyou.GL Studio and its application in the simulation of radar’s panels[J].Measurement& Control Technology,2012,21(12):50-53.

[3] 崔小鹏,邵英,李万.基于Gl Studio的电力监控系统设计[J].船海工程,2011,40(2):122-124.CUI Xiaopeng,SHAO Ying,LI Wang.Design of power monitoring system based on GL studio[J].Ship & Ocean Engineering,2011,40(2):122-124.

[4] Distributed Simulation Technology Inc.Gl Studio user’s guide,Version 1.04[R].[s.l.]:Distributed Simulation Technology Inc,2000.

[5] 孙艳丽,李建海,王玲玲.基于GL的某型电源系统仿真设计[J].电子测量技术,2014,37(2):1-3.SUN Yanli,LI Jianhai,WANG Lingling.Simulation of a certain type of power system based on GL Studio[J].Electronic Measurement Technology,2014,37(2):1-3.

[6] 乔林,费广正.Visual C++高级编程技术——Open GL篇[M].北京:中国铁道出版社,2000.QIAO Lin,FEI Guangzheng.Visual C++advanced programming technology——Open GL[M].Beijing:China Railway Publishing House,2000.

[7] 沙俊名,刘泽乾,庞帅.基于Gl Studio的指挥仪模拟训练系统设计与实现[J].科学技术与工程,2011,11(12):2819-2823.SHA Junming,LIU Zeqian,PANG Shuai.The design and implementation of a director simulated training system based-on GL Studio[J].Science Technology and Engineering,2011,11(12):2819-2823.

猜你喜欢

旋钮示波器纹理
家用燃气灶具旋钮温升影响因素的研究
基于BM3D的复杂纹理区域图像去噪
使用纹理叠加添加艺术画特效
一款教学示波器的Y通道设计与实现
基于Mastercam旋钮凸模的数控加工
TEXTURE ON TEXTURE质地上的纹理
可携带式虚拟双踪示波器
消除凹凸纹理有妙招!
汽车示波器——为绿色维修保驾护航
车用旋钮力矩特性曲线研究