ゲームシーングラフには何を含める必要がありますか?


10

ゲームシーングラフ内に正確に何を含める必要があるかを明確にしていただけませんか。次のリストをご覧ください。

  • ゲーム俳優?(当然のことながら、状態を変更するすべてのオブジェクトは、シーングラフの主要な部分である必要があります)
  • 単純な静的ゲームオブジェクト (つまり、アニメーション化されない、または衝突しないバックグラウンドの場所を除外します)
  • ゲームトリガー?
  • ゲームライト?
  • ゲームカメラ?
  • 武器弾丸?
  • ゲームの爆発と特殊効果?

上記で検討したオブジェクトタイプ。次に、シーングラフのカバレッジに進みます。

  • シーングラフには、レベルの開始以降のゲームレベルマップ全体を含める必要がありますか、それともマップの表示部分のみを含める必要がありますか?2番目がtrueの場合、プレイヤーが移動するときに、ゲームオブジェクトを追加または削除することにより、シーングラフが継続的に更新されます。ただし、マップの可視領域のみを含めると、トラバースと更新がはるかに高速になります。

@ジョシュ:私の質問を編集して修正してくれてありがとう。
Bunkai.Satori

回答:


4

他のシーングラフテクノロジーが行っていることをよく読んでおけば、多くのメリットが得られると思います。

背景
たとえば、Ogre3Dの説明を見てください。オープンソースのシーングラフベースのグラフィックエンジンです。チュートリアルを見てシーンノードがどのように使用されているかを確認することをお勧めします(注:Ogreのシーンノードとシーンマネージャにどのような機能が存在するかを学ぶのではなく、Ogreの使い方を学ぶように言っているのではありません)。

SceneNodeのドキュメント:http ://www.ogre3d.org/docs/api/1.9/class_ogre_1_1_scene_node.html

SceneManagerのドキュメント:http ://www.ogre3d.org/docs/api/1.9/class_ogre_1_1_scene_manager.html

他に注目に値するものは次のリンクです:http :
//sgl.sourceforge.net/#features

これはOpenGLベースのシーングラフソリューションであり、そこにある機能ページには、含まれる可能性のあるすべてのノードが表示されます。

推奨されるノード
依存関係の問題が発生しないように、シーングラフはゲームロジックからできるだけ抽象化する必要があると私は考えています。それぞれの箇条書きについて、次のように言います。

ゲーム俳優
私はおそらくノーだと思います。Ogreと同様に、ベースのEntityクラス(オブジェクト固有のロジックを含む)と、オブジェクトをレンダリングするための適切な情報(位置、方向など)を取得するためのEntityメンバーポインターを持つベースSceneNodeがあります。

編集:ここではシーングラフにゲームアクターを含めないように言っているわけではありません(そうしないと、何も表示されません:P)論理ゲームアクタークラスへの参照を持つシーンノードがあると言っているので、ゲームオブジェクトのレンダリングと更新の疎結合がまだあります。

単純な静的ゲームOjbectsの
はい

ゲームトリガー?
いいえ、これはゲーム固有のロジックのように聞こえます。

ゲームライト?
はい

ゲームカメラ?
はい

武器弾丸?
これについては完全には定かではありませんが、おそらく「はい」と言いますが、「BulletCollection」の親シーンノードの子としてすべての弾丸を必要とするので、その位置をキャッシュできるので、レンダリングする弾丸を削除および追加するためのシーングラフ。

ゲームの爆発と特殊効果?
確かではありませんが、誰かに答えさせてください。

シーングラフのカバレッジ
レベルが比較的小さい場合は、レベル全体をシーングラフに格納し、Octree(通常は屋外環境用)またはBSPツリー(通常は屋内環境用)を使用して可視性を最適化できるはずです。

はるかに大きなレベルがあり、レベルのロードを実行したくない場合は、ここでストリーミングが始まりますが、それは完全に別の問題です。私は小さなレベルから始めて、パフォーマンスに悪影響を与えずにどれだけ大きくできるかを段階的に見ていきます。

結論
私にとって、シーングラフはゲームループのレンダリング部分です。レンダリングとロジックの更新を近づけすぎないようにしてください。そうしないと、厄介な依存関係の問題が発生します。


