海戦ゲームがあり、速度と回転速度に基づいてボートが進むコースをユーザーに表示しようとしています。つまり、下の画像に似たものを達成しようとしています。ご覧のとおり、赤いルートを通ることができる船は、青いルートよりも回転速度が速くなります。ここで、速度、回転速度、および目的の方向に基づいて最終的な移動ベクトルを計算する方法を何とか見つける必要がありますが、その方法はまだわかりません。どんなアイデアでも大歓迎です!
2 に答える
これはゲーム用であり、正確な海事シミュレーションではないため、軌道プロットを作成する方法を探しているだけだと思います。
これは、適切な曲線を作成するのに十分小さい時間ステップを想定して、単純な反復/パラメトリック手法で処理するのが最適です。曲線には単純な関数形式はなく、点の配列で表す必要があることに注意してください。
疑似コード (Matlab / Octave スタイルの構文)
Given: StartX, StartY, StartHeading, EndX, EndY, MaxSpeed, MaxRotationRate
-----------------------------------------------------------------------------
MaxDisplacement = Max Speed * deltaT
MaxRotation = MaxRotationRate * deltaT
CurrentX = StartX
CurrentY = StartY
CurrentHeading = StartHeading
Trajectory = []
While [CurrentX, CurrentY] != [EndX, EndY]
% Store the Current Position by appending to results
Trajectory = [Trajectory; [CurrentX, CurrentY, CurrentHeading]]
% Get the vector form of the current heading and the straight-line path
HeadingVector = [cos(CurrentHeading),sin(CurrentHeading)]
DirectVector = [EndX - CurrentX, EndY - CurrentY]
% Some simple vector math here using dot products and cross products
RequiredRotation = arccos(dotP(HeadingVector,DirectVector)/abs((HeadingVector)*abs(DirectVector))
RotationDirection = sign(crossP(HeadingVector,DirectVector))
% Clip the rotation rate based on the maximum allowed rotation
if RequiredRotation > MaxRotation
RequiredRotation = MaxRotation
% Update the position based on the heading information
CurrentX = CurrentX + cos(RequiredRotation) * MaxDisplacement
CurrentY = CurrentY + sin(RequiredRotation) * MaxDisplacement
CurrentHeading = CurrentHeading + RequiredRotation * RotationDirection
Loop
Return Trajectory
このコードには、エンドポイントに到達する際にいくつかの問題があります。それをどのように処理するのが最善かは、皆さんにお任せします。明らかな問題が 2 つあります。船は常に最大速度で移動しているため、書かれているように船はエンドポイントをオーバーシュートします。また、エンドポイントが近すぎて操縦できない場合、船はポイントを「軌道に乗せる」ことができなくなる可能性があります。これには複数の回避策があり、ゲームでこれをどのように処理するかによって異なります。
幾何学的解
もう 1 つのアプローチは、よりハードコアなジオメトリ計算 (厳密解) を行うことです。
まず、最大回転率ではなく、回転半径を計算する必要があります。そこから、船の現在の位置と船首方位から、船が取り得る 2 つの「回転円」を識別することができます。正しい中心点Cを選択し、円の正しい接点Tを計算します。最後のパスは、円弧 (始点、終点、中心) の後に線分が続きます。
これはあなたにとって正確な答えではないかもしれませんが、あなたが望む式はこれだと思います:
ここで、U はオブジェクトの 4 つの速度であり、Γ は座標系の 64 の接続係数またはクリストフェル記号を表します。ギリシャ語の下付き文字は、時間軸の場合は 0、空間座標軸の場合は 1 ~ 3 の 4 つの可能な値を取ることに注意してください。反復インデックスは、そのインデックスのすべての値の合計を示すために使用されます。
この一連の 4 つの方程式 (インデックス λ の時間的および 3 つの空間的値にそれぞれ 1 つ) の左辺は、参照の視点から見たゼロ時間コンポーネントと結合されたオブジェクトの適切な加速度 3-ベクトルです。またはブックキーパー座標系。右辺の最初の項は、移動時計の単位時間 τ ごとに、オブジェクトの 4 つの速度 U の時間のような (エネルギー/mc) および空間のような (運動量/m) 成分が変化する割合を示しています。
ご覧のとおり、これは完全な線形代数ではありません。:)