ビデオゲームで発射物を表現するにはどうすればよいですか?


14

私がやっているプレゼンテーションの一環として、「ガラガ」に似たシンプルな固定シューティングゲームを作成しています。宇宙船から発射されたレーザーのような発射体を追跡するために人々がどのような戦略とデータ構造を使用するのだろうかと思っています。以前に使用した非常にシンプルな実装は、各発射物をポイントとして表現し、シーン内のすべてのオブジェクトとの衝突をチェックすることです。

ただし、これは多くの発射物がある大きなシーンではコストがかかるようです。このタイプのユースケースには、他のタイプの戦略や実装がどのように使用されているのでしょうか。FPSのようなゲームは、発射体(弾丸、戦車の砲弾など)の追跡に何を使用しますか?


5
多くのFPSゲームは、弾丸が瞬時であることを前提としていますが、軌道と移動時間を計算するものもあります。
ジョンマクドナルド

2
+1これは素晴らしい質問であり、3Dに限定する必要もありません。
-ashes999

回答:


8

以下のために非常に高速(例えばレーザーや弾丸など)発射、あなたは、使用することができレイを

レイには開始点と終了点があります。光線の(最小限の)データ構造は次のとおりです。

struct Ray
{
  Vector3f start, end ;
} ;

このように見える:

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

(方向ベクトルと長さをキャッシュすることもできますが、上記の非常に簡単な定義を使用しました)。

光線が光の速度で進行するレーザービームである場合、2、3フレームの間、光線を持続させます(ガンノズルから始まり、どこかの壁で終わるように)。各フレームで光線と交差するものはすべてダメージを受けます。

光線が遅い弾丸(弾丸など)の場合、弾丸がタイムステップを移動した距離は、光線によってモデル化されます。開始点は、フレームの先頭にある光線の位置であり、終了点は、フレームが完了した後の光線の位置です。弾丸の光線にあるものはすべて、弾丸によって損傷を受けます。

光線は、球体、aabbs、凸包などと効率的に衝突できます。実際の実行中のプログラムについては、Hullinatorプロジェクトを確認してください(Ctrl キーを押しながらクリックして光線を発射します)


1
光線は、多くの発射体に対してあまりうまく機能しません。たとえば、戦車の甲羅のように、ロブできる発射体。ただし、光線はまっすぐな発射体に最適です。
マイケルハウス

さて、弾丸やレーザーと比較してシェルの動きが非常に遅い場合は、はい(プレーヤーと同じように)通常のボディとしてモデル化します
bobobobo

7
技術的には、光線は開始点であり方向です。これは開始点と別の点で決定できますが、これは定義の一部ではありません。定義上、光線は無限であり、終点はありません。
ケーシーKuball

1
そうです、私が説明したのは実際には線分ですが、ほとんどの人は衝突検出について話すときにそれらを光線と呼びます。
ボボボボ

3

光線の使用は、弾丸などの発射物を瞬時に移動するのに適しています。宇宙ゲームに使用するタイプなど、速度が遅い発射体の場合、他のエンティティと同じように、ゲームワールドでの位置を単純に追跡するのが理にかなっています。私がよくしているのは、永続的なゲームオブジェクトのプロパティ(位置、回転、衝突ボックスなど)を含むEntityという基本クラスです。プレイヤードリブンと発射体はこれを継承し、ゲームワールドは対処方法を知るだけで済みます。個々のタイプのエンティティではなく、スーパークラスのエンティティ。

パフォーマンスを向上させるために、頻繁に作成および破棄するオブジェクトのプールを維持することは非常に一般的です。このプールからプルする新しい発射物が必要な場合は、必要に応じて新しい発射物を変更し、有効期限が切れたらプールに戻します。


2

衝突検出のために最適化する場合、すべてのゲームオブジェクトを2次元または3次元のツリーに保存できます。このデータ構造により、特定のエリア内のすべてのオブジェクトを非常に効率的に取得できます。

ただし、バイナリツリーには、オブジェクトの追加、削除、および位置の変更時に縮退しやすいという欠点があるため、自動バランスをとる必要があります。

実装は簡単ですが、それほど効率的ではない妥協案は、チャンクベースのアプローチを使用することです。競技場をキューブに分割し、各オブジェクトがどのキューブに触れているかを追跡します。オブジェクトとの衝突をチェックするときは、タッチしているキューブのオブジェクトリストに対してのみチェックする必要があります(2Dゲームの場合、「キューブ」を「長方形」に置き換えます)。

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