1

Three.js を介してメッシュを読み込んでおり、各クワッドを個別にテクスチャリングしようとしています。現在、各面 (三角形) にテクスチャを適用できますが、現在の三角形と最後の三角形が四角形の一部であるかどうかを判断する方法がわかりません (これらは 2 つの頂点を共有しますが、どの頂点を共有するのでしょうか?)

2 つの三角形が四角形を形成しているかどうかを調べるにはどうすればよいですか?

var last = null;
for(var i in geometry.faces)
{
    var face = geometry.faces[i];
    var normal = face.normal.clone().normalize();

    if(normal.y >= 0.9999)
    {
        face.materialIndex = 1;

        //Determine if face & last are part of a quad
        if(face && last == same quad)
        {
            face.color = last.color;
        }
        else
        {
            face.color = new THREE.Color(Math.random() * 0xFFFFFF); 
        }

        last = face;
    }
}
4

1 に答える 1

1

まず、問題が十分に定義されていないことを認識する必要があります。接続された三角形メッシュでは、すべての三角形に 3 つの隣接要素があります。それらのそれぞれがクワッドである可能性があります。したがって、クワッドとは何かを推測することしかできません。法線をチェックするという選択は良い出発点ですが、たとえばメッシュが平面の場合は機能しません。

最初のステップは、各三角形のすべての近傍を見つけることです。各三角形にはちょうど 3 つの隣接要素があります。これは楽しい 2 パス アルゴリズムであり、時間とメモリが直線的である必要があります。各三角形には、他の三角形へのインデックスであるneighbors[3]のようなものが必要です。

次に、それらのそれぞれについて「quadiness」ヒューリスティックを計算できます。それらはほぼ同一平面上にあり、長方形である必要があります。四辺の法線と内角でスコアを付けます。それらを取得したら、すべての三角形をこの番号で並べ替えることができます。最初に最良の推測を削除し、それらをクワッドにマージして、完了するまで続けます。

ほとんどの場合、これで問題なく動作するはずですが、これが機能しなくなる場合があります。クワッドが必要な理由に応じて、ケースに合わせてヒューリスティック関数を修正してみてください。しかし、正しい解決策はないことを覚えておくことが重要です。問題は未定義です。

于 2013-10-15T04:33:31.377 に答える