基于Vega的导弹追踪

1010 篇文章 11 订阅
831 篇文章 16 订阅

//导弹结构体

 

typedef struct

 

{

 

       float missile_v;   //速度

 

       float missile_a;   //加速度

 

       float vx, vy, vz;  //速度在x,y,z轴的分量

 

       int state;        //导弹的状态,初始时state=0; state=1时,导弹发射;

 

 

 

       vgPlayer* player_missile;          //导弹运动体player指针

 

       vgPlayer* player_enemy;          //敌方导弹运动体指针

 

 

 

}missile_data;

 

 

 

//初始化导弹结构体

 

void myInitMissile( missile_data* missile )

 

{

 

      

 

       missile->missile_a = 20;

 

       missile->missile_v = 0;

 

 

 

       missile->state = 0;

 

       missile->player_missile = vgFindPlyr( "player_missile" );

 

missile->player_enemy = vgFindPlyr( "player_enemy" );

 

 

 

}

 

 

 

//导弹发射

 

void myLaunchMissile( vgCommon *handle, void *data)

 

{

 

       missile_data* missile = (missile_data*)data;

 

 

 

       vgPosition* pos = vgNewPos();

 

       float x, y, z, h, p, r;

 

       float x1, y1, z1, h1, p1, r1;

 

       float sin_h, cos_h;

 

       float sin_p, cos_p;

 

       float sin_r, cos_r;

 

       float dt;

 

       dt=vgGetDeltaFrameTime();

 

 

 

       //如果导弹处于发射状态、发射架完全打开且已经锁定目标,则令导弹发射

 

       if( missile->state == 1 && lopen && missile->player_enemy != NULL )

 

       {

 

              missile->missile_v += missile->missile_a * dt; //计算导弹速度

 

 

 

              vgGetWCSPos( missile->player_missile, pos );

 

           vgGetPosVec( pos, &x, &y, &z, &h, &p, &r );

 

      

 

        //如果导弹高度<=200,令导弹垂直上升

 

              if( z <= 200 )

 

              {

 

                     vgGetSinCos(h,&sin_h,&cos_h);

 

                  vgGetSinCos(p,&sin_p,&cos_p);

 

                  vgGetSinCos(r,&sin_r,&cos_r);

 

 

 

                     missile->vx = missile->missile_v * sin_p * sin_h;

 

                  missile->vy = missile->missile_v * sin_p * cos_h;

 

                  missile->vz = missile->missile_v * cos_p;

 

 

 

                     x += missile->vx * dt;

 

                 y -= missile->vy * dt;

 

                  z += missile->vz * dt;

 

 

 

                     vgPosVec( pos, x, y, z, h, p, r );

 

               vgPos( missile->player_missile, pos );

 

              }

 

        //如果导弹高度>200,则令导弹追踪目标

 

              else

 

              {

 

           //计算导弹与目标连线的HPR

 

                     myGetHPR( missile->player_missile, missile->player_enemy, pos );

 

                     vgGetPosVec( pos, &x1, &y1, &z1, &h1, &p1, &r1);

 

 

 

                     if(h<h1)

 

                            h+=0.4;

 

                     else

 

                            h-=0.4;

 

                     if(p<p1)

 

                            p+=0.4;

 

                     else

 

                            p-=0.4;

 

             

 

                     vgGetSinCos(h,&sin_h,&cos_h);

 

                  vgGetSinCos(p,&sin_p,&cos_p);

 

                  vgGetSinCos(r,&sin_r,&cos_r);

 

 

 

                     missile->vx = missile->missile_v * sin_p * sin_h;

 

                  missile->vy = missile->missile_v * sin_p * cos_h;

 

                  missile->vz = missile->missile_v * cos_p;

 

 

 

                  x += missile->vx * dt;

 

                  y -= missile->vy * dt;

 

                  z += missile->vz * dt;

 

 

 

                  vgPosVec( pos, x, y, z, h, p, r );

 

               vgPos( missile->player_missile, pos );

 

              }

 

       }

 

}

 

 

 

void myGetHPR( vgPlayer* player_missile, vgPlayer* player_enemy, vgPosition* pos )

 

{

 

       vgPosition* pos_missile = vgNewPos();

 

       vgPosition* pos_enemy  = vgNewPos();

 

 

 

       float x1,y1,z1,h1,p1,r1;

 

       float x2,y2,z2,h2,p2,r2;

 

       float x ,y ,z ,h ,p ,r ;

 

       float l_xyz,l_xy,l_yz;

 

 

 

       vgGetWCSPos( player_missile, pos_missile );

 

       vgGetWCSPos( player_enemy,  pos_enemy  );

 

 

 

       vgGetPosVec( pos_missile, &x1, &y1, &z1, &h1, &p1, &r1 );

 

       vgGetPosVec( pos_enemy , &x2, &y2, &z2, &h2, &p2, &r2 );

 

 

 

       x=x2-x1;

 

       y=y2-y1;

 

       z=z2-z1;

 

 

 

       l_xyz=vgGet3DRng(x,y,z);

 

       l_xy =vgGet2DRng(x,y);

 

       l_yz =vgGet2DRng(y,z);

 

 

 

       h=-atan2(x,y)*180/3.14159;

 

       if(z>=0)

 

              p = -atan2( l_xy, z ) * 180 / 3.14159;

 

       else

 

              p= atan2( l_xy, z ) * 180 / 3.14159 + 180;

 

 

 

       vgPosVec(pos,x1,y1,z1,h,p,r);

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值