基于Vega的鱼雷弹道视景仿真软件设计
- 格式:pdf
- 大小:266.59 KB
- 文档页数:4
基于Vega的双通道船舶甲板重吊视景仿真系统随着船只的发展和技术的进步,船舶载重能力也在不断提高,甲板上的重物起吊操作也随之变得更为复杂。
为了确保操作的安全性,预先进行视景仿真是必不可少的步骤。
本文将介绍一个基于Vega的双通道船舶甲板重吊视景仿真系统。
该系统由两个船舶甲板上的工作通道和一个操作室组成。
每个工作通道都有一个重型起重机,可用于吊装重物。
操作室中有一个专门设计的控制台,供操作员实时监控和控制吊装过程。
该系统的优点之一是其高度可定制的视景仿真。
操作员可以自由选择港口、海洋和天气等不同的环境来模拟各种不同的工作场景。
此外,操作员可以根据需要调整甲板上的各个元件的位置和大小,以便更好地模拟实际操作。
该系统还配备了高性能模拟引擎,通过物理模拟技术,可以精确模拟各种不同的重物起吊操作情况。
操作员可以使用控制台上的按钮和旋钮来控制重型起重机的运动和操作速度。
系统还具有定制的运动控制算法,可自动控制吊装操作以防止不必要的风险和意外。
值得注意的是,该系统还包括一个实时监测和报警系统,以最大程度地保障操纵员的安全。
如果系统检测到异常操作或是险情,会及时向操纵员发出警报并提示正确操作流程。
在实际操作中,该系统的数据记录功能也非常有用,可以为船员提供相关数据分析和参考。
总的来说,基于Vega的双通道船舶甲板重吊视景仿真系统在安全性、可仿真性和使用优越性方面都具有很强的优势,是一项非常有前途的技术。
船舶甲板重吊视景仿真系统是一项需要高性能计算机支持的复杂系统,其需要用到大量的实时数据进行物理模拟、控制和数据分析。
以下是在系统运行和使用中涉及到的相关数据和分析:1. 风速和方向:船舶甲板工作区的安全性取决于风的情况。
操作员需要根据实际情况选择不同的风条件进行模拟,以便演示吊装过程过程中发生的不同情况。
此外,风速和方向数据还用于计算吊装操作对船舶姿态和稳定性的影响,包括受风面积和升力等。
2. 重物吊装高度和重量:重物吊装高度和重量是船舶甲板重吊操作中非常重要的参数。
#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()); }。
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. 虚拟现实技术本系统采用虚拟现实技术,为训练人员提供一个身临其境的作训环境。
通过佩戴虚拟现实设备,训练人员可以感受到真实的水下环境和鱼雷作训过程,在虚拟环境中进行操作和决策,提高了训练的真实感和效果。
3D视景在鱼雷制导系统半实物仿真中的实现
沙琪;郑为
【期刊名称】《鱼雷技术》
【年(卷),期】2005(013)003
【摘要】利用建模工具MultiGen Creator和Vega建立了鱼雷全弹道仿真中所需的鱼雷、水面舰艇、潜艇和干扰器等各类3D模型,以及海洋、战场武器实体尾流和爆炸等仿真战场环境,形成真实感较强的3D视景仿真环境,并解决了3D视景与分布式制导仿真系统间的接口技术,实现了鱼雷从发射到命中目标全过程的3D 图像及相关数据显示,该系统已成功应用于鱼雷制导系统半实物仿真试验.
【总页数】4页(P35-38)
【作者】沙琪;郑为
【作者单位】西安精密机械研究所,陕西,西安,710075;西安精密机械研究所,陕西,西安,710075
【正文语种】中文
【中图分类】TP391.9
【相关文献】
1.基于转速控制的鱼雷热动力半实物仿真试验系统实现 [J], 孙开锋;赵宽明;韩雪梅;符艳军
2.鱼雷制导系统半实物仿真的特点及数学仿真系统硬件配置 [J], 陈炳兴;关国枢
3.鱼雷武器控制系统半实物仿真系统设计与实现 [J], 孔德永
4.鱼雷尺度多目标多干扰半实物仿真环境设计与实现 [J], 赵罡;岳青
5.鱼雷制导系统数学与半实物仿真在型号研制中的应用 [J], 刘永丰; 关国枢
因版权原因,仅展示原文概要,查看原文内容请购买。
基于Vega的视景仿真应用系统研究与实现
张静;杨麦顺;刘萍芬
【期刊名称】《微电子学与计算机》
【年(卷),期】2008(25)2
【摘要】以开发一套地下洞室视景仿真应用系统为目的,研究了视景仿真应用系统开发中纹理映射、碰撞检测、视点快速切换、模型动态调度技术、对象拾取等关键技术,提出了可行的解决方案。
基于Creator构建了地下洞室和洞室地表三维模型数据库,利用Vega建立虚拟场景并进行仿真驱动,应用Vega API编程技术在
VC++.NET集成开发环境中完成了地下洞室视景仿真应用系统的设计和实现。
【总页数】4页(P93-96)
【关键词】视景仿真;Creator;Vega
【作者】张静;杨麦顺;刘萍芬
【作者单位】西安交通大学电信学院;昆明陆军学院
【正文语种】中文
【中图分类】TP391.9
【相关文献】
1.基于Creator和Vega的塔式起重机视景仿真系统研究 [J], 张佳福;董明晓;陈明文
2.虚拟现实技术用于直升机视景仿真初探——基于分布式VEGA视景仿真的原型系统实现 [J], 齐钱钱
3.基于Vega Prime的通用视景仿真系统研究 [J], 褚彦军;唐硕
4.基于HLA和VEGA的海基靶场半实物视景仿真系统研究 [J], 杨志菊;刘宝华
5.基于Vega的塔式起重机视景仿真系统研究 [J], 张佳福;董明晓;曾庆贵;李巍因版权原因,仅展示原文概要,查看原文内容请购买。