基于Vega的鱼雷弹道视景仿真软件设计
基于VegaPrime的弹箭视景仿真

224
弹箭与制导学报
2007 年
m_f x - > addVelocit y (0. 0f , vuVec3d ( V x ,
Vy , Vz ) ) ; 尾焰特效的开启和关闭可直接调用函数实现 :
virt ual void set Enable ( bool bValue ) ; 2. 4 用 OpenFlight API 绘制飞行器运动轨迹
} mgWriteDb (db) ; / / 写入数据库 mgClo seDb (db) ; / / 关闭数据库 2. 5 用渲染掩码控制对象显示状态 在 Vega Prime 中 ,可以设置渲染掩码 ( Ren2 derMask) 的对象有 vsChannel 和 vsNode 两类 , 通过设置它们之间的掩码值 ,可以控制 vsNode 在 vsChannel 中是否显示 ,即 : 在视景输出中是 否显示某一对象或对象的一部分 。 设 置 渲 染 掩 码 的 函 数 为 set RenderMask ( uint mask) ,决定在某通道中是否显示某结点 的因素是他们二者各自掩码的对应位之间“位与 操作 (AND) ”的最后结果 ,若非零则显示 ,否则 不显示 。表 1 列出了利用渲染掩码控制三个结 点在三个通道中的显示情况 ,从表可见 ,通过控 制通道和结点间对应位的掩码值 ,成功实现了结 点显示与否的控制 :结点 A 在通道 C 中不显示 , 结点 B 在通道 B 中不显示 ,而结点 C 在所有 A 、 B 、C 三个通道中都显示 。
int vp Window ∷addChannel ( vp Channel 3 channel) ;
视图的缩放操作可以通过两个途径实现 :改 变观察者与对象间的距离 ,或改变通道的视场 角 若将观察者与被观察对象间距离缩小 ,则观 察者所看到的物体就是较为详细的 ,显示在窗口 上的结果就是放大操作 。同样 ,减小通道的视场 角 ,观察者视野范围内所能见到的对象将有所减 少 ,显示在窗口上就相当于对象被进行了放大操 作 。改变通道视场角的函数为 :
基于Vega的航天发射场视景仿真系统实现

第2卷 4 第o期 6
文章编号 :0 6—9 4 (0 7 0 10 3 8 2 0 )6—0 6 0 2—0 4计 算 机 仿 真 源自27 6 0 年0 月 0
基 于 Vea的 航天 发 射 场 视 景 仿 真 系统 实 现 g
柴毅 史晶晶 冯大龙 , ,
( .重庆 大学 自 1 动化学 院智能研究二室 , 重庆 40 4 ; 00 4 2 71 . 85 5部队 , 四川 成都 6 0 3 ) 10 6 摘要 : 了适应现代化航天技术 的发展 , 为 需要建立先进的数 字化航 天发射场视 景仿真系统来保 障和辅助航 天发 射任务 的顺 利开展和实施 。 以某卫星发射场为研究对象 , 提出了采用基 于三维几何模型构建及动态显示技术的虚拟场景创建方法 , 利用 M lG n r t 和 V g 软件平台 , u i e e o t C a r ea 并结合 c+ +编程语 言, 开发 出一个完整 的交互式航天发射场及火箭发射三维视景仿真 系统 , 并介绍 了其系统设计 、 开发流程及关键技术 。 系统在实 际发射任务 中的使用结果表明 , 系统运行稳定 , 仿真效果真实流
畅, 能够 实现预计 的功能 和效果 。
关键 词 : 景仿真 ; 视 三维建模 ; 关键技术 ; 实时驱动
中图分类号 :P 9 . T 3 19 文献标识码 : A
I p e e t to fLa n h S t c n i u a i n S se Ba e n Ve a m l m n a i n o u c ie S e e S m l to y t m s d o g
ABS TRACT:n o d r t e a a t d t h e e o me to p c fih e h o o y n a v n e i i l s e e I r e o b d p e o t e d v lp n f s a e g tt c n l g ,a d a c d d g t c n l a smu a i n s se o p c f g t a n h st e u r d t u p r ei l me tto f a n h mi so .B s d o i l t y t m f a e i h u c i i r q ie s p o t mp e n a i n o u c s i n o s l l es o t h l a e n a s a e i h a n h st t ep p r r p s sa me h d t r a e vru l c n a e n 3 d ln n y a c p c f g t u c i l l e, h a e o o e t o c e t i a e eb s d o D mo e i g a d d n mi p o t s vs o e h o o y e e o s a w o e i tr ci e s e e smu a in s se o a n h s t n o k t lu h n y iin t c n l g ,d v l p h l n e a t c n i l t y t m fl u c i a d r c e a c i g b v o e u i g Mu tGe e t r Ve a s f r lto m n + p o r mmi g l n u g .T e e p p ri t d c st e sn l i n Cr a o/ g o t e p a f r a d C r g a wa n a g a e h n t a e n r u e h h o s se d sg y tm e i n,d v l p n o n e e h o o is I h cu l lu c s i n,t e s se c n a h e e e e o me t f w a d k y t c n lg e . n t e a t a a n h miso l h y t m a c iv e p c e fe t x e t d ef c . KEYW ORDS:S e e smu a in; D mo e i g Ke e h oo y Re l— t rvn c n i lt o 3 d l ; y t c n lg ; a n i diig me
基于Vega的某激光末制导武器视景仿真关键技术

vgSymSwitchMaskIndex( pFswitch4,( int) valD /1000) ;
/ / 千位数值作 Switch 节点掩码
显示效果如图 5 所示。
2. 4 测距、照射功能的实现
虚拟战场环境中,模拟训练系统并不实际发射激光脉冲,
而是在模拟激光测距时,假设初始点 O( x0 ,y0 ,z0 ) 发射一条 激光光柱与目标发生碰撞,通过碰撞检测模型来确定碰撞点
2 关键技术及实现方案
系统在视景仿真开发中,选用 3DS Max 和 Creator 软件建 立仿真模型,选用 Vega 作为实时仿真开发软件,利用 Lynx 图 形用户界面对虚拟场景进行初始化设置和预览,调用 Vega API 函数来实现场景的渲染和模型驱动。 2. 1 装备三维模型的建立及优化
首先利用 3DS Max 建立实体模型。在建立模型时,选择
基于 Vega 的某激光末制导武器视景仿真关键技术
刘庆国1* ,张君儒2 ,陈 蕾3
( 1. 沈阳炮兵学院 自行火炮系,沈阳 110162; 2. 沈阳炮兵学院 训练部,沈阳 110162; ( * 通信作者电子邮箱 895478778@ qq. com)
3. 沈阳炮兵学院 科研部,沈阳 110162)
图 4 左目镜数字显示纹理图
这样在系统获取观目距离后,提取出个、十、百、千位上的
数值。部分程序如下:
vgSymObj* pObj = vgGetSymObj( 0) ;
vgSymSwitch* pFswitch4 = vgFindSymNode( pObj,"sDNum_5",
NULL) ;
/ /获取千位节点指针
摘 要: 某激光末制导武器系统的使用存在操作内容多、程序复杂、各分系统协同度高等问题,为此提出基于 Vega 的虚拟操作仿真。在分析武器操作训练需求的基础上,对仿真模型构建、利用输入设备实现操作交互以及观测 结果屏显仿真等关键技术进行了论述。
基于Vega的双通道船舶甲板重吊视景仿真系统

