正如您可能从此截图中所看到的那样,我正在尝试为我正在开发的平台游戏制作物理引擎,但我遇到了一个明显的问题:我需要能够找出您可以看到构成此网格的任何三角形的角度,以便我可以计算出玩家在该三角形上的旋转和因此的角加速度。
我可以使用我创建的算法来查找玩家接触的三角形的所有3个点的位置,但我不知道如何使用这些点来计算三角形的旋转。
通过旋转,我指的是法向量离面的中心的方向,也就是一个人站在该表面上时会倾斜的角度。有人能想出一系列方程式来解决这个问题吗?
正如您可能从此截图中所看到的那样,我正在尝试为我正在开发的平台游戏制作物理引擎,但我遇到了一个明显的问题:我需要能够找出您可以看到构成此网格的任何三角形的角度,以便我可以计算出玩家在该三角形上的旋转和因此的角加速度。
我可以使用我创建的算法来查找玩家接触的三角形的所有3个点的位置,但我不知道如何使用这些点来计算三角形的旋转。
通过旋转,我指的是法向量离面的中心的方向,也就是一个人站在该表面上时会倾斜的角度。有人能想出一系列方程式来解决这个问题吗?
如果你对这两个向量进行叉积:
p1 - p0
和
p2 - p0
给定三角形的三个顶点 p0
、p1
和 p2
,可以得到法向量。如果三角形的顶点按照其外部法向量的顺时针方向排序,则该三角形被认为是指向你的。这被称为左手规则。想象一下,用左手将手指从 p0
捲曲至 p1
,拇指所指的方向就是面法线的方向:
叉积是正确的答案。不要忘记标准化结果,并且如果三角形面积为零,则结果无效,因为不存在明确定义的法线。基本上,如果三个顶点是p0、p1和p2:
vector temp = cross(p1 - p0, p2 - p0);
if (length(temp) < epsilon) then
Degenerate_triangle_error;
else
return normalize(temp);
此外,正如其他答案所说的那样,您获得的“面向上”或“面向下”的法线取决于顶点的排序方式。三角形有两个法线(当然),从标准算法中获得的法线取决于顶点的顺序。引用维基百科的话:
“对于多边形(如三角形),表面法线可以计算为多边形的两条(非平行)边的向量叉积。”
但是,法线的方向取决于所选择的点的顺序,您可以计算并使用其他启发式方法来确定反向矢量是否是您感兴趣的法线。