いくつかのシンプルな3Dカーレーシングゲーム(特にOutrun 2 / Motoracerなどのゲーム)で衝突がどのように行われるのか疑問に思いました。
複雑な環境(オープンワールド)のクラシックカーレーシングゲームでは、これは基本的なボックス(車用)から飛行機の衝突(トラック、建物など)で行われると思います。全体は、いくつかのバウンディングボックスを使用して最適化されます(これは、多くのゲームで衝突が行われる方法です)。
Outrun 2 / Motoracerのようなゲームでは、ゲームプレイは非常にシンプルなので、開発者はそれを必要としない可能性があり、すべてが大幅に簡略化されている可能性があります。それをプレイしたことがない人のために、これはとても具体的です:
- 車/バイクは常に道路に接着されています。
- 道路は常に同じサイズで、非常にシンプルな形状です。
- 唯一の可能性は、その道路をたどること、道路を離れること、または他の物と衝突することは不可能です(他の車/バイクを除いて、私たちは気にしません)。
- あなたが道路に衝突すると、非常に基本的なアーケードの衝突が行われます(車は単にそこから押し出されます)
これが衝突が起こったと思う方法です:
トラック全体は、巨大な3Dベジェ曲線と見なすことができます。そのカーブから、道路のポリゴンを生成できます(カーブから生成された前面、左、上方向のベクトルを使用)。他の要素(家、木など)も、この方法を使用して配置および整列できます。
次に、衝突を処理する(そして車を引く)には:
1)現在の車の3D位置から3Dカーブ上の最も近い位置を見つけます。つまり、3D車の位置をベジェカーブの位置に変換します。道路上のすべての3D位置は、3Dカーブに沿った変位(t
)+横変位(d
)と見なすことができます。はっきりしない場合は、下の画像を確認してください(これは2Dの例ですが、3Dにも簡単に当てはまります)。
t = 0の場合、トラックセクションの先頭にあり、t = 1の場合、末尾にあります。d = -1または1台の車がトラックの境界にある場合、d = 0台の車が道路の真ん中にある場合
2)を用いて道路に車を位置合わせt
し、d
(非常に簡単:いずれかのt
及びd
値iは3D位置+アップ/正面/左ベクトルを得ることができます)。車は今道路に接着されています
3)d
車の横変位を確認します。値が大きすぎる場合(d > 1)
や低すぎる場合は、(d < -1)
車が軌道から外れています。クリップして、車を正しい場所に置いてください。
これにより、3Dカリングも非常に簡単になり、現在の車のt
位置からまでトラックを描くだけt + some_big_enough_value_to_avoid_visible_clipping
です。
あるいは、私が完全に間違っているかもしれません。車の衝突(境界ボックス)と、トラックを表す非常に簡略化されたポリゴンのセット(建物などなし)をチェックするだけの方が、はるかに速く簡単でした。3Dワールド(および結果のコリジョンモデル)は、いくつかのサードパーティツール(ゲームの実行時に3Dカーブはなく、一連のポリゴンのみ)を使用して、以前に単純に生成されていました。