繁体   English   中英

如何计算 3D 中一个点的偏航、俯仰和滚动?

[英]How do I calculate the yaw, pitch, and roll of a point in 3D?

给定 3D 空间中的一个点,将一条线转换为指向该 object 所需的三个角度(例如欧拉角)是多少?

想象一下,我在 3D 中有一条线(或一个框),我想将它的航向、俯仰和坡度转换为从原点指向 3D 点,这些角度我将使用什么值?

我无法计算出数学来计算指向(1,2,3)等位置的角度。

注意:我将使用3D Math Primer for Graphics and Game Development by Fletcher Dunn定义的约定“航向、俯仰、倾斜”,而不是“偏航、俯仰、滚动”。

首先,请注意,在 2D 坐标系中,您只需要一个角度 + 幅度即可“指向”2D 中的任何点。

同样,在 3D 坐标系中,您只需要两个角度+ 幅度即可“指向”3D 中的任何点。 最后一个角度(“bank”或“roll”)不影响 3D 中点的位置。 相反,它会“旋转”指向它的箭头。 如果 object 是 360 度对称的,则根本不会看到影响 object 的自旋。 如果 object 不对称(例如飞机),它将影响 object(例如,将一个机翼向地面倾斜,另一个向天空倾斜)。

所以最初的问题实际上变成了,“我如何找到航向角、俯仰角和幅度来“指向”3D 空间中的任何点?

您可以使用三角函数轻松计算出这一点。 假设我们有点(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

所以我们的大小(或长度)是 ~ 3.741

2.找到标题

接下来,要找到航向,请注意我们只关心围绕 XZ 平面的旋转,而根本不关心 Y 轴。 如果我们要将 3D 空间“展平”为 2D 空间,则查找标题变得微不足道

我们可以画一个三角形 forms 与 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 rad,或 ~ 72°

3.找到音高

最后,我们需要找到音高。 与我们对标题所做的类似,我们可以将 3D 空间沿包含这三个点的平面展平为 2D:(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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM