web-dev-qa-db-ja.com

建設的なソリッドジオメトリメッシュ

構成ソリッドジオメトリ テクニックを使用して形状を作成する場合、レンダリング用のワイヤーフレームメッシュを作成するにはどうすればよいですか? CSGシェイプを直接レンダリングするためのアルゴリズムは知っていますが、「通常」にレンダリングできるように、一度だけワイヤーフレームメッシュに変換したいと思います。

もう少し詳細を追加します。 「ここに立方体、ここに球との交点、ここに円柱を引く」などの形状の説明があれば、ポリゴンメッシュを計算できるようにしたいと思います。

31
Martin

2つの主要なアプローチがあります。多角形のセットがある場合は、形状ごとにBSPツリーを作成してから、BSPツリーをマージすることができます。ウィキペディアから、

1990 Naylor、Amanatides、およびThibaultは、2つのbspツリーをマージして、2つの元のツリーから新しいbspツリーを形成するためのアルゴリズムを提供します。これには、BSPツリーで表される移動オブジェクトと静的環境(BSPツリーでも表される)の組み合わせ、多面体での非常に効率的なCSG操作、O(log n * log n)での正確な衝突検出、および2つの相互貫入オブジェクトに含まれる透明な表面(X線ビジョン効果に使用されています)。

論文はここにあります BSPツリーをマージすると多面体集合演算が生成されます

あるいは、各形状を空間上の関数として表すこともできます(たとえば、表面までの符号付き距離)。関数がゼロに等しい場所としてサーフェスが定義されている限り、関数は(MIN ==交差)、(MAX ==ユニオン)、および(NEGATION = not)演算子を使用して結合し、設定された操作を模倣できます。結果として得られるサーフェスは、マーチングキューブなどの手法を使用して、結合された関数がゼロに等しい位置として抽出できます。デュアルマーチングキューブやデュアルコンタリングなどのより優れた表面抽出方法も使用できます。もちろん、これにより、真のCSG表面の離散近似が得られます。 Dual Contouring を使用することをお勧めします。これは、立方体の角のような鋭い特徴を再構築できるためです。

21
Joe

これらのライブラリはあなたが望むことをしているようです:

www.solidgraphics.com/SolidKit/ carve-csg.com/ gts.sourceforge.net/

4
Roman

「三角多面体の構成的立体幾何学」(1990)Philip M. Hubbard doi:10.1.1.34.9374 も参照してください。

3
John Pritchard

ここ 役に立つかもしれないいくつかのGoogleScholarリンクです。

要約について私が言えることから、基本的な考え方は、CSGモデルで利用可能なボリュームデータから点群を生成し、次にいくつかのより一般的なアルゴリズムを使用して、その点群に合うように3Dで面のメッシュを生成することです。

編集:さらに調査を行うと、この種の操作は「CSGからB-Rep(境界表現)への変換」と呼ばれます。その文字列を検索すると、便利なPDFが表示されます。

http://www.scielo.br/pdf/jbsmse/v29n4/a01v29n4.pdf

また、詳細については、主要なアルゴリズムを「 マーチングキューブアルゴリズム "」と呼びます。基本的に、CSGモデルを使用してボクセルを含むオブジェクトのボリュームモデルを作成し、次にマーチングキューブアルゴリズムを使用してボクセルデータから3Dメッシュを作成します。

2
e.James

入力プリミティブを多面体メッシュに変換できる場合は、libiglのC++メッシュブールルーチンを使用できます。以下は、メッシュ(VA、FA)と別のメッシュ(VB、FB)の和集合を計算します。

igl::mesh_boolean(VA,FA,VB,FB,"union",VC,FC);

ここで、VAは、頂点位置の#VA x 3行列であり、FAは、VAへの三角形インデックスの#FA x 3行列です。以下同様です。libiglで使用される手法は、これら2つとは異なります。ジョーの回答で言及されています。三角形のすべてのペアが(空間加速度を使用して)互いに交差し、結果のサブ三角形は出力サーフェスに属するかどうかに分類されます。

1
Alec Jacobson

BRL-CADアプリケーションMGEDで運が良かったので、CSGを使用して平面を交差させて凸多面体を構築し、コマンドラインのg-stlコマンドを使用して境界表現を抽出できました。チェック http://brlcad.org/ Malcolm

1
Malcolm Lambert

各プリミティブを三角形分割(四面体化)してから、四面体メッシュに対してブール演算を実行することができます。これは、四面体-四面体演算についてのみ心配する必要があるため、「簡単」です。次に、境界抽出を実行してB-repを取得できます。プリミティブの形状を分析的に知っているので、メッシュ生成ライブラリに依存する代わりに、ニーズに合わせてプリミティブのカスタム四面体化を構築できます。

たとえば、オブジェクトが立方体と円柱の和集合であり、両方のオブジェクトが四面体化されているとします。結果のオブジェクトの境界表現を計算するには、最初に各プリミティブオブジェクトの四面体のすべての境界ファセットにラベルを付けます。次に、和集合演算を実行します。2つの四面体が互いに素である場合、何もする必要はありません。結果として得られる多面体には、両方の四面体が存在する必要があります。それらが交差する場合、処理する必要のあるいくつかのケース(おそらく12程度程度)があります。これらの各ケースで、2つの四面体のボリュームは、サーフェスの制約を尊重する方法で再三角形化する必要があります。これは、より複雑な形状とは対照的に、四面体についてのみ心配する必要があるという事実によって、いくらか簡単になります。四面体の最終コレクションで境界ファセットを抽出してサーフェスの三角形メッシュを形成できるように、境界ファセットラベルをプロセスで維持する必要があります。

1
Victor Liu