在三维空间中,给定三角形顶点的坐标,求其面的法线角度

15

正如您可能从此截图中所看到的那样,我正在尝试为我正在开发的平台游戏制作物理引擎,但我遇到了一个明显的问题:我需要能够找出您可以看到构成此网格的任何三角形的角度,以便我可以计算出玩家在该三角形上的旋转和因此的角加速度。

screenshot

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

通过旋转,我指的是法向量离面的中心的方向,也就是一个人站在该表面上时会倾斜的角度。有人能想出一系列方程式来解决这个问题吗?


1
感谢您添加图片,但我只是个访客 :-( - Chris
谢谢大家,问题已解决! - Chris
4个回答

35

如果你对这两个向量进行叉积:

p1 - p0

p2 - p0

给定三角形的三个顶点 p0p1p2,可以得到法向量。如果三角形的顶点按照其外部法向量的顺时针方向排序,则该三角形被认为是指向你的。这被称为左手规则。想象一下,用左手将手指从 p0 捲曲至 p1,拇指所指的方向就是面法线的方向:

面朝远离相机 面朝向相机


11

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

vector temp = cross(p1 - p0, p2 - p0);
if (length(temp) < epsilon) then
    Degenerate_triangle_error;
else
    return normalize(temp);
此外,正如其他答案所说的那样,您获得的“面向上”或“面向下”的法线取决于顶点的排序方式。

如果三角形的面积为零,那么你定义的是一条线或一个点,它们不是三角形,对吧?这可以通过一个守卫条件来捕获,不是吗? - jcolebrand

3
为了回答您的问题,一旦您有了三角形的单位法向量,您就可以使用点积来计算角度。
两个单位向量的点积等于它们之间夹角的余弦值,因此如果您计算单位法向量和单位Up向量的点积的反余弦值,您将得到三角形的斜率角度(与水平线的夹角)。
另外,请注意,OpenGL通常使用右手坐标系,因此如果您正在使用该坐标系,则三角形顶点将具有逆时针的顺序。

2

三角形有两个法线(当然),从标准算法中获得的法线取决于顶点的顺序。引用维基百科的话:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接