-1 c# normalize geometry-surface
我需要一个C#代码片段来计算表面和顶点法线.表面的种类是三角形3D闭合网格.所需的代码段必须能够使用顶点集和三角形指示.这些现在可以使用了.3D网格物体的表面不光滑,因此需要进行平滑处理.
你可以帮帮我吗.
听起来您正在尝试显示3D网格并通过插入表面法线应用平滑的着色外观,例如在Phong着色中,您需要首先计算法线.这与平滑网格本身的表面不同,因为这意味着改变其顶点的位置.
至于代码,我不知道任何C#示例,但这里有一个C++应该很容易移植.它来自流行的NeHe 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
}
Run Code Online (Sandbox Code Playgroud)
也可以在那里找到规范化函数ReduceToUnit().
请注意,这会计算单个三角形的曲面法线.由于您没有提供有关如何存储顶点和索引的信息,因此我将由您自行决定是否需要传递给此函数的三角形集.
编辑:作为补充说明,我认为三角形的"缠绕方向"是重要的.沿错误方向缠绕也会导致法线指向相反方向.
归档时间: |
|
查看次数: |
3357 次 |
最近记录: |