APP下载

基于抽象工厂模式的机载显示系统图形生成技术研究

2019-09-25王志乐董军宇2胡文婷

计算机测量与控制 2019年9期
关键词:字符绘制工厂

王志乐,董军宇2,胡文婷

(1.海军航空大学 青岛校区军用虚拟仿真研究与训练中心,山东 青岛 266041;2.中国海洋大学 信息科学与工程学院,山东 青岛 266100)

0 引言

现代飞机航电系统已经由原先的分立式、联合式[1]变为现在的集成模块化[2]、分布式的航电系统,由于先进的电子信息技术在航电系统上的应用,使得航电系统功能越来越强大,交联越来越复杂,涵盖了飞控、显控、雷达、导航、通信、任务等子系统[3],该系统也成为现代先进飞机的核心系统,成为衡量飞机先进性能的核心指标之一。所有子系统的数据可视化显示与处理、人机交互都是通过显示与控制系统完成,这也对座舱显控系统的开发和性能带来挑战。

座舱显控系统作为飞行员与机载传感器的人机交互系统,其中机载显示系统直接显示飞行数据、战术数据、叠加图像等,显示的视觉效果、图形生成的效率直接影响飞行员的视觉判断和作战时机[3]。然而飞行显示系统需要实时地获取飞行传感器指令,经过计算处理后动态地显示飞行仪表图形、交互菜单、任务图形、目标及外部环境等信息,并且对显示系统的实时性、稳定性、安全性有很高的要求。当前,主流的设计方式都是将显示图形预先制作成贴图,然后通过国外专业的仪表开发工具如GL Studio、IData、VAPS等[4-6]进行开发。由于显示的图形种类和数量庞大、字符类型多,很多是按画面整体显示的图形进行设计,这类方法入门比较简单,但是显示系统复用率低、集成性差、无法实现重构,类似机型或相同机型升级都需要重新设计研制机载显示系统。另外,采用贴图方式显示的图像符号视觉效果差,而且使用大量的贴图影响显示画面生成的效率。所以本文对机载显示系统各类图形进行分层级抽象建模,提出了基于抽象工厂模式[7]对机载显示图形的三级建模架构,最后采用OpenGL[8]实现了图形模型开发库和机载显示系统图形生成架构,实验证明显示效果比贴图方式好、图形生成效率更高,并且可以实现机载显示系统的软件重构。

1 抽象工厂模式

当系统所需要的产品对象是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态,与普通工厂方法模式最大区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构。

当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族[9]中的所有对象时,抽象工厂模式比工厂方法模式更为有效率。产品族和产品等级结构关系如图1。

图1 产品族与产品等级结构关系

因此可以采用抽象工厂模式将机载飞行显示系统所有图形库按产品族和产品等级进行抽象,将机载显示图形库进行分级建模形成标准的图形生成对象,对字符、图形、窗口进行抽象统一建模,再利用抽象工厂模式对图形处理模型、绘制模型、显示模型进行系统架构设计。首先对显示图形库进行分类抽象,形成机载显示图形类结构如图2。

图2 机载显示图形类结构

由于抽象工厂模式属于类创建型模式,它的目的是为一系列的、相互关联的具体类提供统一的创建接口[10]。抽象工厂从图形绘制模型代码中隔离出了创建具体对象的操作,把所有对相互关联的类的创建操作组织到一起,为其他类提供高层的、经过封装的对象创建操作[9]。为了方便阐述抽象工厂模式,引入标准化的产品族,将不同分级结构但功能相关联的图形对象组成家族,其抽象工厂接口类如图3所示。

图3 图形家族抽象工厂接口类

基于抽象工厂模式的思想创建统一的接口类,可以通过基类快速的创建图形产品族或者基于产品等级资源库创建新的图形样式,然后在图形内部完成新增功能和特性。

2 图形抽象建模

在显示图形抽象建模的设计过程中,采用产品族的概念进行分类分级描述,将图形的特征处理进行分类建模。将机载航空电子系统显示的图形图像分为字符模型、基本图形模型、复杂图形模型、窗口模型,其中字符模型描述汉字字符和英文字符,基本图形模型描述线、矩形、圆弧、三角形等,复杂图形模型在基本图形模型的基础上进行建模描述,如表示飞机姿态的天地圆、填充椭圆、填充带边框矩形等。

2.1 位图文字矢量显示法

