一种基于OpenSceneGraph的实时战场仿真系统及方法_2

文档序号:9432838阅读:来源:国知局
成战场环境中的态势要素,所述态势要素包括,真实模 型库中武器装备模型,以及军标库中的符合中国军队标准的图形和符号。
[0068] 环境仿真模块20,用于对战场环境进行仿真,其特征在于,所述环境仿真模块包 括:
[0069] 地形仿真单元210,通过VirtualPlanetBuilder基于数据层提供地高精度地形数 据,由高程文件生成地形数据库进行地形仿真;
[0070] 所述地形仿真单元210采用金字塔形分层技术构建不同高度不同颜色的着色模 型,通过视点计算实现动态加载地形数据(即通常使用的LOD技术)。
[0071] 其高层着色算法为:
[0072] i.设置颜色表,如下表:
[0074] 其中,Heightl、Height2 至 Heightn 为不同顶点数据的高度,Colorl、Color2 至 Colorn为不同高度的顶点数据所顶点颜色数值。
[0075] ii.根据地形数据库获取到顶点数据的高度,在颜色表中查找数据进行插值,假设 顶点高程在Height2与Heightl之间,则其顶点颜色数值Colorx的插值算法如下所示。
[0076] Colorx = Colorl+(Color2~Colorl)^Height/(Height2-Heightl)
[0077] iii.将计算得出的Colorx值设置到该顶点保存。
[0078] iv.渲染时,GPU读取该顶点保存的Colorx颜色数据并进行地形环境渲染。
[0079] 通过使用上述方法,较现有技术而言,实现了在没有纹理的情况下让地形更加有 层次感。
[0080] 天气仿真单元220,用于通过计算不同时段太阳所处的位置,得出相应时段的光照 颜色和强度,同时,并根据所要仿真的不同的天气情况下的天空环境将其渲染到天空上。
[0081] 具体的,所述太阳的的位置通过对以下参数进行运算得到:
[0082] 【参数1】:·太阳到地球距离ER:
[0083] 可通过如下公式得到:
[0084] ER = I. 000423 + 0. 032359sin θ + 〇. 〇〇〇〇86sin2 θ - 0.008349cos θ +〇. 〇〇〇115cos2 θ
[0085] θ 称日角:θ = 2 π t/365. 2422
[0086] t又由两部分组成:t = N - NO
[0087] N为积日,表示日期在年内的顺序号,例如,1月1日其积日为1,平年12月31日的 积日为365,闰年则为366,等等。
[0088] NO = 79. 6764+0. 2422X (Y - 1985) - INT〔(Y - 1985)/4〕,其中 Y 表示年份, INT表示只取(Y - 1985)/4的计算结果的整数部分。
[0089] 【参数2】:太阳赤炜角ED :
[0090] 地球绕太阳公转的轨道平面称黄道面,而地球的自转轴称极轴。极轴与黄道面不 是垂直相交,而是呈66. 5°角,并且这个角度在公转中始终维持不变。正是由于这一原因形 成了每日中午时刻太阳高度的不同,以及随之而来的四季的变迀。日地中心的连线与赤道 面间的夹角每天(实际上是每一瞬间)均处在变化之中,这个角度称为太阳赤炜角。它在 春分和秋分时刻等于零,而在夏至和冬至时刻有极值,分别为正负23. 442°。
[0091] ED = 0· 3723+23. 2567sin Θ +〇· 1149sin2 Θ - 〇· 1712sin3 Θ - 〇· 758cos Θ +〇· 36 56cos2 θ +〇. 0201cos3 θ
[0092] 【参数3】:时差Et :
[0093] 真正的太阳在黄道上的运动不是匀速的,而是时快时慢,因此,真太阳日的长短也 就各不相同。但人们的实际生活需要一种均匀不变的时间单位,这就需要寻找一个假想的 太阳,它以均匀的速度在运行。这个假想的太阳就称为平太阳,其周日的持续时间称平太阳 日,由此而来的小时称为平太阳时。
[0094] 平太阳时S是基本均匀的时间计量系统,与人们的生活息息相关。由于平太阳是 假想的,因而无法实际观测它,但它可以间接地从真太阳时S Θ求得,反之,也可以由平太 阳时来求真太阳时。为此,需要一个差值来表达二者的关系,这个差值就是时差,以Et表 示,其中带Θ下标的符号表示是真太阳时。
[0095] S Θ = S+Et
[0096] Et = 0· 0028 - I. 9857sin Θ +9. 9059sin2 Θ - 7. 0924cos Θ - 〇· 6882cos2 Θ
[0097] 【参数4】:太阳高度角h Θ :
[0099] δ就是太阳赤炜角,即Ed,q>为当地的地理炜度,τ为当时的太阳时角。
[0100] τ = (S Θ +F Θ /60-12)*15°
[0101] Sd = S+ (F- (120 ° - (JD+JF/60))*4)/60
[0102] S Θ = Sd+Et/60
[0103] JD为传入经度值度,JF为传入经度值分,S为时间,F为分钟
[0104] 【参数5】:太阳方位角A:
[0106] 由此可求出两个A值,第一个A值是午后的太阳方位,
[0107] 当 cosA 彡 0 时 90° 彡 A 彡 180。
[0108] 当 cosA 彡 0 时 0 彡 A 彡 90°
[0109] 第2个A值为午前的太阳方位,取360° - A。
[0110] 通过计算得到不同时段的太阳高度角、太阳方位角和太阳到地球距离,再对三者 进行运算得到所述不同时段太阳所处的位置,根据太阳位置计算出光照颜色和强度参数传 入GPU渲染整个场景。
[0111] 所述光照在 OpenGL 中具体分为 Ambient, Diffuse, Specular, Emiiter 四部分,通 过将这四部分与法线进行一定比例运算以及将各部分光混合后得出顶点颜色值并进行光 照渲染。
[0112] 其中,Diffuse光计算的算法公式为,图3A为公式中Θ角示意图:
[0113] I0=LdXMdXcos(Q)
[0114] Specular分量计算的算法公式为,图3B为公式中各参数的向量图:
[0115] R = -2N(LXN)+L
[0116] Spec = (RXEye)2XL1XM1
[0117] 其中:
[0118] Ld、Md表示光源和物质和diffuse属性;
[0119] L向量:表示光源---> 顶点,N:法向量,Eye向量:顶点--->Eye,R:反射光,Q、 MAv别表示光源和物质的Specular属性。
[0120] 所述不同的天气情况包括:晴天、阴天、雨天、雪天;所述天空环境包括:太阳位 置、月亮、星星、光照。
[0121] 晴天时:在日间读取太阳纹理,并渲染出太阳的位置以及光照的颜色和强度;
[0122] 其中,太阳位置与光照颜色和强度关系如下代码所示:
[0123] SunAlt:太阳方位角。
[0124] double red = sunAlt*0· 5 ;
[0125] double green = sunAlt*0· 25 ;
[0126] double blue = sunAlt*0. 125 ;
[0127] red = red<0. 0 ? 0. 0:red ;
[0128] red = red>l. 0 ? I. 0:red ;
[0129] green = green<0. 0 ? 0. 0: green ;
[0130] green = green>l. 0 ? I. 0: green ;
[0131] blue = blue〈0. 0 ? 0· 0:blue ;
[0132] blue = blue>l. 0 ? I. 0:blue ;
[0133] osg::Vec4 diffuse (red, green, blue, I);
[0134] red = (sunAlt+10. 0) *0· 04 ;
[0135] green = (sunAlt+10. 0) *0· 02 ;
[0136] blue = (sunAlt+10. 0) *0· 01 ;
[0137] red = red<0. 0 ? 0. 0:red ;
[0138] red = red>0. 2 ? 0. 2:red ;
[0139] green = green<0. 0 ? 0. 0: green ;
[0140] green = green>0. 2 ? 0. 2: green ;
[0141] blue = blue〈0. 0 ? 0· 0:blue ;
[0142] blue = blue>0· 2 ? 0· 2:blue ;
[0143] osg::Vec4 ambient (red, green, blue, I);
[0144] osg::Vec4 Specular = diffuse ;
[0145] 夜间读取月亮纹理,停止渲染太阳的位置和光照,通过GPU随机渲染星星的位置:
[0146] 其中渲染星星的Shader (着色器)代码如下:
[0148] 阴天时:日间和夜间均停止渲染太阳、月亮纹理以及太阳光照,加入全局雾特效, 所述全局雾特效通过太阳位置来计算全局雾的颜色,使整个场景达到阴沉的效果。
[0149] 其中,阴天
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1