2

私は STL ファイルのインポーターに取り組んでおり、与えられた法線を利用して三角形の巻き順序を決定しようと考えました。4 つの三角形を含むサンプル データを以下に示します (元のデータには 70,000 を超える三角形があります)。私のコードのロジックは、頂点が反時計回りに指定されていると仮定して法線を計算し、この計算された法線と指定された法線との内積を計算します。結果が正の場合は反時計回り、そうでない場合は時計回りとします。

        tm.SetCCW(Dot(Cross(facet.getVertex2() - facet.getVertex1(),facet.getVertex3() - facet.getVertex1()),facet.getNormal()) > 0.0);

このロジックは、特定の 3D スキャナーからの一連のファイルで失敗します。これらのファイルを Rhino3D にロードし、"Dir" を発行して法線方向を見ると、Rhino は正しい方向を持っています! 私が試した他のいくつかのSTLビューアと同じです。

私のコードは、頂点がサンプル データ上で時計回りの順序で提供されていると推測しますが、そのワインディング オーダーを使用すると、モデルは裏返しになり、提供された法線が間違っていることを意味します。

これは、STL インポータが提供された法線を無視し、反時計回りの巻き順を想定するのが慣習であるという結論につながります。私の仮定が正しいかどうかを検討するために、STL ファイル形式の経験が豊富な人を探しています。

solid object_name
    facet normal -0.651094 0.733745 -0.194150
        outer loop
            vertex 30.335684 -40.893806 -68.126500
            vertex 31.155055 -39.911656 -67.162500
            vertex 30.263726 -40.702583 -67.162500
        endloop
    endfacet
    facet normal -0.654292 0.732059 -0.189714
        outer loop
            vertex 30.335684 -40.893806 -68.126500
            vertex 31.225185 -40.098797 -68.126500
            vertex 31.155055 -39.911656 -67.162500
        endloop
    endfacet
    facet normal -0.711866 0.677947 -0.183397
        outer loop
            vertex 31.225185 -40.098797 -68.126500
            vertex 31.980540 -39.044870 -67.162500
            vertex 31.155055 -39.911656 -67.162500
        endloop
    endfacet
    facet normal -0.714326 0.676343 -0.179716
        outer loop
            vertex 31.225185 -40.098797 -68.126500
            vertex 32.048799 -39.228928 -68.126500
            vertex 31.980540 -39.044870 -67.162500
        endloop
    endfacet
endsolid

編集:最初のファセットの私の計算:

p1 = {30.335684, -40.893806, -68.126500}
p2 = {31.155055, -39.911656, -67.162500}
p3 = {30.263726, -40.702583, -67.162500}

u = p2 - p1 = {0.819371, 0.98215, 0.964}
w = p3 - p1 = {-0.071958, 0.191223, 0.964}

u x w = {0.762454, -0.859241, 0.227356}   (calculated normal)

given normal = {-0.651094, 0.733745, -0.194150}

calculated_normal <dot> given_normal = -1.17103

verdict: 90 < theta < 270 where theta is the angle between the calculated and given normals
4

1 に答える 1