如何计算三维空间中一个点的偏航角、俯仰角和翻滚角?

3

给定一个三维空间中的点,需要哪些角度(例如欧拉角)才能将一条线转换为指向该点的方向?

想象一下,我有一条线(或一个盒子)在三维空间中,我想将其航向、俯仰和翻滚角度转换为指向从原点到三维点的方向,那么我应该使用哪些角度值?

我无法计算出指向位置(例如(1,2,3))的角度数学公式。

1个回答

10
注意:我将使用Fletcher Dunn的3D Math Primer for Graphics and Game Development中定义的“heading,pitch,bank”约定,而不是“偏航,俯仰,滚转”。
首先,请注意,在二维坐标系中,您只需要一个角度和大小就可以“指向”二维空间中的任何点。
同样,在三维坐标系中,您只需要两个角度 + 大小就可以“指向”三维空间中的任何点。最后一个角度(“bank”或“roll”)不会影响三维空间中点的位置。相反,它“旋转”了指向该点的箭头。如果对象具有360度对称性,则根本看不到旋转影响对象。如果对象不对称(例如飞机),则会影响对象(例如将一侧机翼倾斜向地面,另一侧机翼倾斜向天空)。
因此,原始问题实际上变成了“如何找到指向三维空间中任何点的heading角度,pitch角度和大小?”
你可以轻松使用三角函数来计算。假设我们有点 (1,2,3),并且我们正在尝试计算方向、俯仰和大小。
对于以下示例,让我们使用此图表,其中左侧轴为 X,上方为 Y,右侧为 Z。那么点 (1,2,3) 就由蓝色球体表示。

enter image description here

1. 求大小

首先,让我们找到最简单的值,即大小。幸运的是,无论我们处于多少维度,任意两点之间的大小(长度)都很容易找到,只需使用毕达哥拉斯定理即可。由于我们处于三维空间,并且正在计算从原点到我们的点的距离,因此我们的距离公式变为:

magnitude = sqrt(x*x + y*y + z*z)

插入我们的实际值:
magnitude = sqrt(1*1 + 2*2 + 3*3)
          = 3.7416573868

因此,我们的大小(或长度)约为3.741

2. 查找标题

接下来,要查找标题,请注意我们只关心绕XZ平面的旋转,而完全不关心Y轴。如果我们将3D空间“压平”成2D,则变得轻松查找标题

我们可以画一个与X轴形成90度角的三角形(红色三角形),然后计算该角度。从三角函数中回忆,tan(angle) = opposite / adjacent,解出angle,我们得到angle = arctan(opposite / adjacent)

在这种情况下,“相邻”是已知量(redAdjacent = x = 1),而“对边”也是已知的(redOpposite = z = 3)。但我们不想使用arctan来解决方程,而是要使用atan2,因为它会为我们处理x和y的所有不同情况。
heading = atan2(redOpposite, redAdjacent)

将我们的实际值插入:

heading = atan2(3, 1)
        = 1.249045772398

因此,我们的标题1.249弧度,或者约为72°

3. 找到俯仰角

最后,我们需要找到俯仰角。与我们在标题中所做的类似,我们可以将三维空间沿包含这三个点的平面展成二维:(A)原点(0,0,0),(B)我们的点(1,2,3)和(C)我们的点在XZ平面上的投影(1,0,3)(例如,将Y值设置为0)。

如果我们在这三个点之间画一个三角形,你会注意到它们再次形成了一个直角三角形(绿色三角形)。我们可以再次使用arctan2简单地计算出角度。

我们已经在步骤1中计算出了绿色斜边(即我们向量的大小):

greenHypotenuse = sqrt(x*x + y*y + z*z)
                = 3.7416573868

我们也知道绿色三角形的相反面与y值相同:
greenOpposite = y
              = 2

使用勾股定理,我们可以找到相邻角的长度:
greenOpposite^2 + greenAdjacent^2 = greenHypotenuse^2
y*y + greenAdjacent^2 = x*x + y*y + z*z
greenAdjacent^2 = x*x + z*z
greenAdjacent = sqrt(x*x + z*z)

注意,计算绿色三角形的邻边长度的另一种方法是注意到redHypotenuse == greenAdjacent,我们可以使用以下方法找到redHypotenuse
redHypotenuse^2 = redAdjacent^2 + redOpposite^2
                = x*x + z*z
redHypotenuse = sqrt(x*x + z*z)

插入实际值,我们得到:

greenAdjacent = sqrt(1*1 + 3*3)
              = 3.1622776602

现在我们知道了绿色三角形的邻边和对边长度,我们可以再次使用 arctan2 函数:

pitch = atan2(greenOpposite, greenAdjacent)
      = atan2(2, 3.1622776602)
      = 0.563942641356

因此,我们的俯仰角0.5634弧度,约为32°

结论

如果您从原点开始画一条长度为3.741、方向为1.249弧度、俯仰角为0.564弧度的直线,则它将从(0,0,0)延伸到(1,2,3)


如果您想在任意两点之间进行相同的操作,只需将一个点从另一个点中减去 - Senseful
非常清晰的答案。谢谢! - Hephaestus

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