字符模型作为一种基本的显示图形,其绘制如表1所表。字符结构模型={字体|坐标|宽度|高度|旋转角|下划线|删除线|斜体},字符模型绘制处理类分为英文字符处理、汉字字符处理,其中英文字符采用ASCII绘制,汉字字符采用位图显示方式,由于汉字字符的显示比较特殊,这里在OpenGL环境下以汉字绘制类进行抽象描述,如表1所示。

表1 汉字绘制类

其中汉字的绘制处理在PrintText接口中完成,在Windows环境下OpenGL常用的位图字符显示方法包括:(1)通过制作位图字符的显示列表来显示,但对于汉字字符将大量消耗资源;(2)利用纹理贴图原理,将事先要显示的汉字制作成贴图,但运行时无法修改,只能适用于少量的汉子显示;(3)读取点阵字库信息,利用glBitMap()函数显示,读取显示效率高,但是放大或者缩小会存在锯齿现象。针对上述方法的特点,采用GDI提出的TrueType平面位图文字显示法。

利用TrueType矢量字体的与设备无关性、灵活性好等特点,结合OpenGL的位图显示技术,实现了矢量汉字灵活显示方法。其基本绘制模型如图4所示,在汉字矢量处理类中调用OpenGL位图数据结构及位图处理函数实现汉字显示处理。

图4 矢量汉字绘制模型

2.2 基本图形处理模型

在进行基本图形处理建模过程中,将汉字纳入到基本图形中,汉字绘制类实现之后,就可以和其他基本图形处理一起集成到基本图形处理类中,这里基本图形定义为:线、矩形、圆形、三角形、扇形或圆弧、多边形、窗口。基本图形定义的太详细或者太粗糙都不利于复杂图形的构建和图形的调用显示。因此在采用抽象工厂模式创建图形处理类时,首先创建基础的图形接口基类,如表2所示。

表2 图形接口基类

其中CreateIMG接口参数在完成创建图形对象过程中必然要使用CDC类,因此该接口的定义如下:

virtual bool CreateIMG(CDC *pDC, enIMGShowTypeDef enType,bool bIsColor)=0;

参数enIMGShowTypeDef表示载机显示系统的某种类型的物理显示设备,如MFD1MFD2HUDHMD等。

在进行基础图形类库的开发过程中,需要使用Opengl32.dll和Glu32.dll,因此这里基于OpenGL图形接口, 结合基础图形绘制模型的特点,以及开放式航电显示系统设计的技术要求,设计专用的图形绘制类接口CBaseDraw,主要包括图形绘制类函数和图形控制类函数,该接口类的模型如表3所示。

2.3 复杂图形绘制模型

复杂图形处理类模型CGLImageDraw的定义是基于IIMGModel进行派生的,由于复杂图形也是基于基本图形库产生的,因此需要引用CBaseDraw,其模型定义如表4所示。

表3 基础图形绘制模型

表4 复杂组合图形模型

CGLImageDraw类的具体定义如表5所示。

在复杂图形模型的绘制过程中,可以采用贴图实现,这种方法对开发人员的技术水平要求不高,并且开发过程简单,但是灵活性和重用性不强,显示效果也不好。一般战斗机的图形显示符号达到100余种,都采用贴图之后在显示过程中系统占用的资源比较高。因此基于设计的基本图形处理类通过图形绘制算法创建复杂图形,既可以实现图形符号的通用性,也实现了图形绘制算法的重构,通过参数可以构建不同飞机同一类别的图形符号,而且显示效果和软件效率都得到大大提高。如图5是基于GL Studio开发工具利用预先处理好的贴图实现的MFD显示效果,其特点是显示的每一个字符及图形符号都是基于贴图图像实现的,因此显示效果受图像分辨率影响较大,当画面进行缩放时图像容易发虚;对于可变图形(如航线)利用GL Studio进行动态绘制后由于没有进行反走样处理,锯齿明显。

表5 CGLImageDraw类模型定义

图5 GL Studio实现的驾驶效果和导航效果

利用CGLImageDraw和CBaseDraw类进行画面绘制时,通用基本图形符号可以通过CBaseDraw类实现,对于复杂组合图形符号在CGLImageDraw类设计时实现,通过调用OpenGL函数库、CBaseDraw类和相关图形处理算法实现。以图1画面中地平仪(天地圆)的实现为例,其组成及变化比较复杂,其特征如表6。

表6 天地圆特征表

表7 姿态刻度带绘制

图6 填充矩形与填充矩形叠加刻度线及刻度值绘制效果

