在给定顶点坐标的情况下,在3D中找到三角形面的法线角度

时间:2009-10-04 12:29:31

标签: math 3d geometry trigonometry

你可以从this screenshot告诉我,我正在尝试为我正在制作的平台游戏制作一个物理引擎,但我遇到了一个明确的问题:我需要能够找到答案您可以看到的任何一个三角形的角度构成了这个网格,这样我就可以计算出该三角形上的旋转角度加速度。

screenshot

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

通过旋转,我指的是远离脸部中心的法线方向,即,如果人站在那个表面上,人的倾斜角度。有人可以提出一系列方程式来解决这个问题吗?

4 个答案:

答案 0 :(得分:34)

如果你采用两个向量的叉积:

p1 - p0

p2 - p0

其中p0p1p2是三角形的三个顶点,您将获得正常值。如果顶点相对于其向外法线顺时针排序,则认为三角形指向您。这称为左手规则。想象一下,用你的左手握住你的左手,从p0p1,你的拇指朝着正常的方向伸出:

face pointing away from camera face pointing towards camera

答案 1 :(得分:10)

交叉产品是正确的答案。不要忘记将结果标准化,并且不要忘记如果三角形的面积为零,则结果无效,因为没有明确定义的法线。基本上,如果你的三个顶点是p0,p1和p2:

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

另外,正如另一个答案所说,无论你是'面向上'还是'面朝'正常将取决于你的顶点的顺序。

答案 2 :(得分:3)

要完成回答您的问题,一旦您拥有三角形的单位法线向量,就可以使用点积来计算出角度。

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

另外,请注意OpenGL通常使用右手坐标系,所以如果你使用它,那么你的三角形顶点将有一个逆时针排序。

答案 3 :(得分:2)

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

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

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