四元数的经度/纬度

ric*_*ick 5 angle quaternions latitude-longitude

我有一个经度和纬度,并希望将其转换为四元数,并想知道如何做到这一点?我想用这个,因为我有一个应用程序,它将地球投射到球体上,我想从一个位置旋转到另一个位置.

最好!

mee*_*pzh 5

有一种方法可以在不使用矩阵或向量的情况下解决这个问题,类似于这个 numpy implementation。我们可以将经度/纬度视为组合在一起的两个四元数旋转。

让我们使用 Z-up 右手坐标系。让我们称之为经度?和纬度?,以及由两者表示的点为(?,?)。对于可视化,红色轴对应 X,绿色对应 Y,蓝色对应 Z。

我们想要找到表示从 (0, 0) 旋转到(a , b)的四元数(红色):

具有起点和终点的球体

我们可以将这种旋转表示为首先是纵向旋转,然后是横向旋转的组合,如下所示:

第一轮 第二轮

首先,我们沿 Z 轴旋转了a,从而转换了 X 和 Y 轴。然后,我们沿新的局部 Y 轴旋转b。因此,我们知道该旋转的两组轴/角度信息。

幸运的是,从轴/角度到四元数的转换是已知的。给定一个角度?和轴向量 ?,得到的四元数是:

(cos(?/2), ?.x*sin(?/2), ?.y*sin(?/2), ?.z*sin(?/2))
Run Code Online (Sandbox Code Playgroud)

所以第一次旋转表示为沿世界 (0, 0, 1) 轴旋转一个度,给我们:

q1 = (cos(a/2), 0, 0, sin(a/2))
Run Code Online (Sandbox Code Playgroud)

第二个旋转由沿变换/局部 (0, 1, 0) 轴旋转b度表示,给我们:

q2 = (cos(b/2), 0, sin(b/2), 0)
Run Code Online (Sandbox Code Playgroud)

我们可以将这两个四元数相乘,得到一个四元数,表示从 (0, 0) 到 ( a , b ) 的复合旋转。四元数乘法的公式有点长,但你可以在这里找到它。结果:

q2*q1 = (cos(a/2)cos(b/2), -sin(a/2)sin(b/2), cos(a/2)sin(b/2), sin(a/2)cos(b/2))
Run Code Online (Sandbox Code Playgroud)

并不是说它有多大意义,但是我们可以确认这个公式与之前提到的 numpy 实现相同。

JCooper 提到了一个重要的观点,即在本例中沿 X 轴仍保留一个自由度。如果 ?保持在±90度以内,我们可以想象Z轴总是向上。这具有约束 X 轴旋转的效果,并且希望是您想要的。

希望这可以帮助!


编辑:请注意,这与使用 2 个欧拉角基本相同。因此,要反转这种转换,您可以使用任何四元数到欧拉角的转换,前提是旋转顺序相同。


jon*_*tar 1

也许你可以看看 boost C++ 库是如何实现它的。(或者甚至可能使用它)http://www.boost.org/doc/libs/1_46_0/libs/math/doc/quaternion/html/boost_quaternions/quaternions/create.html

经度和纬度与球坐标中的方位角 (theta - [0, 2*PI]) 和倾角 (rho? [0,PI]) 非常相似(当然对于表面,半径 r=1)。在我发布的链接中,Boost 有一个用于球形到四元数的函数。