TL; DR BSPツリーを使用してブール演算を実装する必要があります。
まあ、私たちは話しているようです ここで建設的な立体幾何です。私はCSGを商用レベルで実装しているので、それについて1つか2つ知っています。
CSGに関する古典的な論文は、 BSPツリーの結合と多面体集合操作の生成れます。正直に言うと、ここで説明するのは多すぎますが、簡単に言えば、このアルゴリズムは、各ポリゴンメッシュからのBSPツリー。2番目のステップは、これらのBSPツリーをマージすることです。1つのツリーを取得して、他のツリーに挿入するだけです。次に、アルゴリズムは、ノードを分割および減算するために各リーフノードを処理する方法の説明に進みます。最終形状に不要なノードは削除され、他のノードには適切な親が与えられます。
ちょっと待って!その論文は基本的にポリゴンメッシュと3Dプレーンについて語っています。
アルゴリズムは任意の次元に一般化できるため、2Dの場合、平面の代わりにラインセグメントをバイナリパーティションとして使用するのは簡単です。したがって、2つのポリゴンがマージされるよりも、各ポリゴンがBSPツリーに変換されます。最後に、結果のツリーをトラバースして最終的なポリゴンを生成し、
このアルゴリズムとCSGは一般にレンダリングとメッシュフェースを直接処理せず、実際にはレンダリングの準備が整っていないため、最終的なBSPツリーのフェースを抽出する必要があることに注意してください。また、レイトレーシングはCSGの結果をレンダリングするためのより簡単なアプローチであり、抽出して実際に分割するのではなく、レイがツリーをトラバースするだけでよいことがわかります。、顔するのでは(バイナリパーティションのみを扱うことを思い出してください)。
数値の堅牢性について。幾何学的計算には2つのタイプがあることに注意してください。
- 構築に基づくものは、前の操作の結果に基づいて形状を構築します。たとえば、新しい操作で
y = sqrt(x)
使用y
します。これは構築と呼ばれます。問題は、数値誤差が急速に蓄積することです。
- あるいは、代わりに述語を使用する操作があります。基本的に、構造を使用する代わりに、条件がtrue / falseであるかどうかを尋ね、異なる操作で同じ値を使用します。従来のテストには、インサークルとオリエンテーションテストが含まれます。これは、特に単精度または倍精度を使用している場合は数値エラーの疑いもありますが、通常ははるかに良い結果が得られます。速度と精度が異なる他のソリューションが存在します。これは、正確な結果を得るために平面ベースのジオメトリを使用することにより、構築を回避する最近の論文の1つです。論文からも引用します。
ポリゴンメッシュの平面ベースの表現の概念は、最初に杉原と入里によって説明されました[SI89]。この種類の表現は、ブール式の評価のようにメッシュで表されるソリッドのトポロジを変更するタスクに関して、1つの重要な利点を提供します。結果の多面体を取得するために新しいプライマリジオメトリ情報を構築する必要はありません。
最後に、BSP CSGの実装を開始したい場合は、BSP Faqsから開始することをお勧めします。