AIを動かすときに重力を考慮する方法


9

2Dゲームを作っています。現在、プレイヤーが操縦するヘリコプターが飛び回っています。矢印キーを使用して制御されます:上、左、右。

Y軸に沿った速度はdy、X軸に沿った速度はdxです。

物理は次のとおりです。

たびUPが押されていないdy、一定の加速度で加速し、無期限にダウンに向けました。(重力)。dx現在の値のままです。

場合UPが押されdyそれが現在、あるものは何でもから一定の加速度で加速4まで(それは速度4に達するまで、上向きに)。dx現在の値のままです。

場合LEFTが押されdxそれが現在、ある何から、一定の加速度で加速-4まで

場合RIGHTが押され、それが現在、ある何から、一定の加速度で加速DX、4まで

(私が言ったように、左または右が押され、同時に上が押されていない場合dy重力がヘリコプターに影響しているため、ますます小さくなります)

これにより、ヘリコプターは直線ではなく、空中のアーチに追従することがよくあります。

これにより、非常に現実的な物理が作成されます。

私の質問は:

AIである敵のヘリコプターも同じ物理システムを使用して移動する必要があります。

AIが現在の場所からポイントBに移動したいとします。

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

ゲームに重力も緩やかな加速もなければ、それは簡単でしょう。AIの位置からポイントBまでのベクトルを描き、AIにそれを追跡させるだけです。

以来、しかし、そこにある重力と徐々に加速、AIは直線的に移動することはできません(ほとんど)。可能な限り時間効率的にAIをポイントBに移動させる最良の方法は何でしょうか?

AIを特定の目的地に向けて移動するときに、重力をどのように考慮することができますか?

(説明しやすい場合は、B点がAIと対角線ではなく、AIと同じy軸上のレベルにあると考えてください。)

ありがとう


AIが動いている間は、物理を無効にできますか?その場合は、ポイントに向かって移動している間は無効にして、到達したら有効にすることができます。
Zhafur 2014年

@Zhafurこれにより、AIの動きが非現実的に見えるか、少なくともプレーヤーの動きの見え方とは異なります。AIの動きをプレイヤーの動きと同じに見せたいです。
user3150201 2014年

回答:


4

tl; dr:

TimeToStop.x = CurrentSpeed.x / Accelaration.x;

if (TimeToStop.x * CurrentSpeed.x >= 1.99 * DistanceFromTarget.x)
    slow_down_x(); // CurrentSpeed += Acc.x * direction;
else
    speed_up_towards_target_x(); // CurrentSpeed += Acc.x * direction;

yと同じです。速度を制限して、ゼロと最高速度の間になるようにしてください。ある時点で敵が非常に遅い速度で停止しようとしている場合、敵は反対方向に動き始める可能性があります。それを許可しないでください。速度が低下し、速度が1 * Acc未満の場合は停止してください。

ロングバージョン:障害物がない場合、y軸の動きはx軸の動きとはまったく関係ありません(影響しません)。したがって、あなたが説明する質問は2つの別々の質問に分けることができます。

  1. X軸上での移動
  2. そして、y軸に移動します。

CS.xCS.yは、x軸とy軸での現在の速度です。

TS.xTS.y関連する軸での現在の速度を考慮して、垂直または水平方向にのみ停止するのにかかる時間です。

D.xD.yは、各軸上の距離です。

tl; dr:次の条件に該当する場所に到達するまで、x軸で(可能であれば[最高速度に達しない限り])加速を続けます。

if (TS.x * CS.x >= 1.99 * D.x) hit_the_breaks_on_x();

yも同じです。


2

私が同様の問題に使用したアプローチの1つは、最初にターゲットにベクトルを描画し、それを現在の速度方向と比較することでした。

したがって、速度ベクトルとターゲットベクトルの間の符号付き角度を取得し、ベクトルのサイズに相対的な推力を適用します。

したがって、赤い速度ベクトルと緑のターゲットベクトルの間の角度aが負の場合は正の推力を適用し、そうでない場合は推力を適用せずに重力で選別します。ここに画像の説明を入力してください

ターゲットが異なる可能性のある4つの象限を扱う必要があることに注意してください(ターゲットが左上隅にあった場合、正の角度では推力を適用する必要があるため)。

また、目標速度からの偏差に対する推力量を必ず適用してください。

厳密には、これは重力を考慮に入れていません。現在の状態を補正しており、AIヘリコプターがターゲットに直線で飛行しない場合がありますが、少しぐらつきます。これはゲームで機能する場合と機能しない場合があります。


1
ありがとう。これに関するいくつかの質問:1- "... ベクトルのサイズに相対的な推力を適用します"。あなたは、もしかして「の大きさの角度を?2-「符号付き角度」とは、正または負を意味します-正しいですか?もしそうなら、角度が茶色の線の上にある場合は正であり、茶色の線の下にある場合は負です。正しい?3-私が正しく理解している場合、あなたの意味は次のとおりです。すべてのフレームで、現在の速度ベクトルと現在のベクトルの間のターゲットに対する角度を取得します。次に、それに応じてdxとdyを加算/減算します。これは正しいです?
user3150201 2014年

@ user3150201はい、角度の質問です。はい、署名付き/署名なしの質問では、atan2は2つのベクトル間の符号付き角度を与えることができます。わからないことはお詫び申し上げます。
bornander 2014年

1

Xフレームごとに動きを再計算するだけです。間にフレームをあまり多く入れないが、パフォーマンスに影響を及ぼさないので、ヘリコプターの重力は、軌道が実際に変化するのを見るのに十分なほど強くてはなりません。加えて、プレイヤーは同じように動くことができると思います。それは、計画されていない移動中に重力に適応することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.