在填充矩形显示层上面调用CBaseDraw类的绘线接口完成刻度线的绘制,以及刻度值的绘制,其显示效果如图6(b)显示。最后为了构成天地圆的显示效果,需要对填充矩形进行遮挡层绘制,均分成四等分绘制遮挡图形,遮挡图形由多边形和圆弧组成,主要计算出圆弧半径和四个点的坐标,如表8关键点坐标。圆弧的绘制算法如下,遮挡圆弧实现后的显示效果如图7(a)所示。

定义:circler=173。

circlex表示圆弧上某点X坐标,circley表示圆弧上某点Y坐标

表8 关键点坐标

采用遮挡圆弧绘制算法绘制完其他三份,至此就完成了天地圆的绘制,当飞机姿态变化时,天地圆及刻度带随动,而遮挡部分始终保持不动,这样的机理也完全符合地平仪的结构。通过自定义类绘制效果如图7(b)所示。基于CBaseDraw基本图形类和复杂图形的绘制函数、管理函数构建CGLImageDraw类,这样就实现了机载显控系统的可视化图形抽象建模。

图7 叠加遮挡圆弧显示效果与自定义类实现效果

2.4 显示画面实现

以某型固定翼飞机飞行驾驶画面为例,该画面包括地平仪、飞行参数指示等[11]。利用自主开发的图形模型库和显示系统图形生成架构,快速的实现画面绘制。该架构首先是画面绘制准备工作,其次是利用图形模型库提供的SDK进行字符、图形和窗口的显示。

准备工作过程中,主要实现着色模式选择、目标像素深度设置、指定颜色和纹理坐标的差值质量、启用点线反走样和抗锯齿[12-13],定义像素运算算法等,其关键代码如表9。

字符和图形的显示根据机载航电子系统输出的状态数据、传感器测量数据、任务解算数据[14]以及显控系统当前所显示的画面状态判断下一刻应该显示的画面。根据画面图形元素类型及图形位置布局等特点,调用CBaseDraw类和CGLImageDraw类提供的图形生成算法实现字符、通用图形、复杂图形的实时绘制和显示。图8是采用该架构提供的抽象图形模型库实现的某型飞机驾驶画面和导航画面的效果。

表9 显示初始化功能

图8 自定义架构和图形库实现的驾驶和导航显示效果

3 仿真应用分析

国外专用开发工具(如GL Studio、IData等),往往不支持汉字显示,汉字和图形都是通过贴图实现,因此当显示比例变化时显示效果会受到影响,对于一些动态变化的图形,需要依靠工具提供的控件和API来实现,但工具未提供图形反走样处理,如图1显示效果。基于国外专用工具开发后的软件重用性、重构性都大大降低,即使是贴图的重复使用率也不高,优点是对开发人员的编程技术要求不高。

基于抽象工厂模式实现的座舱图形生成库,解决了国外专用工具面临的问题,所有的显示符号都是图形,并进行了反走样和锯齿的处理,图6对比图1的显示效果明显提高。利用上述平台架构和图形模型库开发的任意机型的显示系统,通过调整视窗、修改绘制参数、增加或删除某些图形等可以快速的实现代码的重构,而开发人员无需掌握图形的绘制机理,只需要调用对应图形的绘制函数,输入位置和特征参数。表10给出了图形生成技术与国外专用工具的对比。

4 结论

通过对比传统显示系统的软件开发以及利用国外软件工具进行开发的过程,该方法采用抽象工厂模式建立机载显示系统图形模型库,基于OpenGL技术建立机载显示系统平台,可以快速的实现飞机座舱显示系统的设计及开发,并且不受任何平台和工具环境限制,既适合实装的预研设计、开发,也适合各种平台的模拟训练系统的研制。其特点是,对开发人员的编程能力要求较低,显示软件的复用率和重构率高、继承性好,易于移植和嵌入其他第三方软件平台。利用上述平台架构和图形模型库实现的某战机座舱显示系统已经成功应用于该型飞机分队战术模拟训练系统,通过仿真试验及结果的定性定量评价分析,该模拟器完全满足训练和教学需求。

表10 图形生成平台与第三方工具对比

猜你喜欢

字符绘制工厂
绘制童话
作品赏析
论高级用字阶段汉字系统选择字符的几个原则
字符代表几
一种USB接口字符液晶控制器设计
图片轻松变身ASCⅡ艺术画
绘制世界地图
为什么工厂的烟囱都很高?
奶酪工厂
神秘的不速之客