基于Vega的双通道船舶甲板重吊视景仿真系统随着船只的发展和技术的进步,船舶载重能力也在不断提高,甲板上的重物起吊操作也随之变得更为复杂。
为了确保操作的安全性,预先进行视景仿真是必不可少的步骤。
本文将介绍一个基于Vega的双通道船舶甲板重吊视景仿真系统。
该系统由两个船舶甲板上的工作通道和一个操作室组成。
每个工作通道都有一个重型起重机,可用于吊装重物。
操作室中有一个专门设计的控制台,供操作员实时监控和控制吊装过程。
该系统的优点之一是其高度可定制的视景仿真。
操作员可以自由选择港口、海洋和天气等不同的环境来模拟各种不同的工作场景。
此外,操作员可以根据需要调整甲板上的各个元件的位置和大小,以便更好地模拟实际操作。
该系统还配备了高性能模拟引擎,通过物理模拟技术,可以精确模拟各种不同的重物起吊操作情况。
操作员可以使用控制台上的按钮和旋钮来控制重型起重机的运动和操作速度。
系统还具有定制的运动控制算法,可自动控制吊装操作以防止不必要的风险和意外。
值得注意的是,该系统还包括一个实时监测和报警系统,以最大程度地保障操纵员的安全。
如果系统检测到异常操作或是险情,会及时向操纵员发出警报并提示正确操作流程。
在实际操作中,该系统的数据记录功能也非常有用,可以为船员提供相关数据分析和参考。
总的来说,基于Vega的双通道船舶甲板重吊视景仿真系统在安全性、可仿真性和使用优越性方面都具有很强的优势,是一项非常有前途的技术。
船舶甲板重吊视景仿真系统是一项需要高性能计算机支持的复杂系统,其需要用到大量的实时数据进行物理模拟、控制和数据分析。
以下是在系统运行和使用中涉及到的相关数据和分析:1. 风速和方向:船舶甲板工作区的安全性取决于风的情况。
操作员需要根据实际情况选择不同的风条件进行模拟,以便演示吊装过程过程中发生的不同情况。
此外,风速和方向数据还用于计算吊装操作对船舶姿态和稳定性的影响,包括受风面积和升力等。
2. 重物吊装高度和重量:重物吊装高度和重量是船舶甲板重吊操作中非常重要的参数。
基于Vega Prime的弹道视景准实时仿真研究

Q 1 Z h u c h a n g , L I U L i ,L O N G T e n g , X I N G C h a o ( S c h o o l o f A e r o s p a c e E n g i n e e r i n g , B e i j i n g I n s t i t u t e o f T e c h n o l o g y , B e i j i n g 1 0 0 0 8 1 , C h i n a )
d a t a c r o s s — p r o c e s s e x c h a n g e b e t we e n t r a j e c t o y r s i mu l a t i o n a n d s c e n e s i mu l a t i o n wa i s i mp l e me n t e d u s i n g me mo y r ma p p i n g i f l e t e c h n o l o g y . T h e me t h o d’ S a v a i l a b i l i t y wa s v e r i i f e d b y t h e t r a j e c t o r y s c e n e q u a s i — r e a l — t i me s i mu l a t i o n p r o g r a m d e v e l o p e d t h r o u g h u s i n g C+ + t o c a l l V e g a P r i me AP I f u n c t i o n i n. N E T f r a me .T h e d e s i g n e r c a n o b s e r v e a n d a n a l y z e mi s s i l e l f i g h t s t a t u s t h r o u g h t h e t r a j e c t o y r s c e n e s i mu l a t i o n, a n d p r o v i d e t h e r e f e r e n c e f o r t h e t r a j e c t o y r a n a l y s i s a n d d e s i g n .
vega视景仿真课本实例

