プログラミング
2D Vehicles
要約
著者は1996年に開発した2D物理シミュレーションをJavaScriptで再実装し、30周年を記念して公開しました。このシミュレーションは、後に「グランド・セフト・オート(GTA)」の車両システムに発展したもので、今回は「車」「宇宙船」「レンガ」の3つのモードでプレイ可能です。当時のゲーム開発では珍しかったリジッドボディ物理演算を基盤とし、タイヤの挙動を近似的にモデル化することで、直感的で「ちょうど良い」操作感を実現しています。
全文翻訳
プロジェクトの歴史 · 1996年–2026年
2D Vehicles
1996年8月のある週末、私は2D物理シミュレーションを作成しました。これは後に、人気ゲーム「グランド・セフト・オート」、別名「GTA」の車両システムの基盤となりました。当初はAtari STホームコンピュータ上でGFA BASICで書かれたワイヤーフレームのデモでしたが、後に実際のゲームで使用するためにC言語に移植されました。この度、30周年を記念して、興味のある方のために、JavaScriptで再作成*し、少し見栄えの良い「リマスター」版として公開します。
Motion Labをプレイする
1996年のアイデアをMotion Labで再現しました。
説明
上記の再現版をプレイできます。モバイルの場合はタッチ操作に対応しています。デフォルトの「車」(1)モードに加えて、設定のモードセレクターから、またはキーボードの対応する数字を押すことで、技術的にシンプルな「宇宙船」(2)または「レンガ」(3)モードを選択することもできます。プレイフィールドの端にある衝突バリアは、「B」をクリックまたは押すことで切り替え可能で、「G」は垂直重力を切り替えます(これは宇宙船とレンガモードでのみ意味があります)。カメラ操作は「Z」と「X」で行います。「Z」はカメラの「デッドゾーン」を切り替え、車両がカメラからどれだけ離れるとカメラが追従するかを変更します。「X」は速度連動ズーム機能を切り替え、高速走行時にカメラを少し引きます(GTAと同様です)。
*(もちろん、著作権や商標を一切侵害しない方法で)
[任意免責事項:この作品は、「グランド・セフト・オート」フランチャイズとそのパブリッシャー「Take-Two」、または「Rockstar Games」として知られる開発会社とは、一切関係がなく、一切提携しておりません。この点を明確にすることに、私は非常に満足しています。むしろ喜ばしいことです。]
仕組み
小さなアイデアが2つのレイヤーで構成されています。
プロトタイプは汎用的な2Dリジッドボディと、意図的にシンプルな車のモデルを組み合わせたものでした。オリジナルのシミュレーションは「レンガ」のようなものから始まり、その後「宇宙船」(1986年のクラシックゲーム「Thrust」を連想させるように意図的に作られています)をより良くするためにいくつかの改良を加え、最終的に「車」らしく感じさせるための要素を追加しました。
システムの核心は、シンプルな古典的な2Dリジッドボディダイナミクスシミュレーションです。私の知る限り、このアプローチは当時ゲームではまだ一般的ではありませんでした(いくつかの著名な例外を除く)。ほとんどのゲーム車両は、基本的な高校レベルの「点物理学」(F = ma)で処理されており、回転成分は様々な「奇妙なハック」で対応されていました。適切なリジッドボディ物理演算(トルクを含む)を使用すると、回転がより一貫して処理されます。
そのコアの上に、「革新的な」車両シミュレーションレイヤーを追加しました。これは、タイヤの挙動を単純かつ近似的で、技術的には不正確なモデルに基づいています。それは基本的に私の半ば教育的な推測でしたが、物理的に正確ではないとわかっていても、当時の私の目的には「十分良い」と思えました。
入力から動きへ
これらの図は、現在のJavaScript再現版を説明しています。
ブラウザインターフェースがコントロールを提供し、シミュレーションは固定時間ステップで進行し、Canvasレンダラーが結果の状態を描画します。これらのジョブを分離することで、ボタンの押下がどのように力になり、その力がどのように動きになるかを追いやすくなります。
図のいずれかを選択すると、フルサイズで開きます。
ページとコントロールからシミュレーションと描画までの全体的な流れ。
1つのボディ、3つの振る舞い
車両は、表示形状と衝突ジオメトリを記述するシェルと、その振る舞いを提供するダイナミクスオブジェクトをリジッドボディと組み合わせています。「レンガ」はポインタドラッグからの力を受け取ります。「宇宙船」はアタッチメントポイントに推力を加えます。「車」はエンジン力とステアリングを追加し、4つのタイヤ位置に抵抗を適用します。モードを切り替えると、ボディの位置と動きを維持したまま、シェルと振る舞いが置き換えられます。
車両コーディネーターが形状、振る舞い、ボディの状態をどのように組み合わせるか。
力はボディを動かし、回転させる
リジッドボディは、角度と角速度に加えて、位置と速度を追跡します。中心を通る力は運動を変え、中心から離れた位置に適用された力は回転させることもできます。シミュレーションは、力とトルクを合計し、速度を更新してから、位置と角度を進めます。回転するボディ上の点は、ボディの動きと中心周りの動きを組み合わせた独自の速度を持ちます。バリアは同じ点速度を使用します。形状がエッジを横切ると、シミュレーションはそれを内部に戻し、バリアに進入している場合は接触インパルスを適用します。中心から外れた衝撃は、速度とスピンの両方を変更する可能性があります。これは、一般的な衝突システムではなく、摩擦のないエッジを持つ単純なバリアソルバーです。
共有された物理コアと、バリア接触を解決するために使用されるステップ。
意図的に近似されたタイヤ
各タイヤについて、「車」はタイヤ位置での速度を測定し、それを2つの成分に分解します:タイヤの進行方向沿いと、それに対して横方向です。転がりに対するわずかな抵抗と、横方向の動きに対するはるかに強い抵抗を適用します。ステアリングは前輪の進行方向を変更するため、それらの力もボディを回転させます。ハンドブレーキは後輪の転がり抵抗を増加させ、後輪の横方向グリップを低下させます。これらの抵抗力は速度に比例し、力の制限はありません。これは、タイヤの摩擦、スリップ、利用可能なグリップの現実的な説明ではなく、便利なダンピングモデルです。これにより、ほとんど機構を使わずに、車輪が横方向の動きに抵抗するという有用な感覚が得られます。「宇宙船」と「レンガ」は、力を適用する異なる方法で同じ物理コアを使用します。
力モデル、タイヤ速度成分、ハンドブレーキの挙動を含む。
ピースを組み合わせる
車両コーディネーターは、選択されたダイナミクスオブジェクトに力を適用するように要求し、その後リジッドボディを進めます。また、シェルのローカル座標点を描画用のワールド座標に変換し、各バリアに面している表面点を検索します。平坦な面がバリアに接触した場合、接触点の中心点を使用し、単一の角を選択することによって生じる人工的なスピンを回避します。
モードのインストール、シミュレーションの更新、接触ジオメトリの詳細。