圣长军,王家润,王玉玫
(华北计算技术研究所,北京100083)
由于三维战场态势提供了丰富的空间信息和逼真的战场环境,因此相比于传统的二维战场态势,它必将在现代信息化战争中占据更加重要的作用。作为三维战场态势系统的重要组成部分,三维标号的生成是国内外研究的热点。目前国内还没有针对三维标号的显示制定统一的图形标准,这使得三维标号的制作方法多种多样,现有的方法都是对不同类型的标号使用不同的生成技术。例如点标号的制作一般采用Billboard(公告板)技术,文献[1]中的点标号就是利用公告板技术制作而成,它采用改进的浮雕算法处理军标图像,增强了公告板显示的立体感。对于线面标号的生成,主要采用三类方法:基于RTT(render to texture)技术的绘制方法、基于矢量数据的绘制方法和基于模板阴影体技术的绘制方法。文献[2]中介绍了这三类方法的实现过程,并叙述了它们的优缺点,本文不展开叙述。
鉴于三维标号生成的这种复杂局面,本文提出一种完全基于矢量数据的绘制方法。该方法不但可以用于线面标号的生成,而且对点标号的生成同样适用;该方法统一了不同类型标号的生成过程,同时避免了Billboard中立体感缺失和RTT技术下纹理走样的问题。
本文的三维标号生成方法是以现有的二维标号算法为基础,通过对其图元结果进行改造,获得相应的三维绘制基础图元,然后使用OpenSceneGraph[3](OSG)构造出三维标号,最后再进行一些特效处理,图1所示为二、三维标号的绘制流程。
众所周知,操作系统提供的图形设备接口 (如windows下的GDI+)只能用于绘制诸如文字、点、线段、多边形、椭圆、圆弧、Bezier曲线等基础图元。因此,要绘制任意一个二维标号,必须先将它分解成这些基础图元,再调用图形设备接口进行跟踪绘制。
图1 二、三维标号的绘制流程
参见图1可知二维标号的绘制过程:首先标号经过二维标号算法库被分解为基础图元,然后在二维图形系统中进行绘制和显示。
其中,二维标号算法库封装了对所有二维标号的属性解释和图元分解过程,它的意义在于屏蔽了标号形状的差异,使得图形设备接口能够顺利绘制出二维标号。由此可见,二维标号算法是整个二维标号生成过程中的核心部分。
图2以某实际标号为例,说明该标号经过二维标号算法库处理后分解成二维绘制基础图元的结果。由图可知,为了在二维态势下显示该符号,二维图形系统只需依次绘制4个基础图元即可,包括一个圆、一段圆弧和两条线段。
图2 标号分解成基础图元
三维标号的生成方法采取了与二维标号类似的思路,该方法关键在于如何将标号分解成为三维绘制基础图元。本文选择充分利用现有的二维标号算法库技术,尽管它最终产生的只是二维的图元数据,但是通过对这些二维图元数据进行适当改造,可以获得标号的三维图元数据。
在将二维图元数据改造成三维图元数据的具体实施过程中还需解决如下几个问题:①如何扩展三维标号特有的属性数据;②如何将二维绘制基础图元的顶点数据从二维平面变换到三维空间;③如何映射二维绘制基础图元与三维绘制基础图元的类型关系。
针对以上3个问题,提出的解决方案如下:
(1)三维标号的属性结构设计
三维标号的许多属性数据是二维标号所没有的,比如标号的厚度属性、标号控制点的高度属性 (二维标号中只有经纬度信息)、标号的光照属性、点标号面向屏幕显示属性以及线面标号与地形匹配属性等等。为了不影响对原来二维标号算法库的使用,我们仍然将原有的二维标号属性独立保存,将其作为二、三维标号的公共属性,而将三维标号的特有属性作为扩展属性来保存。标号的属性结构设计层次如图3所示。
图3 标号属性数据的UML设计
(2)图元数据的三维坐标变换
二维绘制基础图元中的顶点数据都是平面的,首先将其一一映射到三维坐标系中的xy平面,如p(x,y)→p'(x,y,0),这便形成了三维空间中可绘制的顶点形式。然后再通过对映射后的三维顶点数据进行平移、旋转、缩放等一系列几何变换,三维标号就能呈现出各种复杂的显示样式。
(3)基础图元类型的三维映射
最后还需知道,三维图形绘制系统中的基础图元类型相比二维来说要少。OSG中可绘制的图元类型只包括6种:文字、点、线段、三角形、四边形和 (凸)多边形。其他任何复杂的图形都是通过这几种基础类型组合而成。对照二维标号算法库分解出的基础图元可知,除了相同类型的图元可以一一映射外,像椭圆、圆弧、Bezier曲线等在三维态势下仍然无法直接绘制,还需要对它们做进一步的分解工作,将它们分解成OSG中可绘制的线段类型。
通过以上 (1)、(2)、(3)三个步骤,最终获得了标号的三维绘制基础图元。以上三个步骤相当于组成了三维标号算法库,显然,这种以二维标号算法库为基础并对其结果进行分解和坐标转换的方法很容易实现,工作量也非常小。因此,更多的精力可被集中于后续的三维图元构造以及标号与地形匹配、光照特效处理等方面。
由前面的叙述可知,三维绘制基础图元是在二维绘制基础图元的结果上改造而得。对比二者中的类型可知,需要将二维绘制基础图元中的椭圆、圆弧和Bezier曲线分解成连续线段,另外,还需要对面状标号进行三角剖分。
下面简要介绍这些分解方法:
(1)椭圆逼近方法
Windows系统下,二维图形设备接口GDI+提供了函数DrawEllipse,它可以很方便的绘制椭圆。但在三维系统中只能采用连续线段逼近的方式来绘制椭圆,由椭圆参数方程:(其中a为椭圆长半轴,b为椭圆的短半轴,a、b>0),可得在其区间取 n等分的顶点依次相连就可以逼近椭圆;当n取值越大,椭圆也就越逼真,但相应的计算代价也越大。
弧形属于椭圆的一部分,只是θ的取值为弧的起始角度和结束角度之间,θ∈[θs,θe]。圆也属于特殊的椭圆(此时椭圆方程中a=b),因此也归为椭圆类。
(2)贝塞尔曲线构造
同样的,GDI+中也提供了函数DrawBezier来直接绘制三次贝塞尔曲线,但在三维系统中必须将其分解为连续线段才能绘制,利用Bezier曲线参数方程
其中pi(i=0,1,…,n)表示Bezier曲线的一系列控制顶点,Bi,n(t)是 Bernstein基函数。对于三次 Bezier曲线,n=4,且点p0和p3为曲线两端点。
线面标号中实际应用情况是,对于多个控制点Ci(i=0,1,2,…)需要构造出经过所有Ci控制点的光滑曲线,本文使用了分段连续三次 Bezier曲线的构造方法[4],如图4所示。
图4 分段连续三次Bezier曲线控制点构造
步骤如下:①在相邻的两个控制点Ci'和Ci″之间构造两个插入控制点Pi'、Pi″,生成一段Bezier曲线;②插入控制点的构造要满足使相邻的两段Bezier曲线在其过渡点Ci保持C1连续。
(3)面状标号的三角剖分
对于面状标号的显示,GDI+中提供了函数DrawPath,该函数只要结合不同的画刷就能绘制出单色填充或渐变填充的面状标号。而三维系统中可绘制的填充形状只能为凸多边形,但面状标号中存在较多的非凸多边形,必须对其进行三角剖分后方可正确的填充该标号。
对于单色填充的面状标号,只要直接使用简单多边形的三角剖分[5]方法,将面状标号分解成三角形后给其绑定相同的颜色即可,效果如图5所示。
对于渐变色填充的面状标号,则需要采用更为细腻的三角剖分算法。图6所示,采用了一种满足颜色渐变需求的规则三角剖分方法,结果表明钳击箭头渐变效果较好。
图6 满足颜色渐变需求的规则三角部分
标号最终被分解成三维绘制基础图元,包括:位图、文字、线段、三角形、四边形和 (凸)多边形。OSG提供了对所有这些图元进行绘制的方法,其中针对文字还提供了两种类型:Text和Text3D(平面文字和立体文字),为了提高绘制效率本文使用平面文字的绘制方式。
由这些基础图元数据已经可以绘制平面的三维标号,此时再加入宽度和厚度属性就能够构造出三维立体标号。由解析几何知识可知,二维绘制基础图元中的一条线段映射到三维空间中的xy平面后仍然是一条线段。要将这条线段扩展成立体的形状,需经过如下两个步骤:①将线段在xy平面上向两侧拉伸出宽度;②将线段在z轴方向上拉伸出厚度。图7中 (a)为扩展前的点标号,(b)为扩展后的立体效果,(c)为立体标号的骨架显示效果。
图7 三维立体标号
步骤①采用平行线算法,如图8所示,对于连续线段ABCD,先在其右侧构造平行线ArBrCrDr,假设标号线宽为w,则AAr垂直于AB,且为B点处的角平分线,且点Cr属于中间点,其求解方法与Br相同;点Dr属于端点,其求解方法与Ar相同。同理可在ABCD左侧构造出平行线AlBlClDl。
图8 连续线段平行线算法示意
至于厚度的拉伸,只需在前一步宽度拉伸基础上将每个顶点的高度增加一定值即可。对平行线每点高度z值增加厚度d后,可得拉伸后的数据同理可得平行线AlBlClDl的厚度拉伸数据
至此,获得了四组顶点数据,并且由每个顶点数组所表示的线段都是原线段ABCD在三维空间中的平行线。OSG中只要以GL_QUADS绘制模式将这些顶点数据按一定规则连接成四边形,就生成了线段的立体模式。需要特别注意的是,指定四边形时需要严格确保顶点的绘制顺序使得四边形的法线方向为指向标号的外部,否则将无法正确地显示光照效果。
点标号与地形匹配方法非常简单,只要保证点标号定位点的高度值位于地形上方即可。因此,在标绘三维点标号时需要实时的查询其经纬度所在位置对应的地形高程值。
对于线面标号而言,与地形匹配的方法显得非常重要,如若线面状标号不能与地形合理匹配,那么在地形起伏较大的区域显示时易出现悬浮空中和陷入地下的情况。本文使用较为简单的解决方法——查询线面标号每个数据点对应经纬度位置的高程值。根据前面的平行线算法介绍可知,实际需要查询的高程数据只要包括三维基础图元数据对应的那条主线段 (如图8中的线段ABCD)上的所有顶点即可,立体扩展后各线段相对这条主线段是固定的,其顶点数据可通过平移获得。以上介绍的这种线面标号与地形匹配的方法,它的实时计算速度基本可以满足三维态势下对线面标号的绘制要求,但对于态势演播这种需要短时间内进行大量标号更新的功能而言,这种方法则延迟较为明显,这也是本文需要改进的地方。文献[6]中给出了一种基于GPU的方法解决线面状标号与地形匹配问题,该方法运算效率较高,可供读者进一步研究。
图9为战场态势二维标绘系统下的标号效果,图10为相应的三维标号效果。
结果表明,使用本文方法生成的三维标号显示效果十分理想,它不仅美观、立体感强,并且显示效果与二维标号几乎一模一样,这也让其更容易被理解和使用。
图9 二维态势标号效果
本文对三维标号的生成方法进行了研究,提出以二维标号算法库为基础生成三维标号的方法,该方法关键在于如何将二维绘制基础图元转化成三维绘制基础图元。由于二维标号算法库已经封装了标号差异,这让本文的三维标号在生成时不必关心标号类型,从而极大地减少了三维标号制作生成的复杂性。同时,因为使用的是基于矢量数据的绘制方式,这也表明运用本文方法生成的三维标号非常便于日后的交互编辑工作。
图10 三维态势标号效果
本文还需要进一步研究的工作包括三维标号中相邻图元在衔接处的处理以及如何提高线面标号与地形匹配的效率。
[1]YANG Qiang,CHEN Ming.Real-time creating and protracting of 3D static unit symbols[J].Computer Engineering and Design,2007,28(14):3419-3421(in Chinese).[杨强,陈敏.三维静态军标的实时生成与标绘 [J].计算机工程与设计,2007,28(14):3419-3421.]
[2]YU Meijiao,ZHANG Yongsheng,DAI Chenguang.Implement of rendering situation symbol over 3D Terrain [J].Jounal of Geomatics,2008,33(4):40-42(in Chinese).[于美娇,张永生,戴晨光.实现复杂态势符号在三维场景中的绘制[J].测绘信息与工程,2008,33(4):40-42.]
[3]OpenSceneGraph [EB/OL].http://www.openscenegraph.net.
[4]WANG Jiarun,ZHAO Nansong,Hua Wenyuan,et al.Construction of cubic Bezier continuous subsection curve's control points[J].Computer Engineering and Applications,2010,46(22):190-193(in Chinese).[王家润,赵南松,华文元,等.分段连续三次Bezier曲线控制点的构造算法[J].计算机工程与应用,2010,46(22):190-193.]
[5]De Berg M.Computational geometry algorithms and applications[M].2nd ed.DENG Junhui,transl.Beijing:Tsinghua University Press,2006:50-72(in Chinese).[计算几何-算法与应用[M].2版.邓俊辉,译.北京:清华大学出版社,2006:50-72.]
[6]CHEN Hong,TANG Xiaoan,YANG Yaoming,et al.Using display mapping for irregular military symbols rendering[J].Journal of Computer-Aided Design and Computer Graphics,2011,5(23):798-803(in Chinese).[陈鸿,汤晓安.基于位移映射的非规则军队标号绘制算法 [J].计算机辅助设计与图形学报,2011,5(23):798-803.]
[7]JIANG Huawen.Design and implementation of 3D military symbol based on B-Spline[D].Jilin:Jilin University,2009:42-34(in Chinese).[姜华文.基于B样条的三维军队标号的设计与实现[D].吉林:吉林大学,2009:32-34.]
[8]XIAO Bin,WANG Jinshu.Research and implementation of 3D campaign situation display at sea[J].Journal of System Simulation,2008,14(20):3746-3749(in Chinese).[肖滨,王金树.海上战役态势三维显示的研究与实现[J].系统仿真学报,2008,20(14):3746-3749.]
[9]WANG Rui,QIAN Xuelei.OpenScene Graph 3D rendering engine and practise[M].Beijing:Tsinghua University Press,2009:90-127(in Chinese).[王锐,钱学雷.OpenSceneGraph三维渲染引擎设计与实践 [M].北京:清华大学出版社,2009.90-127.]
[10]XU Zemin,HE Jun.Design and realization of 3D graphics simulation system for battlefield situation[J].Journal of Computer Applications,2009,29(6):313-316(in Chinese).[徐泽敏,何军.战场态势三维图形仿真系统的设计与实现[J].计算机应用,2009,29(6):313-316.]
[11]XIAO Peng,LIU Gengdai,Xu Mingliang.OpenSceneGraph 3D rendering engine programming guide[M].Beijing:Tsinghua U-niversity Press,2010:289-307(in Chinese).[肖鹏,刘更代,徐明亮.OpenSceneGraph三维渲染引擎编程指南[M].北京:清华大学出版社,2010:289-307.]
[12]Donald Hearn,Pauline Baker M.Computer graphics with OpenGL[D].3rd ed.CAI Shijie,transl.Beijing:Electronic Industrial University Press,2006:216-242(in Chinese).[Donald Hearn,Pauline Baker M.蔡士杰,等译.计算机图形学[D].3版.北京:电子工业大学出版社,2006:216-242.]