如何计算3D点的偏航角,俯仰角和侧倾角?

感性的

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

想象一下,我在3D中有一条线(或一条盒子),并且想要转换其航向,俯仰和倾斜以从原点指向3D点,对于那些角度我将使用什么值?

我无法计算出指向诸如的位置的角度的数学方法(1,2,3)

感性的

注意:我将使用Fletcher Dunn的3D Math Primer for Graphics and Game Development ”定义的约定“ heading,pitch,bank”代替“偏航,俯仰,横滚”

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

同样,在3D坐标系中,只需两个角度+大小即可“指向” 3D中的任何点。最后一个角度(“倾斜”或“横滚”)不影响3D中点的位置。而是“旋转”指向它的箭头。如果对象是360度对称的,则旋转根本不会影响到对象。如果物体不是对称的(例如飞机),它将影响物体(例如,一侧向地面倾斜,另一侧向天空倾斜)。

因此,最初的问题实际上变成了“如何找到“指向” 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. Find the heading

Next, to find the heading, notice that we just care about rotation about the XZ plane, and we don't care about the Y-axis at all. If we were to "flatten" the 3D space into 2D, it becomes trivial to find the heading.

We can draw a triangle that forms a 90 degree angle with the X-axis (red triangle) and then calculate that angle. Recall from trigonometry tan(angle) = opposite / adjacent, and solving for angle, we get angle = arctan(opposite / adjacent).

In this case "adjacent" is a known quantity (redAdjacent = x = 1), and "opposite" is known too (redOpposite = z = 3). Instead of using arctan to solve the equation though, we want to use atan2 since it'll handle all the different cases of x and y for us.

So we have:

heading = atan2(redOpposite, redAdjacent)

Plugging in our actual values:

heading = atan2(3, 1)
        = 1.249045772398

so our heading is 1.249 rad, or ~72°.

3. Find the pitch

Finally we need to find the pitch. Similarly to what we did with the heading, we can flatten the the 3D space into 2D along the plane that contains these three points: (A) the origin (0,0,0), (B) our point (1,2,3), and (C) our point as it would project onto the XZ plane (1,0,3) (e.g. by setting 0 for the Y-value).

If we draw a triangle between all 3 of these points, you will notice that they form a right-triangle again (green triangle). We can simply calculate the angle using arctan2 again.

We already calculated the green hypotenuse in step 1 (i.e. the magnitude of our vector):

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

We also know the opposite of the green triangle is the same as the y-value:

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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android:从方位角,侧倾和俯仰获取设备方向

使用Eigen库从旋转矩阵获得俯仰和偏航

Pannellum 360图像查看器-获得俯仰和偏航

具有已知内在和外在矩阵的立体视觉3d点计算

从鼠标位置和深度图计算3D点

用于在3D数据中定位机器人的角点的计算

如何在Swift中获取iPhone的当前俯仰,偏航和侧倾?

旋转矢量传感器值到方位角,侧倾和俯仰

在Flutter中获取设备方向(偏航,横摇和俯仰)

Unity3d根据俯仰,横滚和偏航角度列表平滑地旋转对象

我如何才能绝对获得ARAnchor的偏航,俯仰和滚动?

如何制作2D和3D矩阵的点积(分别针对每个维进行计算)

如何从前向矢量计算俯仰和偏航值

如何在matplotlib图表中创建3d框并计算每个框中的点总数?

计算3D点的像素坐标

用3D和2D点对应关系计算旋转和平移矩阵

如何根据偏航,俯仰和横滚值旋转对象

使用Cwiid Python的Wiimote Motion Plus的俯仰和偏航

如何从enu向量中获得方位角和仰角

使用侧倾-俯仰-偏航角变换图像(图像校正)

处理:从matrix4x4获取偏航角,俯仰和横滚角

以3D形式显示点,线和三角形(C ++ API和文件格式)

俯仰和偏航-位置和传送

JavaFX 8转换为俯仰,偏航和侧倾旋转角度

计算点和3D构面之间的角度

如何计算Unity 3D的两点之间的距离?

从 3D 三角点恢复姿势

如何使用 matplotlib python 创建具有 3 个点的 3d 三角形

如何计算两点之间的 3D 角度?