まず最初に明確にさせてください.. 2D メッシュについて質問しているわけではありません.2D メッシュの巻き順を決定するのは法線 z 方向で非常に簡単です.
2 つ目は、最適化されたアルゴリズムを求めていないことです。時間や速度については心配していません。メッシュで実行したいだけです。
Greedy Projection Triangulation アルゴリズムを使用して 3D オブジェクトを三角測量すると、この問題が発生します。添付の画像を確認してください。
「符号付き面積の計算」または「三角形の AB および BC ベクトルのクロス プロダクション」を使用してこのモデルに 2D アプローチを適用すると、2D メッシュのみが解決されますが、3D メッシュはどうでしょうか?
まず、どの三角形が 3D メッシュで間違った巻き方向にあるかを確認する必要があります。次に、それらの三角形のみを考慮します。問題は、どの三角形が 3D で間違った巻き方向にあることをどのように確認できるかということです。私がテストした2Dアプローチだけではできませんが、成功しませんでした。
たとえば、球の場合、球に 2D アプローチを適用することはできません。この問題を解決する方法はありますか?
ありがとう。
更新 # 1:
以下は、同じ巻線を持つエッジを確認するアルゴリズムです。うまくいかない、理由がわからない。理論的にはすべての三角形を修正する必要がありますが、修正していません。例えば添付図の球体チェックの場合。何かがおかしい。
void GLReversedEdge(int i, int j, GLFace *temp)
{
//i'th triangle
int V1 = temp[i].v1;
int V2 = temp[i].v2;
int V3 = temp[i].v3;
//i'th triangle edges
int E1[] ={V1, V2};
int E2[] ={V2, V3};
int E3[] ={V3, V1};
//adjacent triangle
int jV1 = temp[j].v1;
int jV2 = temp[j].v2;
int jV3 = temp[j].v3;
//adjacent edges
int jE1[] ={jV1, jV2};
int jE2[] ={jV2, jV3};
int jE3[] ={jV3, jV1};
// 1st edge of adjacent triangle is checking with all edges of ith triangle
if((jE1[0] == E1[0] && jE1[1] == E1[1]) ||
(jE1[0] == E2[0] && jE1[1] == E2[1]) ||
(jE1[0] == E3[0] && jE1[1] == E3[1]))
{
temp[j].set(jV2, jV1, jV3); // 1st edges orientation is same, so reverse/swap it
}
// 2nd edge of adjacent triangle is checking with all edges of ith triangle
else if((jE2[0] == E1[0] && jE2[1] == E1[1]) ||
(jE2[0] == E2[0] && jE2[1] == E2[1]) ||
(jE2[0] == E3[0] && jE2[1] == E3[1]))
{
temp[j].set(jV1, jV3, jV2); // 2nd edges orientation is same, so reverse/swap it
}
// 3rd edge of adjacent triangle is checking with all edges of ith triangle
else if((jE3[0] == E1[0] && jE3[1] == E1[1]) ||
(jE3[0] == E2[0] && jE3[1] == E2[1]) ||
(jE3[0] == E3[0] && jE3[1] == E3[1]))
{
temp[j].set(jV3, jV2, jV1); // 3rd edges orientation is same, so reverse/swap it
}
}
void GetCorrectWindingOfMesh()
{
for(int i=0; i<nbF; i++)
{
int j1 = AdjacentTriangleToEdgeV1V2;
if(j1 >= 0) GLReversedEdge(i, j1, temp);
int j2 = AdjacentTriangleToEdgeV2V3;
if(j2 >= 0) GLReversedEdge(i, j2, temp);
int j3 = AdjacentTriangleToEdgeV3V1;
if(j3 >= 0) GLReversedEdge(i, j3, temp);
}
}