#include <stdlib.h>#include <vg.h>#include <vgfx.h>#include <vgperf.h>#include <pf.h>#include <string.h>#include <time.h>#include <gl\gl.h>#include <gl\glu.h>#include <gl\glaux.h>//#include "math.h"//#include<GL/glt.h>#define ORIGINX 2500.0f#define ORIGINY2500.0f#define ZSTART 500.0f#define RADIUS 1000.0f#define H_RA TE 0.25f#define Z_RA TE 3.5f#define MISSILE1_PA TH "./missile1.path"//保存路径文件名#define MISSILE1_NA V "./missile1.nav"//保存导航文件名#define MISSILE2_PA TH "./missile2.path"#define MISSILE2_NA V "./missile2.nav"#define HELITOE2C_PA TH "./helitoe2c.path"#define HELITOE2C_NA V "./helitoe2c.nav"static void DrawInfoCallBack(vgCommon *chan,void *udata); static void stateHandler(void);static void computeVV ec(float *vv,vgPosition *pos);static int randomNum(int number); //获取随机整数值static float e2c_radius=1000.0f; //预警机巡航半径static int state=0; //仿真运行状态static int m1launchable=0; //导弹1是否可发射static int m2launchable=0; //导弹2是否可发射static int e2cDownable=0; //E2C是否可失事static int m1used=0; //导弹1是否已发射static int m2used=0; //导弹2是否已发射static float startTime=0; //计时起始时间static float timeNow=0; //计时间隔时间static float deltaFrameTime=0.0167f; //帧渲染间隔时间void main(void){static vgObserver *obs;static vgChannel *chan;static vgScene *scene;static vgObject *m1,*m2;static vgPlayer *tank,*heli,*missile1,*missile2;static vgPlayer *e2c,*tank_crater,*e2c_crater;static vgIsector *fortank,*formissile1,*formissile2;static vgIsector *fore2c,*forheli,*forcrater;static vgPosition *pos,*e2c_pos,*heli_pos,*missile_pos,*target_pos;static vgFx *h_blade1,*h_blade2;static vgFx *e_blade1,*e_blade2,*e_trail1,*e_trail2;static vgFx *e_airhit,*e_engsmoke,*e_engburn,*e_flash;static vgFx *e_fire,*e_smoke,*e_explode,*e_debris;static vgFx *m1_flame,*m1_trail,*m2_flame,*m2_trail;static vgFx *t_flash,*t_explode1,*t_debris1,*t_smoke;static vgFx *t_flame,*t_explode2, *t_debris2,*t_fire;static vgPath *tank_path,*tankupdown_path,*heli_path;static vgSplineNavigator *tank_nav,*tankupdown_nav,*heli_nav;static vgPath *missile1_path,*missile2_path,*helitoe2c_path;static vgSplineNavigator *missile1_nav,*missile2_nav,*helitoe2c_nav;static V eloc ityMarker vm;static float x,y,z;static float h=0.0f,p=0.0f,r=-25.0f;static float e2cBspeed=1.0f; //预警机螺旋桨转速static float heliBspeed=0.0f;static float vvec[4],e2cISresult[4],m1ISresult[4],m2Isresult[4];static float hsin,hcos;static float psin,pcos;static int tankhitted=0; //坦克状态标志static int e2ccrashed=0; //预警机是否坠毁static int i=0;static int m,n,idx;static float tx,ty,tz,th,tp,tr;static float hx,hy,hz,hh,hp,hr;static float crashed_x,crashed_y,crashed_z;vgInitSys();vgInitFx();vgDefineSys("demo.adf");vgConfigSys();//初始化V ega变量obs=vgGetObserv(0);chan=vgGetObservChan(obs,0);scene=vgGetScene(0);m1=vgFindObj("missile1");m2=vgFindObj("missile2");tank=vgFindPlyr("p_Tank");heli=vgFindPlyr("p_Heli");missile1=vgFindPlyr("p_Missile1");missile2=vgFindPlyr("p_Missile2");e2c=vgFindPlyr("p_E2C");tank_crater=vgFindPlyr("p_Tank_Crater");e2c_crater=vgFindPlyr("p_E2C_Crater");fortank=vgFindIsect("forTank");fore2c=vgFindIsect("forE2C");forheli=vgFindIsect("forHeli");formissile1=vgFindIsect("formissile1");formissile2=vgFindIsect("formissile2");forcrater=vgFindIsect("forCrater");tank_path=vgFindPath("tank_use");tank_nav=vgFindSplineNavigator("tank_use"); tankupdown_path=vgFindPath("tank_updown"); tankupdown_nav=vgFindSplineNavigator("tank_updown"); heli_path=vgFindPath("heli_use");heli_nav=vgFindSplineNavigator("heli_use");h_blade1=vgFindFx("H_blade1");h_blade2=vgFindFx("H_blade2");e_blade1=vgFindFx("E_blade1");e_blade2=vgFindFx("E_blade2");e_trail1=vgFindFx("E_trail1");e_trail2=vgFindFx("E_trail2");e_airhit=vgFindFx("E_airhit");e_engsmoke=vgFindFx("E_engsmoke");e_engburn=vgFindFx("E_engburn");e_flash=vgFindFx("E_flash");e_explode=vgFindFx("E_explode");e_debris=vgFindFx("E_debris");e_fire=vgFindFx("E_fire");e_smoke=vgFindFx("E_smoke");m1_trail=vgFindFx("M1_trail");m1_flame=vgFindFx("M1_flame");m2_trail=vgFindFx("M2_trail");m2_flame=vgFindFx("M2_flame");t_flash=vgFindFx("T_flash");t_explode1=vgFindFx("T_explode1");t_debris1=vgFindFx("T_debris1");t_flame=vgFindFx("T_flame");t_fire=vgFindFx("T_fire");t_explode2=vgFindFx("T_explode2");t_debris2=vgFindFx("T_debris2");t_smoke=vgFindFx("T_smoke");//注册回调函数vgAddFunc(chan,VGCHAN_POSTDRA W,DrawInfoCallBack,NULL); startTime=vgGetTime();while(1){vgSyncFrame();vgFrame();//处理输入事件stateHandler();//判断直升机状态if(vgGetIsectResult(fore2c,VGIS_GETLOS,e2cISresult)){e2ccrashed=1; //预警机坠地crashed_x=e2cISresult[1];crashed_y=e2cISresult[2];crashed_z=e2cISresult[3];}//控制预警机飞行状态if(!e2c_pos) e2c_pos=vgNewPos();vgPosV ec(e2c_pos,x,y,z,h,p,r);vgPos(e2c,e2c_pos);computeVV ec(&vvec[1],e2c_pos);if(!e2ccrashed&&z>0.0f){h+=H_RA TE;if(h>360.0f) h-=360.0f;vgGetSinCos(h,&hsin,&hcos);vgGetSinCos(p,&psin,&pcos);x=ORIGINX+e2c_radius*hcos;y=ORIGINX+e2c_radius*hsin;z+=Z_RA TE*psin;}//计算时间间隔timeNow=vgGetTime()-startTime;switch(state){case 0: //初始状态//初始化E2C预警机位姿z=ZSTART;p=0.0f;r=-25.0f;//设置视点vgProp(obs,VGOBS_TETHERSTA TE,VGOBS_FIXED);vgProp(obs,VGOBS_LOOKA T_TARGET,VGOBS_L_NONE);vgObservPlyr(obs,e2c);pos=vgNewPos();vgPosV ec(pos,100,25,5,100,-10,0);vgObservTetherPos(obs,pos);//设置直升机和坦克的初始位置vgProp(tankupdown_nav,VGSPLINENA V_CURRENT_INDEX,0);vgPosV ec(pos,2944.0f,3125.0f,17.282f,-180,0,0);vgPos(heli,pos);vgPosV ec(pos,2208,1035,0,0,0,0);vgPos(tank,pos);vgPosV ec(pos,0,0,0,0,0,0);vgPos(tank_crater,pos);vgPos(e2c_crater,pos);vgDelPos(pos);//设置特效状态e2cBspeed=1.0f;vgProp(e_blade1,VGFX_BSPEED,e2c Bspeed);heliBspeed=0.0f;vgProp(h_blade1,VGFX_BSPEED,heliBspeed);vgProp(h_blade2,VGFX_BSPEED,heliBspeed);vgProp(e_blade1,VGFX_STA TE,VG_ON);vgProp(e_blade2,VGFX_STA TE,VG_ON);vgProp(e_trail1,VGFX_STA TE,VG_ON);vgProp(e_trail2,VGFX_STA TE,VG_ON);vgFxTime(e_trail1,VGFX_STARTTIME,VGFX_NOW);vgFxTime(e_trail2,VGFX_STARTTIME,VGFX_NOW);startTime=vgGetTime();state=1;break;case 1: //坦克开始行动if(timeNow>10.0f+randomNum(5)){vgProp(tank_nav,VGSPLINENA V_CURRENT_INDEX,0);startTime=vgGetTime();state=2;}break;case 2: //锁定坦克vgProp(tank_nav,VGCOMMON_ENABLED,VG_ON);vgProp(tank,VGPLYR_SPLINE_NA VIGA TOR,VG_ON);vgPlyrNav(tank,(vgNavigator*)tank_nav);vgProp(obs,VGOBS_TETHERSTA TE,VGOBS_FIXED);pos=vgNewPos();vgPosV ec(pos,0,-8,5,0,-10,0);vgObservTetherPos(obs,pos);vgObservPlyr(obs,tank);vgDelPos(pos);if(timeNow>20.0f+randomNum(5)){vgProp(obs,VGOBS_TETHERSTA TE,VGOBS_FIXED);pos=vgNewPos();vgPosV ec(pos,0,0,0,0,0,0);vgObservTetherPos(obs,pos);vgObservPlyr(obs,e2c);vgDelPos(pos);vgProp(obs,VGOBS_LOOKA T_TARGET,VGOBS_L_PLYR);vgObservLookatPlyr(obs,tank);startTime=vgGetTime();state=3;}break;case 3: //监视坦克行动if(i>-300){pos=vgNewPos();vgPosV ec(pos,0,0,i,0,0,0);vgObservTetherPos(obs,pos);vgObservPlyr(obs,e2c);vgDelPos(pos);i--;}if(timeNow>15.0f+randomNum(5)){startTime=vgGetTime();state=4;}break;case 4: //直升机启动vgProp(obs,VGOBS_LOOKA T_TARGET,VGOBS_L_NONE);vgProp(obs,VGOBS_TETHERSTA TE,VGOBS_FIXED);pos=vgNewPos();vgPosV ec(pos,50.0f,0.0f,5.0f,90,-10,0);vgObservTetherPos(obs,pos);vgObservPlyr(obs,heli);vgDelPos(pos);vgProp(h_blade1,VGFX_STA TE,VG_ON);vgProp(h_blade2,VGFX_STA TE,VG_ON);if(heliBspeed<1.0f)heliBspeed+=0.0025f;else{ vgProp(heli_nav,VGSPLINENA V_CURRENT_INDEX,0);startTime=vgGetTime();state=5;}vgProp(h_blade1,VGFX_BSPEED,heliBspeed);vgProp(h_blade2,VGFX_BSPEED,heliBspeed);break;case 5: //直升机行动vgProp(heli_nav,VGCOMMON_ENABLED,VG_ON);vgProp(heli,VGPLYR_SPLINE_NA VIGA TOR,VG_ON);vgProp(heli_nav,VGSPLINENA V_START_INDEX,0);vgProp(heli_nav,VGSPLINENA V_STOP_A T_END,VG_ON);vgPlyrNav(heli,(vgNavigator*)heli_nav);vgProp(obs,VGOBS_TETHERSTA TE,VGOBS_SPIN);vgObservPlyr(obs,heli);vgProp(obs,VGOBS_SPINRAD,80);vgProp(obs,VGOBS_SPINDELTA,0.5);vgProp(obs,VGOBS_SPINELEV,20);if(vgGetProp(tank_nav,VGSPLINENA V_CURRENT_INDEX)==vgGetProp(tank_path,VGP A TH_NUM_CTRLPTS)-1){m1launchable=1;m2launchable=1;}break;case 6: //发射第一枚导弹//创建导弹路径missile1_path=vgNewPath(MISSILE1_PA TH,NULL);vgName(missile1_path,"M1_path");missile_pos=vgNewPos();target_pos=vgNewPos();vgGetWCSPos(missile1,missile_pos);vgGetPosV ec(missile_pos,&tx,&ty,&tz,&th,&tp,&tr);vgProp(missile1,VGPLYR_CSREF,VGPLYR_ABSOLUTE);vgPosV ec(missile_pos,tx,ty,tz,0,0,0);vgPos(missile1,missile_pos);vgGetPos(tank,target_pos);vgGetPosV ec(target_pos,&tx,&ty,&tz,&th,&tp,&tr);vgPosV ec(target_pos,tx,ty,tz,0,0,0);vgPathAddCtrlPointPos(missile1_path,missile_pos);vgPathAddCtrlPointPos(missile1_path,target_pos);vgDelPos(missile_pos);vgDelPos(target_pos);missile1_nav=vgNewSplineNavigator(MISSILE1_NA V,missile1_path);vgName(missile1_nav,"M1_nav");vgProp(missile1_nav,VGCOMMON_ENABLED,VG_ON);vgProp(missile1_nav,VGSPLINENA V_START_INDEX,0);vgProp(missile1_nav,VGSPLINENA V_RENDER,VG_OFF);vgNavigatorAddMarker(missile1_nav,0,VGSPLINENA V_LINEAR,0,NULL,0);vgNavigatorAddMarker(missile1_nav,0,VGSPLINENA V_ABSOLUTE_HPR,VG_FALSE,N ULL,0);vm.beginSpeed=40.0f;vm.endSpeed=100.0f;vgNavigatorAddMarker(missile1_nav,0,VGSPLINENA V_VELOCITIES,0,&vm,sizeof(V elo cityMarker));vgNavigatorAddMarker(missile1_nav,1,VGNA V_EMPTY,0,NULL,0);vgMakeSplineNavigator(missile1_nav);//控制导弹特效vgProp(m1_flame,VGFX_STA TE,VG_ON);vgProp(m1_trail,VGFX_STA TE,VG_ON);vgProp(m1_flame,VGFX_DURA TION,VGFX_ALWAYS);vgProp(m1_trail,VGFX_DURA TION,VGFX_ALWAYS);vgFxTime(m1_flame,VGFX_STARTTIME,VGFX_NOW);vgFxTime(m1_trail,VGFX_STARTTIME,VGFX_NOW);vgProp(missile1,VGPLYR_SPLINE_NA VIGA TOR,VG_ON);//控制观察者状态vgPlyrNav(missile1,(vgNavigator*)missile1_nav);vgProp(obs,VGOBS_TETHERSTA TE,VGOBS_FIXED);pos=vgNewPos();vgPosV ec(pos,0,-25,5,0,-15,0);vgObservTetherPos(obs,pos);vgObservPlyr(obs,missile1);vgDelPos(pos);m1launchable=0;startTime=vgGetTime();state=10;break;case 7: //发射第二枚导弹//创建导弹路径missile2_path=vgNewPath(MISSILE2_PA TH,NULL);vgName(missile2_path,"M2_path");missile_pos=vgNewPos();target_pos=vgNewPos();vgGetWCSPos(missile2,missile_pos);vgGetPosV ec(missile_pos,&tx,&ty,&tz,&th,&tp,&tr);vgProp(missile2,VGPLYR_CSREF,VGPLYR_ABSOLUTE);vgPosV ec(missile_pos,tx,ty,tz,0,0,0);vgPos(missile2,missile_pos);vgGetPos(tank,target_pos);vgGetPosV ec(target_pos,&tx,&ty,&tz,&th,&tp,&tr);vgPosV ec(target_pos,tx,ty,tz,0,0,0);vgPathAddCtrlPointPos(missile2_path,missile_pos);vgPathAddCtrlPointPos(missile2_path,target_pos);vgDelPos(missile_pos);vgDelPos(target_pos);missile2_nav=vgNewSplineNavigator(MISSILE2_NA V,missile2_path);vgName(missile2_nav,"M2_nav");vgProp(missile2_nav,VGCOMMON_ENABLED,VG_ON);vgProp(missile2_nav,VGSPLINENA V_START_INDEX,0);vgProp(missile2_nav,VGSPLINENA V_RENDER,VG_OFF);vgNavigatorAddMarker(missile2_nav,0,VGSPLINENA V_LINEAR,0,NULL,0);vgNavigatorAddMarker(missile2_nav,0,VGSPLINENA V_ABSOLUTE_HPR,VG_FALSE,N ULL,0);vm.beginSpeed=40.0f;vm.endSpeed=100.0f;vgNavigatorAddMarker(missile2_nav,0,VGSPLINENA V_VELOCITIES,0,&vm,sizeof(V elo cityMarker));vgNavigatorAddMarker(missile2_nav,1,VGNA V_EMPTY,0,NULL,0);vgMakeSplineNavigator(missile2_nav);//控制导弹特效vgProp(m2_flame,VGFX_STA TE,VG_ON);vgProp(m2_trail,VGFX_STA TE,VG_ON);vgProp(m2_flame,VGFX_DURA TION,VGFX_ALWAYS);vgProp(m2_trail,VGFX_DURA TION,VGFX_ALWAYS);vgFxTime(m2_flame,VGFX_STARTTIME,VGFX_NOW);vgFxTime(m2_trail,VGFX_STARTTIME,VGFX_NOW);//控制观察者状态vgPlyrNav(missile2,(vgNavigator*)missile2_nav);vgProp(obs,VGOBS_TETHERSTA TE,VGOBS_FIXED);pos=vgNewPos();vgPosV ec(pos,0,-25,5,0,-15,0);vgObservTetherPos(obs,pos);vgObservPlyr(obs,missile1);vgDelPos(pos);vgObservPlyr(obs,missile2);m2launchable=0;startTime=vgGetTime();state=10;break;case 8: //坦克被第一次击中vgProp(obs,VGOBS_TETHERSTA TE,VGOBS_SPIN);vgObservPlyr(obs,tank);vgProp(obs,VGOBS_SPINRAD,100);vgProp(obs,VGOBS_SPINDELTA,0.5);vgProp(obs,VGOBS_SPINELEV,20);pos=vgNewPos();vgGetPos(tank,pos);vgPos(tank_crater,pos);vgProp(tank,VGPLYR_SPLINE_NA VIGA TOR,VG_OFF);vgPos(tank,pos);vgDelPos(pos);//第一次被击中特效vgProp(t_flash,VGFX_STA TE,VG_ON);vgProp(t_explode1,VGFX_STA TE,VG_ON);vgProp(t_debris1,VGFX_STA TE,VG_ON);vgProp(t_flame,VGFX_STA TE,VG_ON);vgProp(t_smoke,VGFX_STA TE,VG_ON);vgProp(t_flame,VGFX_DURA TION,VGFX_ALWAYS);vgProp(t_smoke,VGFX_DURA TION,VGFX_ALWAYS);vgProp(t_explode1,VGFX_AUTO,VG_OFF);vgProp(t_debris1,VGFX_AUTO,VG_OFF);vgFxTime(t_flash,VGFX_STARTTIME,VGFX_NOW);vgFxTime(t_explode1,VGFX_STARTTIME,VGFX_NOW);vgFxTime(t_debris1,VGFX_STARTTIME,VGFX_NOW);vgFxTime(t_flame,VGFX_STARTTIME,VGFX_NOW);vgFxTime(t_smoke,VGFX_STARTTIME,VGFX_NOW);startTime=vgGetTime();tankhitted++;state=10;break;case 9: //坦克被炸翻vgProp(obs,VGOBS_TETHERSTA TE,VGOBS_SPIN);vgObservPlyr(obs,tank);vgProp(obs,VGOBS_SPINRAD,60);vgProp(obs,VGOBS_SPINDELTA,0.5);vgProp(obs,VGOBS_SPINELEV,12);vgRemPlyrIsect(tank,fortank);vgProp(tankupdown_nav,VGCOMMON_ENABLED,VG_ON);vgProp(tank,VGPLYR_SPLINE_NA VIGA TOR,VG_ON);vgPlyrNav(tank,(vgNavigator*)tankupdown_nav);//第二次被击中特效vgProp(t_explode2,VGFX_STA TE,VG_ON);vgProp(t_debris2,VGFX_STA TE,VG_ON);vgProp(t_fire,VGFX_STA TE,VG_ON);vgProp(t_fire,VGFX_DURA TION,VGFX_ALW AYS);vgFxTime(t_explode2,VGFX_STARTTIME,VGFX_NOW);vgFxTime(t_debris2,VGFX_STARTTIME,VGFX_NOW);vgFxTime(t_fire,VGFX_STARTTIME,VGFX_NOW);startTime=vgGetTime();tankhitted++;state=10;break;case 10: //判断坦克状态if(!m1used){if(vgGetIsectResult(formissile1,VGIS_GETLOS,m1ISresult)){tankhitted++;m1used=1;}}if(!m2used){if(vgGetIsectResult(formissile2,VGIS_GETLOS,m2Isresult)){tankhitted++;m2used=1;}}if(tankhitted==1) state=8; //坦克被第一枚导弹击中if(tankhitted==3) //坦克被第二枚导弹击中{//控制导弹特效vgProp(m1_flame,VGFX_STA TE,VG_OFF);vgProp(m1_trail,VGFX_STA TE,VG_OFF);vgProp(m2_flame,VGFX_STA TE,VG_OFF);vgProp(m2_trail,VGFX_STA TE,VG_OFF);//移除导弹vgRemSceneObj(scene,m1);vgRemSceneObj(scene,m2);state=9;}if((tankhitted==4)&&(timeNow>5.0f)){vgProp(obs,VGOBS_TETHERSTA TE,VGOBS_SPIN);vgProp(obs,VGOBS_LOOKA T_TARGET,VGOBS_L_NONE);vgObservPlyr(obs,e2c);vgProp(obs,VGOBS_SPINRAD,100);vgProp(obs,VGOBS_SPINDELTA,0.25);vgProp(obs,VGOBS_SPINELEV,0.25);e2cDownable=1;startTime=vgGetTime();}break;case 11: //预警机发动机失效vgProp(obs,VGOBS_TETHERSTA TE,VGOBS_SPIN);vgObservPlyr(obs,e2c);vgProp(obs,VGOBS_SPINRAD,60);vgProp(obs,VGOBS_SPINDELTA,0.25);vgProp(obs,VGOBS_SPINELEV,30);vgProp(e_trail1,VGFX_DURA TION,vgGetTime()-vgGetFxTime(e_trail1,VGFX_STARTTIME)+ 1.0);vgProp(e_trail1,VGFX_FADEDUR,1.0);vgProp(e_airhit,VGFX_STA TE,VG_ON);vgProp(e_engburn,VGFX_STA TE,VG_ON);vgProp(e_engsmoke,VGFX_STA TE,VG_ON);vgProp(e_engburn,VGFX_DURA TION,VGFX_ALWAYS);vgProp(e_engsmoke,VGFX_DURA TION,VGFX_ALWAYS);vgProp(e_airhit,VGFX_STARTTIME,VGFX_NOW);vgProp(e_engburn,VGFX_STARTTIME,VGFX_NOW);vgProp(e_engsmoke,VGFX_STARTTIME,VGFX_NOW);e2c_radius=800.0f;e2cDownable=0;state=12;break;case 12:if(e2ccrashed){state =13;break;}if(e2cBspeed>0.0f) e2cBspeed -=0.025f;vgProp(e_blade1,VGFX_BSPEED,e2c Bspeed);//设置自定义特效的速度矢量vvec[0]=0.0f;vvec[1]*=(deltaFrameTime*5.0f);vvec[2]*=(deltaFrameTime*5.0f);vvec[3]*=(deltaFrameTime*5.0f);vgAttrList(e_engburn,VGFX_VVECTOR,vvec,1);vgAttrList(e_engsmoke,VGFX_VVECTOR,vvec,1);p-=H_RA TE;if(p<-60.0f) p=-60.0f;r-=H_RA TE;break;case 13:vgProp(obs,VGOBS_SPINRAD,100);vgProp(obs,VGOBS_SPINDELTA,0.5);vgProp(obs,VGOBS_SPINELEV,25);pos=vgNewPos();vgGetPos(e2c,pos);vgPos(e2c_crater,pos);vgDelPos(pos);vgProp(e_engburn,VGFX_DURA TION,vgGetTime()-vgGetFxTime(e_engburn,VGFX_STARTTI ME)+vgGetProp(e_engburn,VGFX_LCYCLE));vgProp(e_engsmoke,VGFX_DURA TION,vgGetTime()-vgGetFxTime(e_engsmoke, VGFX_STARTTIME)+vgGetProp(e_engsmoke,VGFX_LCYCLE));vgProp(e_trail2,VGFX_DURA TION,vgGetTime()-vgGetFxTime(e_trail2,VGFX_STARTTIME)+vgGetProp(e_engburn,2.0));vgProp(e_trail2,VGFX_FADEDUR,2.0);vgProp(e_blade1,VGFX_STA TE,VG_OFF);vgProp(e_blade2,VGFX_STA TE,VG_OFF);//定义直升机救援路径vgProp(heli_nav,VGCOMMON_ENABLED,VG_OFF);helitoe2c_path=vgNewPath(HELITOE2C_PA TH,NULL);vgName(helitoe2c_path,"HtoE_path");heli_pos=vgNewPos();e2c_pos=vgNewPos();pos=vgNewPos();vgGetPos(heli,heli_pos);vgGetPosV ec(heli_pos,&tx,&ty,&tz,&th,&tp,&tr);vgPos(heli,heli_pos);vgPosV ec(heli_pos,tx,ty,tz,0,0,0);vgGetPos(e2c,e2c_pos);vgGetPosV ec(e2c_pos,&hx,&hy,&hz,&hh,&hp,&hr);vgPosV ec(pos,hx-25.0f,hy-25.0f,tz,0,0,0);vgPosV ec(e2c_pos,crashed_x-25.0f,crashed_y-25.0f,crashed_z+4.0f,0,0,0); vgPathAddCtrlPointPos(helitoe2c_path,heli_pos);vgPathAddCtrlPointPos(helitoe2c_path,pos);vgPathAddCtrlPointPos(helitoe2c_path,e2c_pos);vgDelPos(heli_pos);vgDelPos(pos);vgDelPos(e2c_pos);helitoe2c_nav=vgNewSplineNavigator(HELITOE2C_NA V,helitoe2c_path);vgName(helitoe2c_nav,"HtoE_nav");vgProp(helitoe2c_nav,VGSPLINENA V_START_INDEX,0);vgProp(helitoe2c_nav,VGSPLINENA V_RENDER,VG_OFF);vgNavigatorAddMarker(helitoe2c_nav,0,VGSPLINENA V_LINEAR,0,NULL,0); vgNavigatorAddMarker(helitoe2c_nav,0,VGSPLINENA V_ABSOLUTE_HPR,VG_FALSE,NUL L,0);vgNavigatorAddMarker(helitoe2c_nav,0,VGSPLINENA V_VELOCITY,40,NULL,0);vm.beginSpeed=40.0f;vm.endSpeed=0.0f;vgNavigatorAddMarker(helitoe2c_nav,1,VGSPLINENA V_VELOCITIES,0,&vm,sizeof(V elocity Marker));vgNavigatorAddMarker(helitoe2c_nav,1,VGSPLINENA V_ABSOLUTE_HPR,VG_TRUE,NULL, 0);vgNavigatorAddMarker(helitoe2c_nav,2,VGNA V_EMPTY,0,NULL,0); vgMakeSplineNavigator(helitoe2c_nav);vgProp(helitoe2c_nav,VGSPLINENA V_CURRENT_INDEX,0);vgProp(helitoe2c_nav,VGCOMMON_ENABLED,VG_OFF);state=14;break;case 14://直升机赶往预警机残骸处营救if (timeNow>5.0f){vgPlyrNav(heli,(vgNavigator*)helitoe2c_nav);pos=vgNewPos();vgPosV ec(pos,0.0f,-50.0f,10.0f,0,-10,0);vgObservTetherPos(obs,pos);vgDelPos(pos);vgProp(obs,VGOBS_TETHERSTA TE,VGOBS_FIXED);vgProp(helitoe2c_nav,VGCOMMON_ENABLED,VG_ON);vgObservPlyr(obs,heli);}if (vgGetProp(helitoe2c_nav,VGSPLINENA V_CURRENT_INDEX)==2) {startTime=vgGetTime();state=15;}break;case 15://直升机停止vgProp(obs,VGOBS_TETHERSTA TE,VGOBS_SPIN);vgObservPlyr(obs,e2c);vgProp(obs,VGOBS_SPINRAD,120.0f);vgProp(obs,VGOBS_SPINDELTA,0.3f);vgProp(obs,VGOBS_SPINELEV,50.0f);if (heliBspeed>0.0f) heliBspeed -=0.0025f;vgProp(h_blade1,VGFX_BSPEED,heliBspeed);vgProp(h_blade2,VGFX_BSPEED,heliBspeed);if (timeNow>30.0f) state=16;break;default:case 16://缺省状态重新初始化//设置特效状态vgProp(e_airhit,VGFX_STA TE,VG_OFF);vgProp(e_engsmoke,VGFX_STA TE,VG_OFF);vgProp(e_engburn,VGFX_STA TE,VG_OFF);vgProp(e_flash,VGFX_STA TE,VG_OFF);vgProp(e_explode,VGFX_STA TE,VG_OFF);vgProp(e_debris,VGFX_STA TE,VG_OFF);vgProp(e_fire,VGFX_STA TE,VG_OFF);vgProp(e_smoke,VGFX_STA TE,VG_OFF);vgProp(h_blade1,VGFX_STA TE,VG_OFF);vgProp(h_blade2,VGFX_STA TE,VG_OFF);vgProp(m1_flame,VGFX_STA TE,VG_OFF);vgProp(m2_flame,VGFX_STA TE,VG_OFF);vgProp(m1_trail,VGFX_STA TE,VG_OFF);vgProp(m2_trail,VGFX_STA TE,VG_OFF);vgProp(t_flash,VGFX_STA TE,VG_OFF);vgProp(t_explode1,VGFX_STA TE,VG_OFF);vgProp(t_explode2,VGFX_STA TE,VG_OFF);vgProp(t_debris1,VGFX_STA TE,VG_OFF);vgProp(t_debris2,VGFX_STA TE,VG_OFF);vgProp(t_flame,VGFX_STA TE,VG_OFF);vgProp(t_fire,VGFX_STA TE,VG_OFF);vgProp(t_smoke,VGFX_STA TE,VG_OFF);vgProp(e_trail1,VGFX_STA TE,VG_OFF);vgProp(e_trail2,VGFX_STA TE,VG_OFF);vgProp(e_trail1,VGFX_FADEDUR,VGFX_ALW AYS); vgProp(e_trail2,VGFX_FADEDUR,VGFX_ALW AYS); vgProp(e_trail1,VGFX_DURA TION,VGFX_ALWAYS); vgProp(e_trail2,VGFX_DURA TION,VGFX_ALWAYS); vgAddPlyrIsect(tank,fortank);//删除导弹一路径m=(int)vgGetProp(missile1_nav,VGNA V_NUM_MARKERS); n=(int)vgGetProp(missile1_path,VGPA TH_NUM_CTRLPTS); vgProp(missile1_nav,VGCOMMON_ENABLED,VG_OFF); for(idx=m-1;idx>0;idx--){vgNavigatorDeleteMarkerByIndex(missile1_nav,idx);}for(idx=n-1;idx>0;idx--){vgPathDeleteCtrlPointByIndex(missile2_path,idx);}//删除导弹二路径m=(int)vgGetProp(missile2_nav,VGNA V_NUM_MARKERS); n=(int)vgGetProp(missile2_path,VGPA TH_NUM_CTRLPTS); vgProp(missile2_nav,VGCOMMON_ENABLED,VG_OFF); for(idx=m-1;idx>0;idx--){vgNavigatorDeleteMarkerByIndex(missile2_nav,idx);}for(idx=n-1;idx>0;idx--){vgPathDeleteCtrlPointByIndex(missile2_path,idx);}//删除直升机救援路径m=(int)vgGetProp(helitoe2c_nav,VGNA V_NUM_MARKERS);n=(int)vgGetProp(helitoe2c_path,VGPA TH_NUM_CTRLPTS); vgProp(helitoe2c_nav,VGCOMMON_ENABLED,VG_OFF);for(idx=m-1;idx>0;idx--){vgNavigatorDeleteMarkerByIndex(helitoe2c_nav,idx);}for(idx=n-1;idx>0;idx--){vgPathDeleteCtrlPointByIndex(helitoe2c_path,idx);}//初始化各种变量z=ZSTART;p=0.0f;r=-25.0f;e2c_radius=1000.0f;m=n=i=0;m1used=0;m2used=0;m1launchable=0;m2launchable=0;tankhitted=0;e2ccrashed=0;vgProp(tank_nav,VGCOMMON_ENABLED,VG_OFF);vgProp(heli_nav,VGCOMMON_ENABLED,VG_OFF);vgProp(tankupdown_nav,VGCOMMON_ENABLED,VG_OFF);vgProp(tank_nav,VGPLYR_SPLINE_NA VIGA TOR,VG_OFF);vgProp(heli_nav,VGPLYR_SPLINE_NA VIGA TOR,VG_OFF);//重置角色对象pos=vgNewPos();vgAddSceneObj(scene,m1);vgAddSceneObj(scene,m2);vgProp(missile1,VGPLYR_CSREF,VGPLYR_PLYR);vgPlyrPlyrRef(missile1,heli);vgPosV ec(pos,-1.75f,-1.0f,-0.683f,0,0,0);vgPos(missile1,pos);vgProp(missile2,VGPLYR_CSREF,VGPLYR_PLYR);vgPlyrPlyrRef(missile2,heli);vgPosV ec(pos,-1.75f,-1.0f,-0.683f,0,0,0);vgPos(missile2,pos);vgPosV ec(pos,2944.0f,3215.0f,17.828f,-180,0,0); vgPos(heli,pos);vgPosV ec(pos,2208.0f,1035.0f,0.0f,0,0,0); vgPos(tank,pos);vgPosV ec(pos,0,0,0,0,0,0);vgPos(tank_crater,pos);vgPos(e2c_crater,pos);vgDelPos(pos);startTime=vgGetTime();state=0;break;}deltaFrameTime=vgGetDeltaFrameTime();}vgExit(0);}//计算角色对象在指定位置处的速度矢量void computeVV ec(float*vv,vgPosition*pos) {float x,y,z,h,p,r;static float dx=0.0f,dy=0.0f,dz=0.0f;vgGetPosV ec(pos,&x,&y,&z,&h,&p,&r);if(deltaFrameTime){vv[0]=(dx-x)/deltaFrameTime;vv[1]=(dy-y)/deltaFrameTime;vv[2]=(dz-z)/deltaFrameTime;}else{vv[0]=vv[1]=vv[2]=0.0f;}dx=x;dy=y;dz=z;}//处理用户交互事件void stateHandler(void){long i;static vgWindow *win=NULL;static vgMouse mouse;static int oldlb=0;static int oldrb=0;if(!win)win=vgGetWin(0);//按下鼠标左键发射第一枚导弹if(m1launchable){vgGetMouse(&mouse);if(mouse.lb!=oldlb){state=6;oldlb=mouse.lb;m1launchable=0;}}//按下鼠标右键发射第二枚导弹if(m2launchable){vgGetMouse(&mouse);if(mouse.rb!=oldrb){state=7;oldrb=mouse.rb;m2launchable=0;}}//处理键盘输入while(i=vgGetWinKey(win)){switch(i){case ' ':if(e2cDownable)state=11;elsestate=16;break;default:break;}}}//通道回调函数void DrawInfoCallBack(vgCommon*chan,void*udata){GLint matmode;GLfloat projmat[16];char str[256],showstate[80];switch(state){case 0:case 1:strcpy(showstate,"Welcome to the Show!");break;case 2:strcpy(showstate,"The Tank is Moving!");break;case 3:strcpy(showstate,"The Tank is Locked!");break;case 4:case 5:strcpy(showstate,"The Helicopter-Action!");if(m1launchable&&m2launchable)strcpy(showstate,"Y ou can Fire Now!");break;case 6:case 7:strcpy(showstate,"Broken Arrow!");break;case 8:case 9:case 10:strcpy(showstate,"The Tank is cracked!");if(e2cDownable)strcpy(showstate,"Be care for the E2C!");break;case 11:case 12:case 13:strcpy(showstate,"The E2C is in Trouble!");break;case 14:strcpy(showstate,"The Helicopter is Coming!");break;case 15:case 16:strcpy(showstate,"Game Over!");break;default:strcpy(showstate,"What is This?");break;}sprintf(str,"ElapsedTime:%7.2f StateTimer:%7.2f StateNow(%d):%s",vgGetTime(),timeNow,state,showstate);pfPushState();pfDisable(PFEN_TEXTURE);pfDisable(PFEN_FOG);pfDisable(PFEN_LIGHTING);pfTransparency(PFTR_FAST);glDisable(GL_DEPTH_TEST);glGetIntegerv(GL_MA TRIX_MODE,&matmode);glMatrixMode(GL_PROJECTION);glGetFloatv(GL_PROJECTION_MA TRIX,projmat);glMatrixMode(matmode);pfPushIdentMatrix();glGetIntegerv(GL_MA TRIX_MODE,&matmode);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0,1024,0,768);glMatrixMode(matmode);glColor3ub(255,0,255);vgFontSize(15,20);vgFontPos(40,20,0);vgDrawFont(str);pfPopMatrix();glMatrixMode(GL_PROJECTION);glLoadMatrixf(projmat);glMatrixMode(matmode);glEnable(GL_DEPTH_TEST);pfPopState();}//获取随机整数int randomNum(int number){srand((unsigned)time(NULL));return(int)(number/(float)RAND_MAX*rand()); }。
vega及其在战场环境视景仿真系统中的应用

