代码之家  ›  专栏  ›  技术社区  ›  chris

在给定三角形顶点坐标的情况下,求出三角形面的法向角。

  •  14
  • chris  · 技术社区  · 16 年前

    你也许能从中看出 this screenshot 我正在为我正在研究的平台制作一个物理引擎,但是我遇到了一个明确的问题:我需要能够找出组成这个网格的任何一个三角形的角度,这样我就可以计算出玩家在这个三角形上的旋转和角加速度。

    screenshot

    我可以使用我创建的算法来查找玩家所接触的任何三角形的所有3个点的位置,但是我不知道如何使用这些点来计算三角形的旋转。

    通过旋转,我指的是法向远离面部中心的方向,也就是说,如果一个人站在表面上,他将倾斜的角度。有人能想出一系列方程来解决这个问题吗?

    4 回复  |  直到 10 年前
        1
  •  34
  •   ChrisF    13 年前

    如果取两个向量的叉积:

    p1 - p0
    

    p2 - p0
    

    哪里 p0 , p1 p2 是三角形的三个顶点,你会得到法向。如果顶点相对于其外法向顺时针排列,则认为三角形指向您。这叫做左手定则。想象一下用手指弯曲左手 P0 P1 ,你的拇指向面部正常方向伸出:

    face pointing away from camera face pointing towards camera

        2
  •  9
  •   sdclibbery    16 年前

    交叉积是正确的答案。不要忘记使结果正规化,也不要忘记,如果三角形的面积为零,则结果无效,因为没有定义好的正规。基本上,如果您的三个顶点是p0、p1和p2:

    vector temp = cross(p1 - p0, p2 - p0);
    if (length(temp) < epsilon) then
        Degenerate_triangle_error;
    else
        return normalize(temp);
    

    另外,正如另一个答案所说,是否得到“上向”或“下向”法线将取决于顶点的顺序。

        3
  •  3
  •   Incredulous Monk    16 年前

    为了回答你的问题,一旦你得到了三角形的单位法向量,你就可以用点积算出这个角。

    两个单位向量的点积等于它们之间夹角的余弦,因此,如果计算单位法向量的点积和单位上方向向量的arccos,就会得到三角形的斜角(远离水平方向的角度)。

    另外,请注意OpenGL通常使用右手坐标系,因此如果使用右手坐标系,则三角形顶点将具有逆时针顺序。

        4
  •  2
  •   whatnick    16 年前

    三角形有两条法线(当然),从标准算法中得到的法线取决于其他顶点的顺序。引用 wiki

    对于多边形(如三角形),曲面法向可以计算为多边形两条(非平行)边的矢量交叉积。

    但是法向量的方向取决于所选点的顺序,您可以计算它并使用其他一些启发式方法来确定反向向量是否是您感兴趣的法向量。