【发布时间】:2013-12-21 18:20:16
【问题描述】:
我一直在搞乱一些 3D 的东西(更具体地说是 LibGdx,但这对于这个问题并不重要),最近我发现了一个问题,试图计算一个简单三角形的每面法线。 我生成的三角形网格具有以下顶点(也显示在下面的链接中):
v0 = [3 , 0 , 0] //X, Y, Zv1 = [1.49 , 0.86 , 0] //X, Y, Zv2 = [3 , 0 , -1] //X, Y, Z
为了计算三角形网格的面法线,我使用了一个可以在许多教程/示例网站中找到的函数(稍作修改):
私有 Vector3 计算正常(浮动 vX1,浮动 vY1,浮动 vZ1, 浮动 vX2,浮动 vY2,浮动 vZ2, 浮动 vX3,浮动 vY3,浮动 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 正常 = crsProd.nor(); // 向量的归一化 恢复正常; }将构成三角形的 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; //PositionverticesArr[v0Idx + 1] = 0; //PositionverticesArr[v0Idx + 2] = 0; //PositionverticesArr[v0Idx + 3] = -0.49; //NormalXverticesArr[v0Idx + 4] = -0.86; //NormalYverticesArr[v0Idx + 5] = 0; //NormalZ
verticesArr[v1Idx + 0] = 1.49; //PositionverticesArr[v1Idx + 1] = 0.86; //PositionverticesArr[v1Idx + 2] = 0; //PositionverticesArr[v1Idx + 3] = -0.49; //NormalXverticesArr[v1Idx + 4] = -0.86; //NormalYverticesArr[v1Idx + 5] = 0; //NormalZ
verticesArr[v2Idx + 0] = 3; //PositionverticesArr[v2Idx + 1] = 0; //PositionverticesArr[v2Idx + 2] = -1; //PositionverticesArr[v2Idx + 3] = -0.49; //NormalXverticesArr[v2Idx + 4] = -0.86; //NormalYverticesArr[v2Idx + 5] = 0; //NormalZ
我问第二个问题是因为我看过教程和示例,其中为三角形的每个顶点显示了不同的垂直法线向量(用于计算每个面的法线而不是每个顶点的法线)。
【问题讨论】:
标签: java opengl opengl-es 3d libgdx