2018.04网络与信息工程v e g a及其在战场环境视景仿真系统中的应用陈克坚(91245部队45分队,辽宁葫芦岛,125000 )摘要:依照战场环境特点,利用vaga设计实现其在战场环境视景仿真系统中的有效应用。
主要研宄内容包括vega视景仿真 驱动的建模及其综合应用,仿真结果具有极高可信度,与实际环境几乎一致,能够达到实际应用标准,为战场的模拟训练提供 重要依据。
关键词:vega ;战场环境;仿真系统;应用Vega and its application in scene simulation system of battlefieldenvironmentChen Kejian(91245 force 45 units,Huludao Liaoning,125000)Abstract: According to the characteristics of the battlefield environment,the vaga design is used to realize its effective application in the scene simulation system of the battlefield environment.The main research contents include the modeling and comprehensive application of Vega visual simulation driving.The simulation results are highly reliable,which is almost the same with the actual environment,and can achieve the actual application standards,providing an important basis for battlefield simulation training.Keywords: Vega;battlefield environment;simulation system;application〇引言战场环境视景仿真系统是目前现代技术极其重要的表现形 式,是实现战场环境逼真效果的交互式方法,有效提高系统和环 境的自接交互效率[1]。
基于鱼雷武器的作训仿真系统设计与研究

