C#代码片段计算表面和顶点法线

时间:2009-11-27 20:48:41

标签: c# normalize geometry-surface

我需要一个C#代码段来计算表面和顶点法线。表面的种类是三角形3D闭合网格。所需的代码段必须能够使用顶点集和三角形指示。这些现在可以使用了。 3D网格物体的表面不光滑,因此需要进行平滑处理。

你能帮助我吗?

1 个答案:

答案 0 :(得分:5)

听起来您正试图通过插入曲面法线来显示3D网格并应用平滑的着色外观,例如在Phong shading中,您需要先计算法线。这与平滑网格本身的表面不同,因为这意味着改变其顶点的位置。

曲面法线可以通过三角形的两条边的getting the vector cross product来计算。

就代码而言,我并不知道任何C#示例,但这里有一个C ++应该很容易移植。它取自流行的NeHe tutorials for OpenGL

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()can be found there

请注意,这会计算单个三角形的曲面法线。由于您没有提供有关如何存储顶点和索引的信息,因此我将由您自行决定是否需要传递给此函数的三角形集。

编辑:作为补充说明,我认为三角形的“缠绕方向”非常重要。在错误的方向上缠绕也会导致法线指向相反的方向。