【问题标题】:Calculating per-face normal for a simple triangle计算简单三角形的每面法线
【发布时间】:2013-12-21 18:20:16
【问题描述】:

我一直在搞乱一些 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

为了计算三角形网格的面法线,我使用了一个可以在许多教程/示例网站中找到的函数(稍作修改):

私有 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; //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

我问第二个问题是因为我看过教程和示例,其中为三角形的每个顶点显示了不同的垂直法线向量(用于计算每个面的法线而不是每个顶点的法线)。

【问题讨论】:

    标签: java opengl opengl-es 3d libgdx


    【解决方案1】:

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

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

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

    【讨论】:

    • 我想我明白你的回答。我的错误是将法线视为位置向量。我似乎仍然无法“想象”三角形的正常“是什么”(特别是对于我的三角形),但有了你的回答,我想我可以继续前进。至于答案的第二部分,“三角形的所有顶点都应该具有相同的法线......”,这仅适用于每个面的法线,对吧?
    • 法线可以由用户定义。一个三角形在它的角落的法线在数学上都是一样的,但是当你画一个球体时,为了让它看起来更像球体,每个小形状角落的法线对于每个相互接触的形状都是相同的,要么被平均,要么通过 obj 文件读取,要么通过特定体积的导数公式计算。这样做的目的是通过使用 Phong 着色之类的东西进行着色来给人一种连续性的印象。
    【解决方案2】:

    问题 1: 您可以将法线想象为一个线段,其一个端点位于坐标 (0, 0, 0) 处,另一个端点位于您获得的值处,即 (-0.49, -0.86, 0.0)。法线的重要之处在于它的方向(或方向),这与您在 3D 空间中放置的位置无关。

    问题 2: 很可能那些不是表面法线,而是顶点法线。更多信息在这里: https://en.wikipedia.org/wiki/Vertex_normal

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 2021-01-01
      • 2011-01-09
      • 2017-06-30
      • 2023-03-24
      相关资源
      最近更新 更多