AIが目標に到達するために回転する正しい速度を見つける


10

私は最高速度で移動し、毎秒度maxSpeedを変えることができる船を持っていrotationSpeedます。船は常に向いている方向に移動します。つまり、船が速く移動するほど、旋回半径が大きくなります。

私は自分の位置、回転、ターゲットの位置を知っています。

私が理解したいのは、ターゲットがこの速度で私の回転半径内にあるかどうか、またはより良い、私が移動できる最大速度は、ターゲットを回り続けることなくターゲットに方向転換するためです。

これを行うための効率的な方法がありますか?

これが私がこれまでに考えていることです。1ステップあたりの移動距離と1ステップあたりの回転量がわかっているので、次の2つのフレームのどこにいるのかがわかります。私の現在の位置はp1で、次の位置はp2、次にp3です。(p1、p2)と(p2、p3)の垂直二等分線をとることができます。彼らの交点は私に円の中心を与えます。次に、ターゲットがその円の中にあるかどうかをテストできます。

これが3Dで機能するかどうかは不明です(入力で球を計算する方法がわかりません)。この解決策は、旅行に適した速度を見つけるのにもあまり役立ちません。妥当な速度を見つけるには、さまざまな速度で数回試す必要があります。

誰もがより良い解決策にいくつかの光を当てることができますか?

回答:


17

バウンド回転速度と調整可能な移動速度を持つAI制御ユニットが目標に到達するには、2つの方法があります。

最初に、提示された課題を検討して、理解を深めましょう。

ここに画像の説明を入力してください

プレーヤーが右側または左側にあるゴールに到達しようとしているときに一定の速度で移動および回転している場合、そのプレーヤーはゴールに直面することなく、永久に円を描くように移動します。プレーヤーが円を描く2つの領域は、上の赤でマークされています。

赤でマークされた円形の領域は、次のように計算できます。

radius = movementSpeed / rotationSpeedInRadians;
circlesCenterX = unitX + cos(unitAngle + / - PI) * radius;
circlesCenterY = unitY + sin(unitAngle + / - PI) * radius;

これは赤い円の位置と半径になります。これを使用して、特定のゴールがAI制御ユニットの到達範囲外にあるかどうかを判断できます。

特定のアイテムがいずれかの円内にあるかどうかを確認するには、円の中心からの距離を計算します。

if ((circleX - goalX)^2 + (circleY - goalY)^2 < radius^2) //goal is within red circle

これには2つの可能な解決策があります。

1。

目標が円形の赤い領域の外側になるまで距離を増やし、Uターンのように方向転換します。これは簡単です。チェックが戻り、ゴールがこのサークル内にないことが返されるまで、ユニットを動かし続けます。その後、あなたは振り向くことができます。

ここに画像の説明を入力してください

他のオプションでは、計算にもう少し作業が必要です。

AIユニットと目標の間に想像上の線を引きます。それらの間の角度を使用する:

angle = Math.atan2(goalY - unitY, goalX - unitX);

正しい速度を計算するために、次のことを行う必要があります。

correctSpeed = rotationSpeedInRadians * (distance / 2) / cos(angle);

ここに画像の説明を入力してください

3Dケースで機能させるには:

次の3つの点が存在する平面を見つけます。

  1. ゴールポイント。
  2. 前のフレームでのAIユニットの位置。
  3. AIユニットの現在の位置。

その平面を使用して、2D方法で速度を計算できます。ドットを3D値から共通平面に埋め込まれた2D値に変換するだけです。

あなたはこれを使いたいかもしれません:

平面上の3DポイントをUV座標に変換する方法は?


パーフェクト!まさに私が望んでいた答え!詳しい説明ありがとうございます。これを推測して3Dで使用できると思います。
weichsem 2014

@weichsem回答を更新しました。私が提案したアイデアは、彼らが共有する一般的な2Dプレーンを見つけ、それを使用して正しい速度を計算することです。
AturSams 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.