基于Direct 3D的三维航迹绘制

2015-09-09 11:13姚崇徐明隋晓奎
电脑知识与技术 2015年16期

姚崇 徐明 隋晓奎

摘要:为了充分利用飞行参数记录系统记录的飞行数据,提出一种对飞行参数进行预处理和利用Direct3D绘制飞行三维航迹的方法,采用以上方法绘制的航迹顶点和三角形图元数据量较小,程序运行流畅、性能稳定,能够满足飞行参数再现的需求。

关键词:三维航迹;飞参数据;Direct3D

中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2015)03-0246-02

Based on the Direct 3D Three-Dimensional Track is Drawn

YAO Chong,XU Ming,SUI Xiao-kui

(Unit 93199 Ttheory Training Department,Harbin 150000,China)

Abstract: in order to make full use of the flight parameter recording system record the flight data, preprocessing and put forward a kind of flight parameters by using the method of Direct3D rendering 3D flight track, using the above method to track the vertices and triangles primitive data quantity is small, the program runs smooth, stable performance and can meet the needs of flight parameter representation.

Key words: 3D track;According to the flying parameters;Direct3D

目前,我军某型教练机装备的飞行参数记录系统记录的飞行参数包括了飞行过程中的飞行状态和设备工作性能等参数。充分利用该信息资源,不仅可以监控飞机的安全工作能力,辅助飞行事故调查,而且也可以帮助飞行员及时了解飞行课目的实际完成情况,检查飞行训练质量[1]。

为了便于检查飞行训练效果,需要利用飞参数据对飞行过程进行仿真再现。本文主要介绍对GPS数据进行预处理以及利用Direct3D绘制飞行立体航迹的方法。

1 GPS数据预处理

本文中用于飞行再现的GPS数据来自飞机飞行过程中采集和记录的数据,由于飞机的飞行环境较为复杂,安装在飞机上的传感器对数据的采集精度和采样频率也较为有限,因此不可避免地存在各种误差,甚至是误记录。在使用该数据进行轨迹再现时,必须对数据进行预处理。数据预处理包括野值的剔除、数据平滑和插值等。对于野值数据的处理通常采用的方法是低阶多项式滑动拟合方法来识别异常数据[2]。数据平滑的方法有多种,本文根据GPS数据的实际情况选择五点线性平滑算法进行处理。由于某型教练机的飞参记录系统数据采集和记录频率最高的为每秒钟8次,该频率对于飞行再现是远远不够的,因此还需要对数据进行插值处理,本文为了提高数据处理的速度,采用线性插值算法。经过以上处理后的航迹如下图所示:

图1 平面航迹

2 航迹绘制

Direct3D是由微软开发的DirectX交互媒体技术的实时三维图形组件,它为程序员提供了一个底层的、高性能的接口,它同硬件相结合,具有同设备无关的灵活性,因此成为三维图形程序设计的首选工具[3]。在Direct3D中,由基本的点组成图元(Primitive),图元是Direct3D中最小的图像元素,进行3D渲染时,就是以图元为单位。Direct3D设备支持的图元类型包括:点列表、线列表、线条纹、三角列表、三角条纹和三角扇形图元[4]。线条纹图元的每个单元都是一条线,进行3D渲染时,把所有的点用线段进行连接,然后进行渲染。使用线条纹渲染时,可以组成各种曲线等。三角条纹图元的每个单位都是一个三角形,需要由3个顶点组成一个三角形图元,每个相邻的三角形是相连在一起的。进行3D渲染时,把每3个点用线段进行连接,然后进行渲染,由于图元中各点的位置不同,连接的方式也不相同,因此通过三角条纹图元可以组成任意复杂的三维对象。

本文中的三维航迹就是采用以上两种图元进行绘制的。首先,由于在飞参数据预处理阶段已经求得了飞行航迹的各点坐标,通过该航迹各点的坐标可以求得飞机两侧机翼端点的航迹坐标,将两端点航迹坐标按照三角条纹图元的顺序进行连接,从而实现了绘制航迹彩带的功能。其次,由于采用以上方法绘制的航迹彩带是没有厚度的,即当从航迹彩带的侧面观察航迹时是看不见任何图形,因此本文采用了在航迹彩带两侧绘制线条列表图元的方法进行解决。最后通过配合方向、位置即时变化的飞机模型,使得航迹彩带的表现形象、直观,不仅可以反映飞机的运动趋势和方向,还可以反映航向上各点飞机的俯仰、倾斜、航向等航姿信息。

采用Direct3D绘制平面图形的关键技术有:

①生成航迹彩带顶点数据。顶点数据的生成方法为:首先定义两个顶点(Vector3Left和Vector3Right)为飞机中心相对于机身侧轴偏移一个单位的长度,然后按照飞机每一时刻的姿态参数,相对于飞机中心对顶点数据进行变换,最后再将该顶点数据平移到飞机每一时刻的位置处。其关键代码如下:

