找到初始速度和角度以达到已知位置(抛物线轨迹)

时间:2013-05-22 21:28:50

标签: algorithm xna-4.0 game-physics

我目前正在使用XNA 4.0做一个小转弯的大炮游戏。游戏非常简单:玩​​家选择他想要射击火箭的速度和角度,以击中另一名玩家。还有一个随机生成的风矢量会影响火箭的X轨迹。我想添加一个AI,以便玩家可以在单人模式下与电脑对战。

我想要实现AI的方式非常简单:找到使火箭直接击中玩家的速度和角度,并为这些场添加一个随机修改器,以便AI不会击中另一个玩家时间。

这是我用来更新火箭位置和速度的代码:

            Vector2 gravity = new Vector2(0, (float)400);   // 400 is the sweet spot value that i have found works best for the gravity
            Vector2 totalAcceleration = gravity + _terrain.WindDirection;
            float deltaT = (float)gameTime.ElapsedGameTime.TotalSeconds; // Elapsed time since last update() call

            foreach (Rocket rocket in _instantiatedRocketList)
            {
                rocket.RocketSpeed += Vector2.Multiply(gravity, deltaT);  // Only changes the Y component
                rocket.RocketSpeed += Vector2.Multiply(_terrain.WindDirection, deltaT);   // Only changes the X component
                rocket.RocketPosition += Vector2.Multiply(rocket.RocketSpeed, deltaT) + Vector2.Multiply(totalAcceleration, (float)0.5) * deltaT * deltaT;

                // We update the angle of the rocket accordingly
                rocket.RocketAngle = (float)Math.Atan2(rocket.RocketSpeed.X, -rocket.RocketSpeed.Y);

                rocket.CreateSmokeParticles(3);
            }

我知道找到最终X和Y坐标的基本方程是:

  • X = V0 * cos(theta)* totalFlightTime

  • Y = V0 * sin(theta)* totalFlightTime - 0.5 * g * totalFlightTime ^ 2

其中X和Y是我想要击中的球员的坐标,V0是初始速度,theta是火箭射击时的角度,totalFlightTime,就像名字所说的那样,火箭的总飞行时间直到它到达(X,Y),g是重力(在我的游戏中为400)。

问题:

我遇到的问题是,知道在那些公式中添加风的位置(是否只是在X =等式中添加“+ windDirection * totalFlightTime”?),以及如何处理这些等式以便做我想做的事情(找到初始速度和θ角度),因为有3个变量(V0,theta和totalFlightTime),只有2个方程?

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

您可以按照以下方式执行此操作:

假设V0没有特定限制(即机器人可以任何所需的速度发射火箭)并使用替换

T=totalFlightTime 
Vx=V0cos(theta)
Vy=V0sin(theta)

为Vx选择任意值。现在你的第一个等式简化为

X=VxT  so T=X/Vx

解决T.现在将T的值替换为第二个等式并求解Vy

Y=VyT + gT^2/2  so Vy = (Y - gT^2/2)/T

最后你现在可以解决V0和theta

V0 = Sqrt(Vx^2 + Vy^2)  and Theta = aTan(Vy/Vx)

请注意,您最初选择的Vx将决定导弹将采取的轨迹 - 如果Vx很大,则T将很小并且轨迹几乎是一条直线(就像在附近目标发射的子弹一样) - 如果Vx如果小,那么T将很大,轨迹将是弧形(就像迫击炮的圆形路径)。你从三个变量(V0,totalFlightTime和theta)开始,但它们是因变量,因此选择任何一个(或在这种情况下为Vx)加上两个方程式解决其他两个变量。您还可以预先确定飞行时间并求解Vx,Vy,theta和V0,或者预先确定theta(虽然这会很棘手,因为有些theta不会提供真正的解决方案。