1

私は、2005 年以来の 3D スクリプト言語である SceneMax の創設者です。最適化されたパフォーマンスのために、3ds max のような 3d パッケージで構築され、octree アルゴリズムによって分割される 1 つのメッシュ オブジェクトを使用してシーン レンダリングを追加したいと考えています。

メッシュ .X ファイルを受け取り、それをノード (octree) に分割し、それをレンダリングする方法を知っているアルゴリズムをどこで見つけることができるか知っていますか? エンジンに追加したい。エンジンはオープン ソースです (興味がある場合は、SceneMax を検索してください)。

4

2 に答える 2

3

いくつかのバリエーションがありますが、octree を構築するときの 1 つのアプローチは次のとおりです。

  1. パーティション化されるシーンまたはオブジェクト全体を含む 1 つのノード (つまり立方体) から始めます。
  2. シーン/オブジェクトの各要素 (例: メッシュ、ポリゴン、または作業している粒度) について:
    1. その要素がノード内に完全に収まるかどうかを確認してください。
    2. はいの場合、ノードを 8 つの子に分割し、子ごとに手順 2 を再帰的に実行します。
    3. いいえの場合は、ノードがなくなるまで次のノードに進みます。
    4. 要素を含むことができる最小のノードに要素を追加します。

ノードのサイズやノード内の要素の数が特定のしきい値よりも小さい場合など、ヒューリスティックに基づいて再帰を停止することも一般的です。

octree の構築に関する詳細については、この Flipcode チュートリアルを参照してください。

octree を取得したら、それをレンダリングするために使用できるいくつかのアプローチがあります。基本的な考え方は、ノードを「見る」ことができない場合、その子も見ることができないため、そのノード (およびその子) 内のすべてをレンダリングする必要がないということです。

錐台カリングは簡単に実装でき、「見えますか?」ビュー プロジェクションのフラスタムを使用してテストします。Gamedev.net には、フラスタムカリングやその他のアプローチについて説明した記事があります。

さらに進んで、錐台カリングの後にオクルージョン カリングを実装することもできます。これにより、ノードが隠されているかどうかを判断するために z バッファーを使用して、ノードの前にあるノードによって覆われているノードのレンダリングをスキップできます。これには、octree ノードを最も近いものから最も遠いものへトラバースできることが含まれます。この手法については、この Gamasutra の記事で説明されています。

于 2009-01-10T22:41:31.900 に答える