0

サーフェス法線と頂点法線を計算する C# コード スニペットが必要です。サーフェスの種類は、三角形化された 3D クローズド メッシュです。必要なコード スニペットは、頂点セットと三角形インデックスを使用できる必要があります。これらは現時点で使用する準備ができています。3D メッシュ オブジェクトの表面は滑らかではないため、滑らかにする必要があります。

私たちを手伝ってくれますか。

4

1 に答える 1

7

3D メッシュを表示し、フォン シェーディングなどの表面法線を補間して滑らかなシェーディングの外観を適用しようとしているように聞こえますが、最初に法線を計算する必要があります。これは、頂点の位置を変更することを意味するため、メッシュ自体の表面を滑らかにすることとは異なります。

サーフェス法線は、三角形の 2 つのエッジのベクトルの外積を取得することによって計算できます。

コードに関しては、私は C# の例を知りませんが、移植が容易な C++ の例を次に示します。これは、OpenGL の一般的な NeHe チュートリアルから取られています。

void calcNormal(float v[3][3], float out[3])                // Calculates Normal For A Quad Using 3 Points
{
    float v1[3],v2[3];                      // Vector 1 (x,y,z) & Vector 2 (x,y,z)
    static const int x = 0;                     // Define X Coord
    static const int y = 1;                     // Define Y Coord
    static const int z = 2;                     // Define Z Coord

    // Finds The Vector Between 2 Points By Subtracting
    // The x,y,z Coordinates From One Point To Another.

    // Calculate The Vector From Point 1 To Point 0
    v1[x] = v[0][x] - v[1][x];                  // Vector 1.x=Vertex[0].x-Vertex[1].x
    v1[y] = v[0][y] - v[1][y];                  // Vector 1.y=Vertex[0].y-Vertex[1].y
    v1[z] = v[0][z] - v[1][z];                  // Vector 1.z=Vertex[0].y-Vertex[1].z
    // Calculate The Vector From Point 2 To Point 1
    v2[x] = v[1][x] - v[2][x];                  // Vector 2.x=Vertex[0].x-Vertex[1].x
    v2[y] = v[1][y] - v[2][y];                  // Vector 2.y=Vertex[0].y-Vertex[1].y
    v2[z] = v[1][z] - v[2][z];                  // Vector 2.z=Vertex[0].z-Vertex[1].z
    // Compute The Cross Product To Give Us A Surface Normal
    out[x] = v1[y]*v2[z] - v1[z]*v2[y];             // Cross Product For Y - Z
    out[y] = v1[z]*v2[x] - v1[x]*v2[z];             // Cross Product For X - Z
    out[z] = v1[x]*v2[y] - v1[y]*v2[x];             // Cross Product For X - Y

    ReduceToUnit(out);                      // Normalize The Vectors
}

正規化関数 ReduceToUnit()もそこにあります。

これは、単一の三角形の表面法線を計算することに注意してください。頂点とインデックスがどのように格納されているかについての情報が提供されていないため、この関数に渡す必要がある三角形のセットを導出するのはあなたに任せます。

編集:追加の注意として、三角形の「巻き方向」が重要だと思います。間違った方向に巻くと、法線も反対方向を向くようになります。

于 2009-11-29T11:28:29.097 に答える