ウィキペディアの資料を読み始めましたが、シーングラフがどのように機能し、それがゲームにどのように役立つかを本当に理解していないように感じます。
- ゲームエンジン開発のコンテキストでのシーングラフとは何ですか?
- 2Dゲームエンジンに実装したいのはなぜですか?
- シーングラフの使用は、線形エンティティマネージャーを備えた従来のエンティティシステムの代替として機能しますか?
ウィキペディアの資料を読み始めましたが、シーングラフがどのように機能し、それがゲームにどのように役立つかを本当に理解していないように感じます。
ゲームエンジン開発のコンテキストでのシーングラフとは何ですか?
これは、ゲームスペース内のポイントの周囲にあるオブジェクトをすばやく簡単に見つけられるように、ゲームスペース内のゲームオブジェクトをアクティブに並べ替えるコードです。
そうすれば、簡単に:
と他のこと。それは、宇宙での迅速な検索を可能にすることです。これは「スペースパーティショニング」と呼ばれます。それは分割統治についてです。
2Dゲームエンジンに実装したいのはなぜですか?
これは、ゲームの種類、より正確にはゲームスペースの構造によって異なります。
たとえば、ゼルダのようなゲームは、画面内のすべてのオブジェクト間の衝突をテストするのに十分な速さである場合、そのようなテクニックを必要としません。ただし、非常に遅くなる可能性があるため、ほとんどの場合、少なくともシーングラフ(または任意の種類のスペースパーティション)を設定して、すべての移動オブジェクトの周囲を把握し、それらのオブジェクトでのみ衝突をテストします。
だから、それは異なります。ほとんどの場合、パフォーマンス上の理由から必要です。ただし、スペースパーティションの実装は、ゲームスペースの構造に完全に関連しています。
シーングラフの使用は、線形エンティティマネージャーを備えた従来のエンティティシステムの代替として機能しますか?
いいえ。
ゲームエンティティのオブジェクトライフをどのように管理する場合でも、スペースパーティション/シーングラフは、スペース内のオブジェクトをすばやく検索できるようにするためだけのものです。ほとんどの場合、ゲームスペースのさまざまな部分に対応するオブジェクトのスロットがいくつかあるオブジェクトであり、それらのスロットでは、それらの部分にあるオブジェクトになります。フラット(2または4の2Dスクリーンディバイダーなど)、またはツリー(バイナリツリー、クアッドツリー、またはその他の種類のツリーなど)、または操作の数を制限するその他の並べ替え構造にすることができます。実行して、スペース関連の情報を取得します。
1つのことに注意してください:
場合によっては、目的ごとに異なる個別のスペースパーティションシステムが必要になることもあります。多くの場合、「シーングラフ」はレンダリングに関するものであるため、プレーヤーの視点に応じて最適化されます。その目的は、レンダリングするオブジェクトのリストをすばやく収集してグラフィックカードに送信できるようにすることです。別のオブジェクトの周囲のオブジェクトの検索を実行するのにはあまり適していません。そのため、物理エンジンを使用する場合のように、正確な衝突検出に使用するのは困難です。したがって、物理的な目的のためだけに、別のスペースパーティションシステムを使用している場合があります。
例を挙げると、プレイヤーの宇宙船が非常に正確に回避しなければならないボールがたくさんある「弾幕」ゲームを作りたいと思います。十分なレンダリングと衝突検出のパフォーマンスを達成するには、次のことを知っておく必要があります。
そこで、2Dの画面を4つの部分に再帰的にカットし、四分木を作成します。四分木はすべてが絶えず動くため、ゲームの目盛りごとに更新されます。そのため、四分木内の各オブジェクト(宇宙船、弾丸、モンスター)の位置を追跡して、画面のどの部分にあるかを知る必要があります。
1.を達成するのは簡単です。システムに箇条書きを入力するだけです。
2.を達成するために、画面の境界にある四分木(画面の正方形のセクション)に葉のリストを保持しました。これらの葉には、境界の近くにある弾丸のID /ポインターが含まれているので、それらのレンダリングと衝突の管理も停止できるかどうかを確認するために、それらが移動していることを確認する必要があります。(少し複雑かもしれませんが、あなたはその考えを理解します。)
3と4を達成するには、プレイヤーの宇宙船の近くにあるオブジェクトを取得する必要があります。したがって、最初に、プレーヤーの宇宙船がある葉を取得し、その中のすべてのオブジェクトを取得します。そうすれば、すべてのオブジェクトではなく、周囲のオブジェクトでのみプレーヤーの宇宙船との衝突をテストします。(それはもう少し複雑ですが、あなたは考えを理解します。)
そうすれば、何千発もの弾丸が絶えず動いている場合でも、ゲームがスムーズに実行されることを確認できます。
他のタイプのスペース構造では、他のタイプのスペース分割が必要です。通常、カート/オートゲームには「トンネル」シーングラフがあります。これは、プレイヤーが道路沿いのものだけを視覚的に見るため、「トンネル」内のすべての表示オブジェクトを取得するには、道路上のどこにいるかを確認するだけです。 。
シーングラフとは何ですか?シーングラフには、特定のシーンのすべてのジオメトリが含まれています。これらは、オブジェクトの相互の相対的な平行移動、回転、およびスケール(および他のアフィン変換)を表すのに役立ちます。
たとえば、戦車(トラックと銃を備えたタイプ)について考えてみます。シーンには複数の戦車が含まれている場合がありますが、それぞれの戦車の向きと位置は異なり、砲塔は異なる方位角に回転し、銃の仰角も異なります。各戦車に対して銃をどのように配置するかを正確に把握するのではなく、シーングラフをトラバースして適切に配置するときに、アフィン変換を蓄積できます。これにより、そのようなものの計算がはるかに簡単になります。
2Dシーングラフ:2Dのシーングラフの使用は、コンテンツが十分に複雑であり、オブジェクトに大きなボディにしっかりと固定されていない多数のサブコンポーネントがある場合に役立つことがあります。そうでなければ、他の人が述べているように、それはおそらくやり過ぎです。2Dでのアフィン変換の複雑さは、3Dの場合よりもかなり少なくなります。
線形エンティティマネージャー:線形エンティティマネージャーが何を意味するのか正確にはわかりませんが、シーン内のどこに物が配置されているかを追跡するだけの場合は、シーングラフを使用すると状況が簡単になります。シーン内のさまざまなオブジェクトまたはサブオブジェクト間の空間依存度。
シーングラフは、環境内のすべてのオブジェクトを整理する方法です。通常、効率的なレンダリングのためにデータを整理するように注意が払われます。グラフ、または必要に応じてツリーで、サブオブジェクトの所有権を表示できます。たとえば、最高レベルには都市のオブジェクトがあり、その下には多くの建物のオブジェクトがあり、その下には壁や家具があります...
ただし、ほとんどの場合、これらは3Dシーンにのみ使用されます。2Dシーンでは複雑なことはしないことをお勧めします。
シーングラフの応答性については、Web上にかなりの数の異なる哲学があるようです。人々は、ジオメトリ、カメラ、光源、ゲームのトリガーなど、さまざまなものを入れる傾向があります。
一般に、シーングラフはシーンの説明として説明し、シーンに存在するエンティティを含む単一または複数のデータ構造で構成されます。これらのデータ構造は、任意の種類(配列、ツリー、複合パターンなど)であり、エンティティの任意のプロパティまたはシーン内のエンティティ間の任意の関係を記述できます。これらのエンティティは、ソリッドドローアブルオブジェクトからコリジョンメッシュ、カメラ、光源まで、さまざまなものにすることができます。私がこれまでに見た唯一の本当の制限は、後で依存関係の問題を防ぐために、ゲーム固有のコンポーネント(ゲームトリガーなど)を除外することを人々が推奨していることです。そのようなものは、たとえば「LogicEntity」、「InvisibleEntity」、または単に「Entity」に抽象化する必要があります。
シーングラフでのデータ構造の一般的な使用法を次に示します。
ゲームやエンジンでシーングラフを使用する方法は、固体オブジェクト、カメラ、その他のものなど、位置を持つもの間の親子関係を記述することです。このような関係は、子の位置、規模、向きが親のそれと相対的であることを意味します。これにより、カメラをプレーヤーに追従させたり、光源を懐中電灯オブジェクトに追従させたりすることができます。また、太陽系のように、太陽に対する惑星の位置や、惑星に対する月の位置を記述できるようにすることもできます。
また、ゲーム/エンジンの特定のシステムに固有のものをシーングラフに保存できます。たとえば、物理エンジンの一部として、衝突をテストするには複雑すぎるジオメトリを持つ可能性のあるソリッドオブジェクトの単純な衝突メッシュを定義した場合があります。これらの衝突メッシュ(別の名前があると確信していますが、忘れました:P)をシーングラフに配置し、モデル化したオブジェクトに従わせることができます。
シーングラフで考えられるもう1つのデータ構造は、他の回答で述べられているような、ある種のスペース分割です。これにより、表示錐台にないオブジェクトをクリップしたり、衝突チェックが必要なオブジェクトを効率的に除外したりするなど、シーンで高速クエリを実行できます。また、クライアントコード(エンジンを作成している場合)が目的を問わずカスタムクエリを実行できるようにすることもできます。そうすれば、クライアントコードは独自のスペースパーティション構造を維持する必要がありません。
私はあなたと他の読者に、シーングラフをどのように使うことができるか、そしてあなたがそれに何を入れることができるかについてのいくつかのアイデアを与えたことを望みます。シーングラフを使用する方法は他にもたくさんあると思いますが、これらは私が思いついたものです。
実際には、ビデオゲームのシーンオブジェクトは、シーンがレンダリングされるときにツリーとして「ウォーク」されるグラフに編成されることはめったにありません。グラフィックシステムは通常、レンダリングするものの1つの大きな配列を想定しており、この大きな配列は直線的に歩きます。
銃を持っている人や砲塔のある戦車など、幾何学的な子育て関係を必要とするゲームは、グラフィックシステムの外部で、必要に応じてそれらの関係を定義および適用します。これらの関係は1つの深さしかない傾向があるため、任意の深さのツリー構造が必要になることはほとんどありません。