正如您可能从这个屏幕截图中看出的那样,我正在尝试为我正在开发的平台游戏制作一个物理引擎,但我遇到了一个明确的问题:我需要能够找出其中任何一个的角度你可以看到的三角形组成了这个网格,这样我就可以计算出玩家在那个三角形上的旋转和角加速度。
我可以使用我创建的算法来查找玩家接触的任何三角形的所有 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);
此外,正如另一个答案所说,您是否获得“朝上”或“朝下”法线将取决于您的顶点的顺序。
要完成回答您的问题,一旦您有了三角形的单位法线向量,您就可以使用点积计算出角度。
两个单位向量的点积等于它们之间夹角的余弦,所以如果你计算单位法向量和单位向上向量的点积的反正弦值,你将得到三角形的斜角(角度距从水平)。
另外,请注意 OpenGL 通常使用右手坐标系,因此如果您使用右手坐标系,那么您的三角形顶点将具有逆时针顺序。
三角形有 2 条法线(当然),您从标准算法中获得的法线取决于顶点的顺序。引用维基
“对于多边形(例如三角形),表面法线可以计算为多边形两个(非平行)边的矢量叉积。”
但是法线的方向取决于所选点的顺序,您可以计算它并使用其他一些启发式方法来确定反向向量是否是您感兴趣的法线。