+1-詳細で貴重な回答をありがとうございます。SceneGraphに関する私の知識は、Game Coding Complete(amazon.com/Game-Coding-Complete-Third-McShaffry/dp/1584506806/…)という本から来ています。リンク、特にOgreのSceneNodeクラスは役に立ちます。あなたに参照のうえ結論、あなたはゲーム内のリンクされたオブジェクトの変換を更新するための素晴らしい方法として、シーングラフを見ていますか?あなたとジョシュの答えはどちらも素晴らしいです。これにはもっと多くの情報が含まれていると思うので、これをAccepted Answerとマークします。
Bunkai.Satori

@Bunkaiあなたのゲームオブジェクトがそれらの位置、方向などのためにベクトルを更新するUpdate()メソッドを持っていると考えるならば、あなたのシーンノードがしなければならないことはすべて、メッシュをレンダリングし、GetPosition()とGetOrientationを使用してそれを変換することです。 ()そしてそれを画面にレンダリングします。これにより、アクターのロジックが、実際に努力すべきレンダリングコードから分離されます。
レイデイ

9

私の傾向は、シーングラフに入れるものを少なくすることを提案することです。特にトムフォーサイスの記事「シーングラフ-申し訳ありません」を参照してください。

Forsythの記事の要点は、無関係なものを1つの大きなマスターデータ構造に詰め込もうとするべきではないということです。これは、ゲームのすべてをそこから導き出し、それをすべて1つの大きな異種混合リストに入れること(つまり、それは悪いこと)に関して、この回答で触れたアイデアに非常に似ていGameObjectます。

ツリー構造に適しているため、実際には強力な親子関係を実際に示すオブジェクトは世界ではほとんどありません。ここでは通常、テーブル上のコーヒーカップの標準的な例が使用されます。確かに、それはテーブルの「子」であると考えることができます...少なくともノックオフされるまで。それでも、それは本当にまだテーブルの子ですか?これは、「ツリー」がかなり浅くなり、とにかくリストに退化する可能性があることを意味します。

したがって、複数のデータ構造を使用することをお勧めします。これは、それらに最も意味のあることです。たとえば、静的なジオメトリとライトは、シーングラフに入れるのに合理的なもののようです。表現されたオブジェクトに自然な親子関係がない場合でも、それらが静的であるという事実は、それらが変化しないことを知っている構造的な親子関係を与えることができることを意味します。

ゲーム俳優...よくわかりません。実際、移動する傾向があるものは、通常、それらをグラフのルートの近くに置くか、常に再ペアレント化する必要があることを意味します(これは雑用であり、超効率的ではありません)。

弾丸、トリガー、特殊効果、および他の場所に保存する他の一時的なオブジェクト。レンダーグラフには、レンダリングしたり、視覚的な表現(トリガーは通常、非表示のバウンディングボリュームであり、弾丸は通常はレイキャストである)を含めないでください。レンダーレイヤーとロジックレイヤーの分離に努める必要があります

それだけの価値があるので、学業以外で使用するために作成したレンダラーでツリーのようなシーングラフを使用したことはありません(明らかに、以前にツリーのようなシーングラフを作成したので、このように結論を導きました。今、あなたに同意してもらおうとしています)。

ゲームのスタイル(四分木、八分木、BSPなど)に適した空間分割方法を使用して、(a)このフレームを処理して(b)レンダリングする必要があるゲーム内の論理エンティティをグループ化/カリングしますこのフレーム。次に、リスト(b)のオブジェクトのセットを、論理オブジェクトをマッピングして説明をレンダリングし、プロパティに基づいてバケットにソートするシステムにフィードします(たとえば、透明度を使用するものはすべて「もの」のバケットに押し込まれますそれを逆順にレンダリングする必要があります。次に、すべてのバケットを順番にレンダリングし、各バケットについてすべての説明を順番にレンダリングします。これを「ツリー」と呼ぶことができると思いますが、一般的な状態は表示されません/従来のツリー指向のシーングラフが行う伝播方法を変換します。YYMV、


+1は優れた回答です。おすすめ記事を読みました。基本的に、リンクされたオブジェクトの位置を更新するためにシーングラフを使用することをお勧めします(例:一連の兵士が船の上にいます。船が移動すると、兵士も一緒に移動し、手の中の銃も移動します)。したがって、インターフェイスクラスCGameObjectを用意する予定であり、シーングラフに配置されるすべてのオブジェクトがその一部であると想定されます。アドバイスありがとうございます。
Bunkai.Satori
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.