2009-11-27 36 views
-1

我需要一个计算曲面和顶点法线的C#代码片段。表面类型是三角形3D封闭网格。所需的代码片段必须能够使用顶点集和三角形指示符。这些准备就绪可以使用。 3D网格物体的表面不光滑,所以需要平滑。计算曲面和顶点法线的C#代码片段

你能帮助我吗?

+1

更具体。你有什么投入?这是多面体吗?他们如何定义? – jason 2009-11-27 20:50:51

+0

它是什么样的表面?三角网格?格?式?你能发表一些你到目前为止的代码吗? – 2009-11-27 20:51:34

+0

请返回并将您的澄清添加到您原来的问题中,以便每个人都可以轻松看到它们。 – bobbymcr 2009-11-27 21:28:32

回答

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为好。

注意,此计算通常为一个三角形的表面。既然你没有提供关于你的顶点和索引如何存储的信息,我将留给你来推导出你需要传递给这个函数的一组三角形。

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