D3DXVECTOR3 Vector3Left=D3DXVECTOR3(1,0,0);

D3DXVECTOR3 Vector3Right=D3DXVECTOR3(-1,0,0);

D3DXMATRIX matRotZ;

D3DXMatrixRotationZ(&matRotZ, Gama);

D3DXVec3TransformCoord(&Vector3Left,&Vector3Left,&matRotZ);

D3DXVec3TransformCoord(&Vector3Right,&Vector3Right,&matRotZ);

D3DXMATRIX matRotY;

D3DXMatrixRotationY(&matRotY, Psi);

D3DXVec3TransformCoord(&Vector3Left,&Vector3Left,&matRotY);

D3DXVec3TransformCoord(&Vector3Right,&Vector3Right,&matRotY);

D3DXMATRIX matTranslation;

D3DXMatrixTranslation(&matTranslation, X,Y,Z);

D3DXVec3TransformCoord(&Vector3Left,&Vector3Left,&matTranslation);

D3DXVec3TransformCoord(&Vector3Right,&Vector3Right,&matTranslation

②计算顶点法线。顶点法线是过顶点的一个矢量,用于在Gouraud Shading中计算光照和纹理效果。在生成曲面时,通常令顶点法线和相邻平面的法线保持等角,这样进行渲染时,会在平面拼接处产生一种平滑过渡的效果。基于以上思想,以上代码分别计算出了与每个顶点相邻的三个平面的法线,然后再对三个平面法线求与其等角度的顶点法线。其关键代码如下:

pVertex[i].Normal=(ComputeTriNormal(pVertex[0+VerList].Vector3,pVertex[1+VerList].Vector3,pVertex[2+VerList].Vector3)+ComputeTriNormal(pVertex[3+VerList].Vector3,pVertex[2+VerList].Vector3,pVertex[1+VerList].Vector3)+ComputeTriNormal(pVertex[2+VerList].Vector3,pVertex[3+VerList].Vector3,pVertex[4+VerList].Vector3))/3;

③计算面法线。面法线的计算首先需要计算出三角形图元的两条边的矢量,然后再计算出于这两条边相互垂直的矢量即为该平面的法线。

D3DXVECTOR3 NormalVec;

D3DXVECTOR3 tmpV1=v1-v2;

D3DXVECTOR3 tmpV2=v1-v3;

D3DXVec3Cross(&NormalVec, &tmpV1, &tmpV2);

④设置材质:

D3DMATERIAL9 mtrl;

mtrl.Diffuse = mtrl.Ambient = D3DCOLORVALUE(0.4f,0.6f,1.0f,0.6f);

mtrl.Specular = D3DCOLORVALUE(1.0f, 1.0f,1.0f, 1.0f)

mtrl.Power=50.0f;

pd3dDevice->SetMaterial( &mtrl );

以上代码定义了一个材质对象,并对材质对象的漫反射、环境光和高光部分的颜色和透明度赋值。

⑤创建顶点缓冲区

pd3dDevice->CreateVertexBuffer(dwSizeofVertices,D3DUSAGE_WRITEONLY, FVF,D3DPOOL_MANAGED, &pVB, NULL );

以上代码按照顶点缓冲区的大小定了以顶点缓冲区。

⑥顶点缓冲区赋值

pVB->Lock( 0, dwSizeofVertices, (VOID**)&pVertices, 0 )

memcpy( pVertices, pVertex, dwSizeofVertices);

pVB->Unlock();

以上代码实现了对定义的顶点缓冲区进行赋值的功能,即将顶点数据填充到顶点缓冲区。

基于以上技术实现的三维航迹效果图如下图所示:

图2 三维航迹

3 结束语

为了充分、合理利用飞行参数记录系统记录的飞行数据,本文论述了对飞参系统记录的经纬度数据进行预处理,以及采用Direct3D技术绘制三维航迹的方法,实现了飞行轨迹的再现功能。采用此方法绘制的飞行航迹,比较真实地反映了飞行实际,并且可以任意旋转、缩放、平移,有很强的直观性和可操作性。为飞参数据的综合利用奠定了基础,为监控飞行训练质量、提升飞行技术和提高训练效益,提供了一种有效的技术手段。

参考文献:

[1] 曲建岭, 唐昌盛, 李万泉. 飞参数据的应用研究现状及发展趋势[J]. 计测技术, 2007,27(6): 4-7,11.

[2] 蔡金狮, 解放军总装备部, 军事训练教材编委会. 飞行器系统辨识学[M]. 北京: 国防工业出版社, 2003.

[3] Engel,W,F, 周惟迪, 徐翎. Direct3D游戏编程入门教程[M]. 北京: 人民邮电出版社, 2005.

[4] 杨青, 杨磊. 3D 游戏编程[M].北京: 中国科学技术出版社, 2004.