6

f : R^2 --> R^3 パラメトリック サーフェスと三角形分割されたメッシュの間の交差面のフロンティアを計算するために、正確なアルゴリズムをどのように作成できるか疑問に思っています。

私は最初のアプローチを考えました:

nStepsU = 100
nStepsV = 100
tolerance=0.01 // pick some sensical value
intersectionVertices={}
for  u from minU to maxU in nStepsU:
    for v from minV to maxV in nStepsV:
        for v in verticesInMesh:
             if euclidean distance( f(u,v), v ) < tolerance:
                 add vertex v in a set

connect the vertices in intersectionVertices with a line strip
draw the vertices in intersectionVertices

このアルゴリズムは非常に単純ですが遅く (n^3)、メッシュのトポグラフィが三角形に基づいていることを考慮していないため、出力ポイントはメッシュのポイントであり、サーフェスと三角形の交点を利用して計算されたポイントではありません。設定しなければならない許容範囲に大きく依存します。

誰かがより良いアイデアを持っているか、この目的に適したライブラリに私を連れて行くことができますか?

4

2 に答える 2

3

各三角形を繰り返し処理し、三角形とサーフェスの交点を計算します。三角形を入力として取り、ライン ストリップを出力するジオメトリ シェーダーを使用します。三角形の各頂点について、サーフェスまでの符号付き距離を計算します。次に、エッジを反復処理します。h符号が異なる 2 つの頂点がある場合、これらの頂点間のエッジはサーフェスと交差します。正確な交点を計算できると確信していますが、最も簡単な解決策は線形補間することです。

vec3 intersection = (h0 * v1 + h1 * v0) / (h0 + h1);

次に、各交点を線分の頂点として出力します。

ここに投稿したコードを使用して開始できます。結果を描画するだけの場合は、その質問で説明したのと同じ問題に遭遇する可能性があります。クライアントで頂点が必要な場合は、変換フィードバックを使用できます。

編集:ちょっとしたテストをしました。私が使った距離関数として

float distToHelicoid(in vec3 p)
{
  float theta = p.y / 5 + offset.x / 50;
  float a = mod(theta - atan(p.z, p.x), 2*PI) - PI; // [-PI, PI[
  if (abs(a) > PI/2)
    a = mod(theta - atan(-p.z, -p.x), 2*PI) - PI;
  return a;
}

内側/外側はなく、この距離関数は -90° から 90° になるため、符号が小さい負から小さい正、またはその逆の場合にのみ頂点を放出できます。90° から -90 に反転する場合ではありません。 °。ここでは、abs(dist) > 45° の距離を単純に除外しました。

ここに画像の説明を入力

クリーンな方法は、最も近い回転のインデックスを決定することです。たとえば、[-pi, pi] は回転 0、[pi, 3pi] = 回転 1 などになります。2 つの距離が同じ回転を参照する場合にのみ放出します。

于 2013-06-10T21:34:30.157 に答える
1

サーフェスが常にヘリコイドである場合は、Y 軸を中心とした円柱にすべてを投影してみることができます。

ヘリコイドの表面は、その円筒の表面に直交する線で構成され、投影後にらせんが得られます。その円柱に 3D 三角形メッシュを投影すると、2D 三角形メッシュが得られます (一部の領域は三角形の複数のレイヤーで覆われている場合があることに注意してください)。

したがって、タスクは、単純なスパイラルと交差する 2D 三角形メッシュで三角形を見つけることになります。近似に問題がなければ、そのスパイラルをセグメント化し、ある種のツリーを使用して、スパイラルと交差する三角形を見つけることができます。

らせんの一部と交差する三角形がある場合、その交点がセグメントになります。セグメントの 3D 座標を再計算するだけで、これらのセグメントのセットが交線になります。

于 2013-06-11T15:33:20.157 に答える