三角形の隣接データの構築


9

三角形のインデックスのリストが与えられた場合、それをジオメトリシェーダーの隣接性を持つインデックスのリストにどのように正確に変換しますか?

ここでは厳密にインデックスについて話していることに注意してください-頂点は存在しますが、浮動小数点比較やイプシロンに入る必要なしにそれらを使用して重複した頂点を一致させることができるため、インデックスのみに焦点を当てます-その仕事はすでに行われています。

リスト内の特定の三角形について、インデックス{0、1}、{1、2}および{2、0}(または{n、n + 1}、{n + 1、n + 2}、{ n + 2、n}必要に応じて)エッジから形成されます。インデックスリストは整形式であり、曲順を正しく順守します。

このようなエッジの場合、リスト全体を検索して、それらのインデックスのうちの2つを使用する別の三角形を検索できます。その三角形の3番目のインデックスは、そのエッジの隣接する三角形を完成するために使用するインデックスです。

隣接リストでは、元の三角形はそれぞれ6つのインデックスで表され、元のインデックスはスロット0、2、4に挿入されます。隣接関係を完了するための新しいインデックスはスロット1、3、5に移動します。エッジ{0、1}に対して完了するインデックスはスロット1に移動し、エッジ{1、2}に対して完了するインデックスはスロット3に移動します、インデックスエッジ{2、1}を完了するためにスロット5に入ります。

私は何を試しましたか?

私はそれを総当たりにしてみましたが、そうです、それでうまくいきますが、私はもっとエレガントなアプローチを求めています。

Eric Lengyelのエッジリストビルダーを試してみましたが、(1)元の三角形の順序が考慮されていないようです(2)曲がり順が考慮されていないようです(3)どこに行くか泥のように明確です次に、エッジリストを作成した後、(4)「triangleIndex」と「faceIndex」のような明白な明白なエラーがあるサンプルコードの疑いがあります。作成者もコードをコンパイルしたので、実行しないでください。確認しますか?

だから-これからの提案やポインタは?


ジミー、私はシャドウボリュームに関するものを編集し、タイトルを変更しました。関連がないようで混乱を招く可能性があるためです。問題は、隣接するデータを構築することですが、最終的にはシャドウボリュームに使用することです。
Nathan Reed

回答:


11

これにはハッシュテーブルを使用してみます(たとえば、 std::unordered_map C ++を使用している場合)。ハーフエッジ(順番にインデックスのペアとして表される)からハーフエッジが属する三角形の3番目のインデックスにマップするハッシュテーブルを作成します。

これは、単純に三角形のリストを反復処理して、各三角形の3つのハーフエッジをハッシュテーブルに追加することで作成できます。最初のインデックスリストに隣接する三角形のペア(0、1、2、2、1、3)があった場合、ハッシュテーブルは次のようになります。

(0, 1) -> 2
(1, 2) -> 0
(2, 0) -> 1
(2, 1) -> 3
(1, 3) -> 2
(3, 2) -> 1

エッジ(1、2)と(2、1)の両方がテーブルに表示され、エッジの2つの側面を表し、2つの三角形のそれぞれの3番目の頂点を指していることに注意してください。

次に、隣接データを構築するために必要なのは、三角形のリストをもう一度繰り返し、各三角形のエッジを反対の曲がりくねってクエリすることです。したがって、三角形(0、1、2)を処理するときは、エッジ(1、0)、(2、1)、および(0、2)をクエリします。これは、存在する場合、各エッジの反対の頂点を見つけます。


1
クールで、逆の順序でエッジを検索することは、欠けている情報の重要な要素でした。チャンプを動作させます。+1して受け入れました。
Maximus Minimus 2013

2

見て、ハーフエッジデータ構造

大まかな考え方は、特定の面に接続されている特定のエッジの半分など、ハーフエッジのリストを保存することです。この構造には、隣接する面の対応するハーフエッジに関する情報も格納されます。

データ構造は、接続性、隣接性などに関するクエリを非常に効率的にします。データを効率的に生成するアルゴリズムがありますが、必ずしも「ゲームランタイム」が効率的であるとは限りません(おそらく、これをオフラインでアセットパイプラインで実行することをお勧めします)。

これらのブログ投稿も参照してください。構造とアルゴリズムはリアルタイム衝突検出にもあると思いますが、確かに思い出せず、オフィスにコピーがありません。


-1、申し訳ありませんが、これは私がまだ持っていない情報を提供していませんでした。GSで使用するために隣接関係のあるリストを作成するのではなく、CPUでの使用に重点を置いていました。
Maximus Minimus 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.