请各位大虾们,帮帮忙:
我现在在用XNA编写一个3D坦克的游戏,可是在坦克发射炮弹问题上遇到了瓶颈,现在坦克可以发射炮弹,但是炮弹的运动轨迹是一条直线,我想让它运行抛物线的形式。不知道这个算法该如何写。在此求教给位了

解决方案 »

  1.   

     public void FireMissile()
            {
                foreach (GameObject missile in missiles)
                {
                    if (!missile.alive)
                       
                    {
                        missile.velocity = GetMissileMuzzleVelocity();
                        missile.position = GetMissileMuzzlePosition();
                        missile.rotation = missileLauncherHead.rotation;
                        missile.alive = true;
                        break;
                    }
                }
            }      public Vector3 GetMissileMuzzleVelocity()
            {
                Matrix rotationMatrix = Matrix.CreateFromYawPitchRoll(missileLauncherHead.rotation.Y, missileLauncherHead.rotation.X, 0);            return Vector3.Normalize(Vector3.Transform(Vector3.Forward, rotationMatrix)) * missilePower;
                      
            }       public Vector3 GetMissileMuzzlePosition()
            {
                return missileLauncherHead.position + (Vector3.Normalize(GetMissileMuzzleVelocity()) * launcherHeadMuzzleOffset);        }
                   
            void UpdateMissiles()
            {
                foreach (GameObject missile in missiles)
                {
                    if (missile.alive)
                    {
                        missile.position += missile.velocity;                    if (missile.position.Z < -1500.0f)
                        {
                            missile.alive = false;                        // update the calculation
                            range = calculateRange();
                            height = calculateHeight();
                            time = calculateTime();                    }
                    }
                }
            }
    这是我的发射炮弹的代码,请问我应该怎么修改呢?谢谢……
      

  2.   


     public void FireMissile()
            {
                foreach (GameObject missile in missiles)
                {
                    if (!missile.alive)
                       
                    {
                        missile.velocity = GetMissileMuzzleVelocity();
                        missile.position = GetMissileMuzzlePosition();
                        missile.rotation = missileLauncherHead.rotation;
                        missile.alive = true;
                        break;
                    }
                }
            }      public Vector3 GetMissileMuzzleVelocity()
            {
                Matrix rotationMatrix = Matrix.CreateFromYawPitchRoll(missileLauncherHead.rotation.Y, missileLauncherHead.rotation.X, 0);            return Vector3.Normalize(Vector3.Transform(Vector3.Forward, rotationMatrix)) * missilePower;
                      
            }       public Vector3 GetMissileMuzzlePosition()
            {
                return missileLauncherHead.position + (Vector3.Normalize(GetMissileMuzzleVelocity()) * launcherHeadMuzzleOffset);        }
                   
            private float gravity=0.98f;        void UpdateMissiles()
            {
                foreach (GameObject missile in missiles)
                {
                    if (missile.alive)
                    {
                        //加一个重力加速度
                        missile.velocity.Y+=gravity;                    missile.position += missile.velocity;                    if (missile.position.Z < -1500.0f)
                        {
                            missile.alive = false;                        // update the calculation
                            range = calculateRange();
                            height = calculateHeight();
                            time = calculateTime();                    }
                    }
                }
            }
      

  3.   

    想要模拟更真实的物理效果应该看下《Beginning Math and Physics for Game Programmers》
    或者你可以用box2d引擎
      

  4.   

    box2d for xnahttp://www.box2d.org/links.html
      

  5.   

    3D坦克游戏。Box2D不是一个2D collision 引擎么。←_←
    另外抛物线这种东西学过初中物理应该知道水平速度保持不变,处置速度根据加速度增大就好。检测到碰撞物体就爆炸即可
    float x,y,z;//x,y,z坐标
    float dx,dy,dz;//x,y,z方向的速度
    float gravity;//重力加速度 一般60FPS的游戏程序设定为0.098差不多。
    foreach(frame in animation)
    {
        x+=dx;
        y+=dy;
        z+=dz;
        y+=gravity;
        if(collisionJudge() == true)
              explode();
    }
      

  6.   

    楼上的伪代码是 dy +=gravity. 手误打错