我一直在搞乱一些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); // Cross product between edge1 and edge2 Vector3 normal = crsProd.nor(); // Normalization of the vector return normal; }
在将形成三角形的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
我问第二个问题是因为我看过教程和示例,其中三角形的每个顶点都显示了不同的垂直法线向量(用于计算每面法线而不是每顶点法线)。 p>
答案 0 :(得分:4)
问题1 :法线没有位置。它们是矢量的方向,垂直于由三角形的任意两个矢量的方向组合创建的平面。
问题2 :三角形的所有顶点应具有相同的法线,因为它们是同一平面的一部分,即三角形的平面。
正如您所看到的,法线向量的方向将是相同的,只要您在三角形上。
答案 1 :(得分:0)
问题1: 您可以将法线想象成一个线段,该线段的一个端点位于坐标(0,0,0),而另一个端点位于您获得的值,即(-0.49,-0.86,0.0)。法线的重要之处在于其方向(或方向),而这并不取决于您将其放置在3D空间中的位置。
问题2: 这些很有可能不是表面法线,而是顶点法线。更多信息在这里: https://en.wikipedia.org/wiki/Vertex_normal