首页 文学文摘 时政新闻 科技科普 经济法律 健康生活 管理财经 教育教学 文化艺术 社科历史

基于VEGA的虚拟战场中雨雪特效模拟

作者:聂文兵 来源:现代电子技术


  摘 要:雨雪是一种重要的自然现象,对雨雪特效的模拟可以大大提高虚拟战场的逼真度。在分析粒子系统创建自定义特效的基础上,利用视景仿真工具Vega实现了虚拟战场中的雨雪特效模拟。使用坐标平移的方法,把特效位置定位于视点前,使其漫游时始终在视点前面,从而达到整个虚拟战场场景充满雨雪特效的效果。
  关键词:虚拟战场;Vega;粒子系统;特效;模拟
  中图分类号:TP391文献标识码:A
  文章编号:1004-373X(2009)10-048-03
  
  Simulation of Rain and Snow in Virtual Battle Based on VEGA
  NIE Wenbing
  (Unit Battle Lab of Nanchang Army Academy,Nanchang,330103,China)
  Abstract: Rain and snow is important phenomena of nature,simulation of rain and snow special-effect can improve lifelike qualities of virtual battle.Simulation of rain and snow special-effect in virtual battle based on analyzing creating of user-defined special-effect,and the effectiveness of filling rain and snow special-effect in virtual battle by using method of coordination transformation are implemented.
  Keywords:virtual battle;Vega;particle system;special-effect;simulation
  
  0 引 言
  
  虚拟战场的目的就是让指挥员能够充分利用虚拟作战环境实施指挥活动。作战环境千变万化,天气因素、昼夜影响等自然条件都会给作战指挥带来不同程度地干扰,为确保虚拟战场能最大限度的提供一个多样化的训练场景,给指挥员创造更好地发挥指挥才能,体现指挥艺术的机会,同时增加虚拟战场的真实性和实用性,就需要在虚拟战场中创建包括雾、雨、雪等天气环境。
  Vega是美国MultiGen-Paradigm公司用于虚拟现实、实时视景仿真、声音仿真以及其他可视化领域的世界领先级视景开发软件。它可直接使用其自身提供的功能函数库开发三维场景中所需要的大多数特殊效果,从而大大提高了可视化仿真特殊效果部分的开发效率。基于Vega开发平台,实现了虚拟战场中雨雪特效的模拟。
  
  1 利用粒子系统创建自定义特效
  
  在虚拟战场中,有些诸如烟雾、火焰、雨雪等自然现象和不规则对象,它们不仅有复杂的逻辑结构,而且还会动态地发生变换,很难用传统的几何建模方式来表现。粒子系统(Particle System)是迄今为止计算机图形学中用于描述不规则对象最成熟的理论之一,也是视景仿真领域模拟自然现象和特殊效果的方法中视觉效果最好的一种。粒子系统的基本思想是,采用大量具有一定生命和属性的微小粒子图元作为基本元素来描述不规则对象。粒子系统中的每一个粒子具有形状、大小、颜色、透明度、运动速度、运动方向、生命周期等相关属性,其中很多属性都可以是时间的函数。随着时间的推移,每个粒子都会经历“产生”、“活动”和“消亡”三个阶段。特定的粒子系统一般都是基于物理模型的,这样才能模拟出真实的效果,比如对重力场的模拟,对自然风的模拟等。一般而言,创建特定的粒子系统是一个比较复杂的过程,不仅要考虑真实的物理模型和相应的动力学规律,还需要对粒子的大量属性分别设置。
  1.1 典型粒子的基本属性
  典型粒子的基本属性包括:
  (1) 粒子生命周期(Life Cycle);
  (2) 粒子个数(N.Particles);
  (3) 粒子源(Particle Source);
  (4) 粒子速度分布(Velocity Distribution);
  (5) 粒子运动边界盒(Bounding Box);
  (6) 粒子发射类型(Flow Type);
  (7) 重力矢量(Gravity Vector)。
  1.2 粒子系统中和时间相联系的属性
  粒子系统中和时间相联系的属性有:
  (1) 速度矢量(Velocity Vector);
  (2) 风速矢量(Wind Velocity Vector);
  (3) 球形速度(Spherical Velocity);
  (4) 随机速度(Random Velocity)。
  1.3 粒子性质
  粒子性质有:
  (1) 粒子尺寸(Particle Size);
  (2) 粒子流长度(Particle Stream Length);
  (3) 粒子颜色(Particle Color);
  (4) 粒子发射率(Particle Emissivity);
  (5) 粒子光照(Particle Lighting);
  (6) 粒子温度(Particle Temperature)。
  
  2 Vega编程实现
  
  2.1 Vega特殊效果模拟模块介绍
  在诸如战场模拟视景仿真应用中,经常需要模拟出一些特殊的三维效果,以增强整个虚拟战场的感染力和真实性,比如各种武器的开火效果、各种炸弹的爆炸效果、直升机上螺旋桨的旋转效果、导弹发射后飞行的围棋痕迹等。通常这些效果很难用传统的多边形建模技术来实现,一般的解决方案是应用高级的纹理技术或者使用复杂的粒子系统。
  Vega特殊效果模拟模块(Vega Special Effects)就是运用粒子动画技术和纹理技术产生可实时应用的特殊效果。该模块预定义的常用特殊效果包括:爆炸、闪光、开火、飞行导弹尾迹、螺旋桨旋转、烟雾、光点跟踪等。同时,特殊效果模拟模块还提供了功能强大的自定义粒子系统,用户可以通过LynX图形界面操作或者API接口编程进行交互设置,从而实现更加复杂的能满足特定仿真应用的特殊视觉效果。
  2.2 雨雪特效的实现
  由于雨雪粒子在物理属性上有着很多相似性,除了大小、速度可以有所不同之外,其他属性均可定义为统一的。这里只用雨特效代码说明特效的实现过程。
  (1) 包含头文件:#include "vgfx.h";
  (2) 初始化:在runVegaApp()中添加环境效果指针vgEnvFx* EnvFx =NULL和特效系统初始化vgInitFx();
  (3) 在自己的视图类中添加特效代码:
  …
  void CVegaView::OnShowrain()
  {
  …
  if(!m_bHaveShowrain)
   {
  m_bHaveShowrain=TRUE;
  pRainFx =vgFindFx("Rain");
  if(pRainFx ==NULL)
  {//创建特效
  CreateRainFX();
  }
  vgAddSceneFx(vgGetScene(0),pRainFx);//将创建的特效加入到虚拟场景中
  
  vgAddFunc(pRainFx,VGCOMMON_POSTUPDATE,ChangeFXpos,NULL);//回调函数
  vgProp(pRainFx,VGFX_STATE,VG_ON);
  vgEnvfxColor(envfx,0.55f,0.55f,0.55f);//指定降雨时环境效果颜色分量
  }
   else
   {
  vgDelFunc(pRainFx,VGCOMMON_POSTUPDATE,ChangeFXpos,NULL);
  vgProp(pRainFx,VGFX_STATE,VG_OFF);
  vgRemSceneFx(vgGetScene(0),pRainFx);
  vgEnvfxColor(envfx,1.0f,1.0f,1.0f);
  m_bHaveShowrain=FALSE;
   }
  …
  }
  void CVegaView:: CreateRainFX()
  {
  pRainFx = vgNewFx(VGFX_CUSTOM);
  vgName(pRainFx,"Rain");
  vgProp(pRainFx,VGFX_ALPHA,1.0);
  vgProp(pRainFx,VGFX_AUTO,VG_OFF);
  vgProp(pRainFx,VGFX_DURATION,VGFX_ALWAYS);
  vgProp(pRainFx,VGFX_FADEDUR,VGFX_SAMEASDURATION);
   //控制下雪规模
  vgFxScale(pRainFx,50.0f,50.0f,20.0f);
   //自定义特效属性
  vgProp(pRainFx,VGFX_STATE,VG_ON);//激活自定义特效
  vgProp(pRainFx,VGFX_STARTTIME,VGFX_NOW);
  vgProp(pRainFx,VGFX_XFORMDLIST,VGFX_XFORM);
  vgProp(pRainFx,VGFX_NPARTICLES,1000.0);//粒子个数
  vgProp(pRainFx,VGFX_SRCRAD,30.0);//设定粒子源半径
  vgProp(pRainFx,VGFX_SIZEVAR,0.07);// 设定粒子大小范围
  vgProp(pRainFx,VGFX_COLORVAR,0.09);// 设定粒子色彩范围
  vgProp(pRainFx,VGFX_VDIST,VGFX_VDIST_PLANE);//粒子速度分布(平面型)
  vgProp(pRainFx,VGFX_SRCSHAPE,VGFX_SRCSHAPE_SQUARE); //粒子形状(方形)
  vgProp(pRainFx,VGFX_FLOW,VGFX_FLOW_STREAM);//粒子发射类型(连续式)
  vgProp(pRainFx,VGFX_LCYCLE,7.0); //设定生命周期
  vgProp(pRainFx,VGFX_EMISSION,0.0);//设定粒子发射率
  vgProp(pRainFx,VGFX_LIGHTING,VG_OFF);//是否有光照
  vgFxColor(pRainFx,1.0,1.0,1.0);//设定自定义特效初始颜色
  // vgAttriList函数用于设定粒子系统如何随时间变化
   float sct[5] = { 0.0,0.5,0.5,0.5,0.5 };
   vgAttrList(pRainFx,VGFX_CT,sct,1); //粒子将会着色的颜色变化表
   float sbBox[6] = { 0.0,0.0,0.0,0.0,0.0,0.0 };
   vgAttrList(pRainFx,VGFX_BBOX,sbBox,1);//粒子运动边界盒
   float svVector[4] = { 0.0,0.0,0.0,0.0 };
   vgAttrList(pRainFx,VGFX_VVECTOR,svVector,1);//速度矢量
   float swVector[4] = { 0.0,-5.0,0.0,0.0 };
   vgAttrList(pRainFx,VGFX_WVECTOR,swVector,1);//风速矢量
   float sgVector[3] = { 0.0,0.0,-5.0 };
   vgAttrList(pRainFx,VGFX_GVECTOR,sgVector,1);//重力矢量
   float svRnd[2] = { 0.0,3.0 };
   vgAttrList(pRainFx,VGFX_VRANDOM,svRnd,1);//随机速度
   float svSphere[2] = { 0.0,0.0 };
   vgAttrList(pRainFx,VGFX_VSPHERE,svSphere,1);//球形速度
   float spsz[2] = { 0.0,0.3f };
   vgAttrList(pRainFx,VGFX_PSZ,spsz,1);//粒子尺寸随时间缩放
   float spst[2] = { 0.0,1.0 };
   vgAttrList(pRainFx,VGFX_PST,spst,1);//粒子流长度
   float stemp[2] = { 0.0,293.0 };
   vgAttrList(pRainFx,VGFX_TEMPERATURE,&stemp,1);//粒子温度
   //特效贴图设置
   vgFxTexFile(pRainFx,"steam.inta");
   vgDelPos(pos);
   vgProp(pRainFx,VGFX_STATE,VG_OFF);
   …
  }
  (4) 在需要打开特效的函数中添加:
  vgProp(pRainFx,VGFX_STATE,VG_ON);
  2.3 保持雨雪特效始终在视点前
  在Vega中,雨雪特效的粒子数有限,但三维空间的范围很大。雨雪特效只能占据很小的空间,这样在有些地方有雨雪,而大部分地方没有雨雪。如果改变源半径,则因为场景太大,而必须加大粒子数量,这会影响速度。在Vega以前,开发系统中这些特效只能随着Player,而不能随着Observer。这里就是把这些特效依附在Observer,根据视场大小确定源半径和包围盒大小,利用坐标平移的方法再现自然景观,并把特效位置定位于视点前,然后随着视点的移动,长方体区域也随之移动。这样,只需要很少的粒子数量就可以实现特效一直在观察者前,感觉整个场景都有雨雪特效,其坐标变示意图如图1所示。
  假设原来视点位置S0,其坐标为(x0,y0,z0)。在进行漫游时,视点的位置发生变化,故假设视点的运动速度为v0,运动时间为t0,则S1~S0的距离为:
  S1=v0t0(1)
  图1 坐标变换示意图
  假设视线方向与水平面的夹角为α,与xoz平面的夹角为β,则S1的坐标(x1,y1,z1)为:
  x1=v0t0cosαsinβ+x0
  
  y1=v0t0cosαcosβ+y0
  z1=v0t0sinα+z0(2)
  同理,可以求得O0相对于O1的位置,坐标同样可以求得。因此,无论观察者的位置如何变化,始终能够看到雨(雪)景。
  void CVegaView::ChangeFXpos()
  {
  …
  vgGetPos(vgGetObsver(0),pos);//获得观察者坐标
  vgGetPosVec(pos,&x,&y,&z,&h,&p,&r);//导出各参数
  vgPosVec(pos,x,y,z,h,p,r);//修改视点坐标
  vgPos(pRainFx,pos);// 设置特效位置
  …
  }
  基于Vega产生的虚拟战场中的雪景、雨景效果如图2所示。
  图2 利用粒子系统技术实现的雪、雨特效
  
  3 结 语
  
  这里实现的雨雪特效模拟已经运用到某型火箭炮作战指挥训练仿真系统等仿真训练系统中,大大增加了仿真训练系统中虚拟战场的逼真度,取得了良好的渲染效果和训练效果。
  
  参考文献
  [1]王乘,李利军.Vega实时三维视景仿真技术[M].武汉:华中科技大学出版社,2005.
  [2]杨平利,仇小鹏,黄少华,等.在Vega环境下开发虚拟现实应用程序[J].计算机仿真,2005,22(5):165-168.
  [3]龚卓蓉.Vega程序设计[M].北京:国防工业出版社,2002.
  [4]MultiGen Paradigm Inc..Vega Programmers Guide (Version3.7)[Z].USA:MultiGen Paradigm Inc.,2001.
  [5]王润杰,田景全,倪政国.基于粒子系统的实时雨雪模拟[J].系统仿真学报,2003,15(4):495-497.
  [6]苏虎.列车驾驶视景仿真中自然现象的模拟[J].中国铁道科学,2003,24(1):19-22.
  [7]尹勇.自然现象的实时仿真[J].系统仿真学报,2002,14(9):1 217-1 219.
  [8]陈蕾,陈贺新.在飞行模拟器中实现雪的实时模拟[J].吉林大学学报:工学版,2005,33(2):164-165.
  [9]朱儒芳,任波,陈鹏,等.基于Vega的特殊效果三维可视化仿真[J].计算机与数字工程,2006,34(8):85-86.
  [10]李炯,雷虎民,刘兴堂.基于Vega的实时场景渲染技术研究[J].航天控制,2004,22(2):46-49.