0

発射物の動きでターゲットを攻撃する方法を理解するために、少しAIを実装する必要があります。

私はこれをウィキペディアで見つけました:

座標を打つために必要な角度

これは私が必要としているもののように見えます。特に、ゼロの高さより上から発射体を発射するという追加の問題があるためです。しかし、私の数学のスキルはあまり良くないので、それはすべて私にはまったくナンセンスのように見え、それをコードに変換する方法がわかりません。

誰かがこれを基本的な演算子(+-*%)と関数(sin、cos、sqrtなど)で理解できるものに分解できれば、本当にありがたいです。

4

2 に答える 2

7

xTarget/yTargetターゲットのxProj/yProj位置、発射体の初期位置、および発射体vの初期速度(メートル/秒)である場合、式は次の擬似コードに変換されます。

x = xTarget - xProj;
y = yTarget - yProj;
g = 9.8;

tmp = pow(v, 4) - g * (g * pow(x, 2) + 2 * y * pow(v, 2));

if tmp < 0
   // no solution
else if x == 0
   angle1 = pi/2;
   if y < 0
      angle2 = -pi/2;
   else
      angle2 = pi/2;
   end
else
   angle1 = atan((pow(v, 2) + sqrt(tmp)) / (g * x));
   angle2 = atan((pow(v, 2) - sqrt(tmp)) / (g * x));
end

gは重力定数(〜9.8 m / s ^ 2)、atanはアークタンジェント関数、powはべき関数です。数式には解がない(ターゲットが初速度で到達できない場合)、1つの解(then )、または2つの解(このアニメーションangle1 == angle2で見られるように)がないため、ifステートメントが必要です。これがあなたが持っている理由でもあります式の+/-記号)。

ほとんどのプログラミング言語では、も見つかりますatan2。その場合、一部のコードを次のように置き換えることができます。

if tmp < 0
   // no solution
else
   angle1 = atan2(pow(v, 2) + sqrt(tmp), g * x);
   angle2 = atan2(pow(v, 2) - sqrt(tmp), g * x);
end
于 2009-12-29T01:27:43.177 に答える
2

式は非常に単純です。派生について心配する必要はありません。

x is the horizontal distance away of the target you're trying to hit
y is the vertical distance away of the target you're trying to hit
v is the initial velocity of the launch
g is the acceleration due to gravity (9.81 m/s on earth)

そのリンクの式は、座標(x、y)でターゲットを攻撃するために発射物を発射するために必要な角度を示します。

于 2009-12-29T00:42:23.483 に答える