Math 如何计算3D中点的偏航、俯仰和横摇?

Math 如何计算3D中点的偏航、俯仰和横摇?,math,vector,3d,angle,Math,Vector,3d,Angle,给定三维空间中的一个点,将直线变换为指向该对象的点所需的三个角度(例如欧拉角)是什么 假设我有一条三维直线(或一个长方体),我想将它的方向、俯仰和倾斜变换为从原点指向三维点,我将使用哪些值来表示这些角度 我无法计算出指向某个位置的角度的数学公式,例如(1,2,3)注:我将使用定义为的惯例“航向、俯仰、横摇”,而不是“偏航、俯仰、横摇” 首先,请注意,在二维坐标系中,“点”到二维中的任何点只需要一个角度+幅值 类似地,在三维坐标系中,可以将+幅值设置为指向三维中任意点的“点”。最后一个角度(“倾斜

给定三维空间中的一个点,将直线变换为指向该对象的点所需的三个角度(例如欧拉角)是什么

假设我有一条三维直线(或一个长方体),我想将它的方向、俯仰和倾斜变换为从原点指向三维点,我将使用哪些值来表示这些角度

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

注:我将使用定义为的惯例“航向、俯仰、横摇”,而不是“偏航、俯仰、横摇”

首先,请注意,在二维坐标系中,“点”到二维中的任何点只需要一个角度+幅值

类似地,在三维坐标系中,可以将+幅值设置为指向三维中任意点的“点”。最后一个角度(“倾斜”或“滚动”)不会影响点在三维中的位置。相反,它“旋转”指向它的箭头。如果对象是360度对称的,则根本看不到旋转影响对象。如果物体不对称(如飞机),则会影响物体(如一个机翼向地面倾斜,另一个机翼向天空倾斜)

所以最初的问题实际上变成了,“我如何找到指向三维空间中任意点的航向角、俯仰角和大小?”

使用三角函数可以很容易地解决这个问题。假设我们有一个点
(1,2,3)
,我们试图计算航向、俯仰和震级

对于以下示例,让我们使用此图,其中左轴是X,上轴是Y,右轴是Z。点
(1,2,3)
,然后由蓝色球体表示

1.找到震级 首先,让我们找到最简单的值,大小。幸运的是,无论我们处在多少维中,只要使用。由于我们在3D中,并且我们正在计算从原点到点的距离,因此我们的距离公式为:

magnitude = sqrt(x*x + y*y + z*z)
插入我们的实际值:

magnitude = sqrt(1*1 + 2*2 + 3*3)
          = 3.7416573868
heading = atan2(3, 1)
        = 1.249045772398
所以我们的量级(或长度)是~
3.741

2.找到标题 接下来,要找到航向,请注意,我们只关心围绕XZ平面的旋转,而根本不关心Y轴。如果我们要将三维空间“展平”为二维空间,那么它就是

我们可以画一个与X轴成90度角的三角形(红色三角形),然后计算这个角度。从三角函数中调用
tan(角)=对向/邻接
,求解
,我们得到
角=arctan(对向/邻接)

在这种情况下,“相邻的”是一个已知的数量(
red相邻=x=1
),而“相反的”也是已知的(
redOpposite=z=3
)。我们不想用arctan来解方程,而是想用arctan,因为它可以处理x和y的所有不同情况

因此,我们:

heading = atan2(redOpposite, redAdjacent)
插入我们的实际值:

magnitude = sqrt(1*1 + 2*2 + 3*3)
          = 3.7416573868
heading = atan2(3, 1)
        = 1.249045772398
所以我们的航向是
1.249
rad,或者~
72°

3.找到球场 最后,我们需要找到球场。与我们对航向所做的类似,我们可以沿着包含这三个点的平面将3D空间展平为2D:(A)原点
(0,0,0)
,(B)我们的点
(1,2,3)
,以及(C)我们的点投影到XZ平面
(1,0,3)
(例如,通过设置Y值为0)

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

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

我们还知道绿色三角形的对立面与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^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
rad,俯仰为
0.564
rad,它将从
(0,0,0)
延伸到
(1,2,3)
注:我将使用由定义的惯例“航向、俯仰、倾斜”

首先,请注意,在二维坐标系中,“点”到二维中的任何点只需要一个角度+幅值

类似地,在三维坐标系中,可以将+幅值设置为指向三维中任意点的“点”。最后一个角度(“倾斜”或“滚动”)不会影响点在三维中的位置。相反,它“旋转”指向它的箭头。如果对象是360度对称的,则根本看不到旋转影响对象。如果物体不对称(如飞机),则会影响物体(如一个机翼向地面倾斜,另一个机翼向天空倾斜)

所以最初的问题实际上变成了,“我如何找到指向三维空间中任意点的航向角、俯仰角和大小?”

使用三角函数可以很容易地解决这个问题。假设我们有一个点
(1,2,3)
,我们试图计算航向、俯仰和震级

对于以下示例,让我们使用此图,其中左轴是X,上轴是Y,右轴是Z。点
(1,2,3)
,然后由蓝色球体表示

1.找到震级 首先,让我们找到最简单的值,大小。幸运的是,任意两点之间的大小(长度)很容易确定