ステアリング動作。 外出中のキャラクターの移動方向を変更するタイプ

ゲームを開発するとき、特定のルートに従って実装することがしばしば必要です。 たとえば、キャラクターはポイントAからポイントBへのパスを作成する必要があります。パスを見つけるためのアルゴリズムを使用して計算したとしましょう。 そして、別のユニットがポイントCからポイントDに来て、私たちのために道路を横断することがわかり、それを回避する必要があります。 どうする 絶えずパスを再構築することは利益がありません。衝突を回避するために移動中にすでに方向をわずかに変更するのに十分な場合、追加の計算コストがかかります。

道に沿った方向変更のタイプは、ステアリング動作です。



この記事は、Fernando Bevilacquaが執筆した「ステアリングの動作を理解するシリーズの最初の記事を翻訳したものです。



ロシア語で適切な翻訳を見つけることは困難であることが判明したため、インターネットで最も頻繁に出会った「ステアリング」という用語を使用することにしました。 攪拌は、単純な力を使用してキャラクターが現実的な方法で動くのを助け、その組み合わせにより、周囲の世界のキャラクターの非常に自然な動きが可能になります。 攪拌の背後にあるアイデアは、 クレイグ・レイノルズによって提案されました。 彼らは、経路計画や巨大な計算に関連する複雑な戦略を使用せず、代わりに、利用可能な情報、たとえば、近隣のキャラクター(ユニット)に作用する力を使用します。 これにより、非常に複雑な動きのパターンを可能にしつつ、理解と実装が容易になります。

この記事を理解するには、ベクトルの数学の一般的な理解が必要です。 知識を更新したい場合は、次の記事( ゲーム開発者向け線形代数 )を読むことをお勧めします。



位置、速度および動き



移動方向に方向を変えることに関係するすべての力を実現するには、数学的なベクトルを使用できます。 これらの力はキャラクターの速度と位置に影響を与えるため、ベクトルを使用するのが良い方法です。



ベクトルには方向が必要ですが、キャラクターの位置ベクトルについては無視されます(半径ベクトルはキャラクターの現在位置に向けられていると仮定します)。





上の図はキャラクターを示しています-彼の座標(x、y); V(a、b)は速度ベクトルです。 運動はオイラー法を使用し計算されます。



position = position + velocity
      
      





速度ベクトルの方向はキャラクターが向かう場所を制御し、ベクトルの長さは単位時間あたりのキャラクターの移動距離を示します。 ベクトルの長さが長いほど、キャラクターは速く動きます。 原則として、速度ベクトルは何らかの値によって制限される可能性があり、原則として、シミュレートされた世界の最大速度が使用されます。

速度は次のように計算されます。



 velocity = normalize(target - position) * max_velocity,
      
      





targetは私たちが向かっている目標、 positionはキャラクターの現在の位置、 max_velocityは最大速度です



攪拌することなく、キャラクターは直線でのみ移動し、ターゲットが変更された場合、即座に方向を変更することに注意してください。 このような動きは非常に不自然に見えます。



力の計算



攪拌のアイデアの1つは、操舵力を加えることでキャラクターの動きに影響を与えることです。 それらに応じて、キャラクターはいずれかの方向に移動します。



シーク行動の場合、キャラクターに制御力を追加することで、キャラクターがスムーズに速度を調整し、ルートの突然の変更を回避します。 ターゲットが移動すると、キャラクターはその速度ベクトルを徐々に変更し、新しい場所でターゲットに到達しようとします。



動作吸引は2つの力を使用します:望ましい速度(望ましい速度)および制御力(ステアリング力):







望ましい速度とは、最短距離でキャラクターをゴールに導く力です。 制御力は、現在の速度を目的の速度から差し引いた結果であり、ターゲットの方向にキャラクターを押します。 これらの力は次のように計算されます(すべての操作はベクトルに対して実行されることに注意してください)。



 desired_velocity = normalize(target - position) * max_velocity steering = desired_velocity – velocity
      
      





強度を追加する



制御力のベクトルが計算されたら、それをキャラクターに(速度ベクトルに)追加する必要があります。 各瞬間に制御力を追加すると、キャラクターは直接ルートを放棄し、滑らかな線でターゲットに向かって進むことができます(下図のオレンジの曲線)。







これらの力の追加と、速度と位置の最終計算は次のとおりです。



 steering = truncate (steering, max_force) steering = steering / mass velocity = truncate (velocity + steering , max_speed) position = position + velocity
      
      





制御力は、キャラクターに作用できる最大許容力を超えることはできません。 また、制御力をキャラクターの質量で除算する必要があります。これにより、キャラクターの重量に応じて異なる速度を計算できます。



逃げる



逃げ行動は、シーク行動と同じ力を使用しますが、キャラクターがターゲットから離れることができます。







目標の位置からキャラクターの位置を引くことにより、希望する速度の新しいベクトルが計算されます。 結果は、ターゲットからキャラクターに向かうベクトルです。 制御力はほぼ同じ方法で計算されます。



 desired_velocity = normalize(position - target) * max_velocity steering = desired_velocity – velocity
      
      





この場合の望ましい速度は、キャラクターがターゲットから脱出するために使用できる最も単純なルートです。 制御力により、キャラクターは現在のルートを放棄し、希望する速度ベクトルの方向にキャラクターを押すことができます。

したがって、次の対応は、吸引と回避の動作で得られたベクトル間で確立できます。



 flee_desired_velocity = -seek_desired_velocity
      
      





言い換えれば、ベクトルは方向が互いに反対です。



制御力のベクトルを計算したら、キャラクターの速度ベクトルに追加する必要があります。 したがって、この力はキャラクターをターゲットから遠ざけ、各瞬間にキャラクターはターゲットに向かって動きを止め、ターゲットから離れ始めます(下図のオレンジの曲線)





おわりに



攪拌は、リアルなモーションパターンを作成するための優れたツールです。 計算は簡単に実装できるという事実にもかかわらず、この方法は実際には非常に良い結果を示しています。



All Articles