1

球体を表すポリゴン メッシュを生成するソフトウェアに取り組んでおり、球体に穴を開けたいと考えています。このポリゴン メッシュは、球体の表面を覆うだけのオーバーレイです。どのポリゴンが自分の穴と交差するかを判断する方法はよくわかっており、それらをコレクションから削除することもできますが、その時点から少し混乱しています。高レベルの概念について誰かが私を助けることができるかどうか疑問に思っていましたか?

基本的に、私は次の 3 つの状況を想定しています。

1.) The cylindrical hole does not intersect my sphere.
2.) The cylindrical hole partially goes through my sphere.
3.) The cylindrical hole goes all the way through my sphere. 

#1 については、これをテストして (ポリゴンが削除されていない)、それに応じて行動する (何もしない) ことができます。#2 と #3 については、穴を考慮して球体を再テッセレーションする方法がわかりません。#3については、基本的に次のような考えがあります。

a.) Find your entry point (a circle)
b.) Find your exit point (a circle) 
c.) Remove the necessary polygons
d.) Make new polygons along the 4* 'sides' of the hole to keep my 
    sphere a manifold. 

この非常に単純化されたアルゴリズムには、埋めたい「穴」がいくつかあります。たとえば、実際には穴に 4 つの側面を持たせたくありません。穴は円柱にするか、少なくとも円柱のテッセレーション表現にする必要があります。また、これらの新しいポリゴンを作成して、テッセレーションされたサーフェスに穴のある球を維持する方法もわかりません。

シナリオ 2 にアプローチする方法がわかりません。

4

3 に答える 3

2

建設的なソリッドジオメトリが必要なようです。

カーブはあなたが望むことをするかもしれません。ランタイム レンダリングだけが必要な場合は、OpenCSGが機能します。

于 2010-10-18T22:57:28.137 に答える
1

これをレンダリング (視覚化) したいだけなら、生成されたメッシュをまったく変更する必要はないかもしれません。代わりに、ステンシル バッファを使用して、穴のある球体をレンダリングします。たとえば、円盤 (薄い円柱) の外縁近くに円形の穴 (機械のベース プレートとして) をレンダリングしており、その周りに固体オブジェクトと透明オブジェクトを組み合わせているため、穴が実際には穴である必要があります。実行時に生成される形状を三角測量するのが面倒だったので、これにはステンシルを選択しました。

  1. Stencil バッファを使用して OpenGL コンテキストを作成する

    ステンシルに 8 ビットを使用していますが、この手法では 1 ビットしか使用しません。

  2. Depth&Color マスクを使用してステンシルをクリアし0、オフにします。

    これは、メッシュをステンシルでレンダリングする前に行う必要があります。したがって、この方法でレンダリングされたオブジェクトがさらにある場合は、それぞれのオブジェクトの前にこれを行う必要があります。

  3. 1ソリッド メッシュ用の でステンシルを設定

  4. 0穴メッシュ用のクリア ステンシル

  5. Depth&Color マスクをオンにして、ステンシルが存在するソリッド メッシュをレンダリングします。1

コードでは次のようになります。

// [stencil]
glEnable(GL_STENCIL_TEST);
// whole stencil=0
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
// turn off color,depth
glStencilMask(0xFF);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
// stencil=1 for solid mesh
glStencilFunc(GL_ALWAYS,1,0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glCylinderxz(0.0,y,0.0,r,qh);
// stencil=0 for hole meshes
glStencilFunc(GL_ALWAYS,0,0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
for(b=0.0,j=0;j<12;j++,b+=db)
    {
    x=dev_R*cos(b);
    z=dev_R*sin(b);
    glCylinderxz(x,y-0.1,z,dev_r,qh+0.2);
    }
// turn on color,depth
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);
// render solid mesh the holes will be created by the stencil test
glStencilFunc(GL_NOTEQUAL,0,0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glColor3f(0.1,0.3,0.4);
glCylinderxz(0.0,y,0.0,r,qh);
glDisable(GL_STENCIL_TEST);

whereは、 -axis を回転軸とする半径でglCylinderxz(x,y,z,r,h)円柱をレンダリングする関数です。角度ステップです。半径は-大きい、 -穴の半径、 - 穴の中心 そして、プレートの厚さです。(x,y,z)rydb(2*Pi/12)rdev_rdev_Rqh

結果は次のようになります (2 つのプレートのそれぞれがこれでレンダリングされます)。

例

このアプローチは、薄いオブジェクトにより適しています。切断面が十分に厚い場合は、切断面のレンダリングを追加する必要があります。そうしないと、これらの部分の照明が正しくない可能性があります。

于 2016-09-13T09:04:46.547 に答える
1

今年初めに、スカラー フィールドを使用して CSG 操作を実装しました。パフォーマンスが重要でない場合は、うまく機能します。つまり、計算はリアルタイムではありません。問題は、導関数がどこでも定義されているわけではないため、安価な頂点法線をそのように計算することを忘れてしまう可能性があることです。これは、後処理として実行する必要があります。私が使用した論文 (最初の回答) と、私が作成したスクリーンショットについては、こちらを参照してください。

マーチング キューブを使用した暗黙的な曲面での CSG 操作

また、この方法の CSG では、初期メッシュを暗黙的なサーフェスを使用して表現する必要があります。ジオメトリック メッシュは平面に分割できますが、良い結果は得られません。したがって、球体は半径と原点で表す必要があり、円柱は半径、原点、底辺の高さで表す必要があります。

于 2010-10-19T08:28:39.863 に答える