基于鱼雷武器的作训仿真系统设计与研究基于鱼雷武器的作训仿真系统设计与研究摘要:本文针对鱼雷武器作训的需求,设计并研究了一种基于鱼雷武器的作训仿真系统。
该系统通过仿真技术,提供了真实的训练环境和个性化的训练内容,有效提高了鱼雷武器作训效果。
本文采用三维建模技术、虚拟现实技术以及数据处理技术等方法,详细介绍了系统的设计原理和实现方法,并进行了系统性能的分析和评估。
实验结果表明,该系统能够满足鱼雷武器作训需求,并具有良好的效果和可扩展性。
关键词:鱼雷武器;作训仿真系统;三维建模技术;虚拟现实技术;数据处理技术引言鱼雷作为一种重要的水下武器,其作训对于提升作战能力具有至关重要的作用。
然而,传统的鱼雷武器作训方式往往存在一些问题,例如受到地理环境、天气等因素的限制,训练效果受限;高成本、高风险的实际演练存在安全隐患等。
因此,研究一种基于鱼雷武器的作训仿真系统,以提供真实的训练环境和个性化的训练内容,对于有效提高鱼雷武器作训效果至关重要。
一、系统设计原理鱼雷武器作训仿真系统主要包括仿真环境构建、数据处理和虚拟现实技术三个部分。
1. 仿真环境构建为了提供真实的训练环境,本系统采用三维建模技术构建一个仿真区域,包括海底地形、水下障碍物、声呐探测范围等。
同时,考虑到鱼雷的自主导航能力,系统还需要模拟不同的水下环境条件,例如海流、风浪等,以便训练人员在实际情况下进行操作和应对。
2. 数据处理为了提高仿真系统的真实度和可靠性,本系统采集了大量的真实鱼雷作训数据,并对其进行处理。
通过对数据的处理和分析,能够模拟鱼雷的不同运动状态、声呐信号等,从而提供更加真实的作训环境。
此外,系统还能够根据训练人员的不同需求,提供个性化的训练内容和难度。
3. 虚拟现实技术本系统采用虚拟现实技术,为训练人员提供一个身临其境的作训环境。
通过佩戴虚拟现实设备,训练人员可以感受到真实的水下环境和鱼雷作训过程,在虚拟环境中进行操作和决策,提高了训练的真实感和效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
wa e r .Fial .i i fc s do h e e rh o o t r mpe n ainb o bnn nl y t s o u e nt ers ac fs fwa ei lme tt yc m i ig VC+ + d v lp n n i n e ta d o e eo me te vr m n n o
v C++开发环境下如何结合 Ve a g 进行 鱼雷弹道视景仿真软件 的实现 。 关键词 鱼雷 弹道 ;视景仿真 ;软件设计 ; g Vea
TP 9 . 319 中图分类号
Vi a i lt nS f r sg fT r e o Taetr a e nV g s l muai ot eDeino op d rjcoy B sdo e a u S o wa
fa w r n r f w fr h iu l i lt ns f r f o p d ae tr r to u e .T e et r e ota co y rme o k a d wo kl o evs a s o t muai ot e r e o t jc yaei r d c d h n t p d r e tr o wa o t r o n h o j
Cls m b r TP3 ] 9 a s Nu e 9 .
1 引言
视景仿 真是 虚拟 现 实技术 的 重要 表 现形 式 , 它
法 和 Ve a 景仿 真软 件来 进行 鱼雷 弹道 视景 仿真 g视
软件 的设计 开 发 。
是 在数 值 仿 真 的 基 础 上 , 用 计 算 机 图 形 图像 技 采
总第 2 6 0 期 21 0 1年第 8 期
舰 船 电 子 工 程
S i e to i E g n e i g h p Elc r n c n i e r n
Vo . 1 No 8 13 .
19 O
基于 Vg e a的 鱼 雷 弹 道 视 景 仿 真 软 件 设 计
张 仪 陈 迎春
Zh n Ch nYigh n C oHajn a gYi e n c u a i u
( .9 3 8 T o p f L No 1 8 r o so A,Z a j n 5 4 2 ) P h ni g 2 0 2 a
A src Vi a s l in i i otn n su yn h i ai t no op d rjcoy Frt ,tefnt n b ta t s l i a o s mp r ti td ig tevs l ai ftreo ta tr. i l h u ci , u mu t a u z o e sy o
目前 , 国内关 于鱼雷 弹道 视 景仿 真研 究 资 料有
仿真 软件 l 。通过将 两 者有 机结 合 起来 , 目前进 l 5 ] 是 行 三维视 景仿 真软 件 系统 开发 的流行 方法 之 一 。
不少, 中: 其 文献 Ei l采用 O eGI技 术来 实现 鱼雷 pn
弹道 视景 仿真 , 文献 [ ] 文献 [ ] 2和 3 分析 研 究 了
a d isk n ma i d la e a ay e . Th D d l o o p d n n e wa e n io me ta e c e t d b r a o o t n t i e tcmo e r n l z d e 3 mo es f t r e o a d u d r tr e v r n n r r a e y C e t r s f—
*
收 稿 日期 :0 1 2月 1 21 年 5日, 回 日期 :0 1年 3月 2 日 修 21 2
术, 以三维动 画 的形式 再现 物体 运 动过 程 和 真实 环 境 。鱼雷 弹道视 景 仿 真 设 计 就 是 通 过 对 鱼 雷 动 力
2 软 件 开 发 工 具 和环 境
本 文所设 计 的鱼 雷 弹 道 视 景 仿 真软 件 采 用 专
业3 D建 模 软 件 C e tr rao 和视 景 仿 真软 件 Ve a 以 g, Mi o ot . c sf VC 6 0为开 发平 台进 行 开发 。 r
湛江
曹 海 军
542) 2 0 2
(18 9 3 8部 队
摘
要
视景仿 真是进行 鱼雷弹道可视化研究的重要 内容 。文章首先 介绍 了鱼 雷弹道视 景仿真 软件 的功 能和框架结
构及工作 流程 , 同时分析 了鱼雷弹道和运动学模型 , 然后 由 C etr rao 建立 了鱼雷 和水下 环境 的 3 D模型 , 最后 重点研 究 了在
C e tr和 Ve a分 别 是 Mut nP rdg rao g l Ge — aa im i
学 仿真来 模 拟鱼雷 在水 下 的运 动特 性 , 用 三维 动 采
画的形式 把 鱼雷搜 索 、 跟踪 和导 引攻 击 目标 的整个 航行 弹道 表现 出来 口 。 ]
公 司推 出的实 时可 视 化 三 维 仿 真 建模 工 具 和 视 景
HL A架 构下 的鱼 雷弹 道视景 仿 真环境 , 文献 [ ] 4 提
出 了基于 MATl AB的鱼雷 水 下弹 道 仿真 方 法 , 等 等 。本 文在 上述 研究 的基 础上 , 用 面 向对 象 的方 使
3 软 件 功 能 分 析 与 设 计
3 1 软件 功 能分 析 .
视 景仿 真 软件 的功 能主要 有 :
Ve a s fwa e g o t r.
K y W o d tr e o t j tr ,v u l ain s lt n o t a ei ai t i ai ,s f r ei ,V g ac s z o mu o w g