给定一个三维空间中的点,需要哪些角度(例如欧拉角)才能将一条线转换为指向该点的方向?
想象一下,我有一条线(或一个盒子)在三维空间中,我想将其航向、俯仰和翻滚角度转换为指向从原点到三维点的方向,那么我应该使用哪些角度值?
我无法计算出指向位置(例如(1,2,3)
)的角度数学公式。
(1,2,3)
,并且我们正在尝试计算方向、俯仰和大小。(1,2,3)
就由蓝色球体表示。
首先,让我们找到最简单的值,即大小。幸运的是,无论我们处于多少维度,任意两点之间的大小(长度)都很容易找到,只需使用毕达哥拉斯定理即可。由于我们处于三维空间,并且正在计算从原点到我们的点的距离,因此我们的距离公式变为:
magnitude = sqrt(x*x + y*y + z*z)
magnitude = sqrt(1*1 + 2*2 + 3*3)
= 3.7416573868
因此,我们的大小(或长度)约为3.741
。
接下来,要查找标题,请注意我们只关心绕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°
。
最后,我们需要找到俯仰角。与我们在标题中所做的类似,我们可以将三维空间沿包含这三个点的平面展成二维:(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
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)
。