我一直在搞一些 3D 的东西(更具体地说是 LibGdx,但这对这个问题无关紧要),最近我发现了一个问题,试图计算一个简单三角形的每面法线。
我生成的三角形网格具有以下顶点(也显示在下面的链接中):
v0 = [3 , 0 , 0] //X, Y, Zv1 = [1.49 , 0.86 , 0] //X, Y, Zv2 = [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; //PositionverticesArr[v0Idx + 1] = 0; //PositionverticesArr[v0Idx + 2] = 0; //PositionverticesArr[v0Idx + 3] = -0.49; //NormalXverticesArr[v0Idx + 4] = -0.86; //NormalYverticesArr[v0Idx + 5] = 0; //NormalZverticesArr[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; //NormalZverticesArr[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
我问第二个问题是因为我看过教程和示例,其中显示了三角形每个顶点的不同垂直法线 vector (用于计算每个面的法线而不是每个顶点的法线)。

最佳答案

问题 1 :法线没有位置。它们是垂直于由三角形的任意两个 vector 的方向组合创建的平面的 vector 的方向。

问题 2 :三角形的所有顶点都应具有相同的法线,因为它们属于同一平面,即三角形平面的一部分。

如您所见,法线 vector 的方向将是相同的,无论您在三角形上的哪个位置。

关于java - 计算简单三角形的每面法线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20389335/

10-12 03:41
查看更多