我一直在搞一些 3D 的东西(更具体地说是 LibGdx,但这对这个问题无关紧要),最近我发现了一个问题,试图计算一个简单三角形的每面法线。
我生成的三角形网格具有以下顶点(也显示在下面的链接中):v0 = [3 , 0 , 0] //X, Y, Z
v1 = [1.49 , 0.86 , 0] //X, Y, Z
v2 = [3 , 0 , -1] //X, Y, Z
为了计算该三角形网格的面法线,我使用了一个可以在许多教程/示例网站中找到的函数(稍作修改):
private Vector3 calculateNormal(float vX1, float vY1, float vZ1,
float vX2, float vY2, float vZ2,
float vX3, float vY3, float vZ3) {
Vector3 edge1 = new Vector3(vX1, vY1, vZ1).sub(vX2, vY2, vZ2);
Vector3 edge2 = new Vector3(vX2, vY2, vZ2).sub(vX3, vY3, vZ3);
Vector3 crsProd = edge1.crs(edge2);//edge1 和 edge2 的叉积
Vector3 normal = crsProd.nor();// vector 的归一化
恢复正常;
}
将形成三角形的 3 个顶点的值传递给此方法后,我得到以下结果:[-0.49, -0.86, 0.0]
Representation of the Triangle Mesh and the Normal Vector (Image)
问题 1:
从我读到的内容来看,我认为该三角形的计算法线值不正确。我的猜测是法线应该位于垂直于三角形中心的某个地方(X 应该是正值,Z 应该是负值)。
问题 2:
在计算三角形的每面法线后,三角形的所有顶点是否应该具有相同的每面法线值,如下所示:verticesArr[v0Idx + 0] = 3; //Position
verticesArr[v0Idx + 1] = 0; //Position
verticesArr[v0Idx + 2] = 0; //Position
verticesArr[v0Idx + 3] = -0.49; //NormalX
verticesArr[v0Idx + 4] = -0.86; //NormalY
verticesArr[v0Idx + 5] = 0; //NormalZ
verticesArr[v1Idx + 0] = 1.49; //Position
verticesArr[v1Idx + 1] = 0.86; //Position
verticesArr[v1Idx + 2] = 0; //Position
verticesArr[v1Idx + 3] = -0.49; //NormalX
verticesArr[v1Idx + 4] = -0.86; //NormalY
verticesArr[v1Idx + 5] = 0; //NormalZ
verticesArr[v2Idx + 0] = 3; //Position
verticesArr[v2Idx + 1] = 0; //Position
verticesArr[v2Idx + 2] = -1; //Position
verticesArr[v2Idx + 3] = -0.49; //NormalX
verticesArr[v2Idx + 4] = -0.86; //NormalY
verticesArr[v2Idx + 5] = 0; //NormalZ
我问第二个问题是因为我看过教程和示例,其中显示了三角形每个顶点的不同垂直法线 vector (用于计算每个面的法线而不是每个顶点的法线)。
最佳答案
问题 1 :法线没有位置。它们是垂直于由三角形的任意两个 vector 的方向组合创建的平面的 vector 的方向。
问题 2 :三角形的所有顶点都应具有相同的法线,因为它们属于同一平面,即三角形平面的一部分。
如您所见,法线 vector 的方向将是相同的,无论您在三角形上的哪个位置。
关于java - 计算简单三角形的每面法线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20389335/