2011-03-25 198 views
5

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

最好!

回答

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具有球形到四元的功能。

+0

hi jon_darkstar,经度是phi,纬度是theta,但是rho是什么? – rick 2011-03-25 20:53:25

+0

它的phi呢?自从使用球坐标后,我忘记了它已经有一段时间了。我真的不知道第三个角度会做什么。 rho可能只是数量级,但为什么两个phis?我不能帮你指点你,祝你好运 – 2011-03-25 21:05:39

+0

我正在使用它将纬度/经度转换为直角坐标: '\t float phi = ofDeToToad(ll.lat + 90); \t float theta = ofDegToRad(ll.lon - 90); \t x = sin(phi)* cos(theta); \t y = sin(phi)* sin(theta); \t z = cos(phi);' 现在我需要一种方法将其转换为旋转而不是坐标。旋转可以是轴/角度或四元数。 – rick 2011-03-25 21:08:46

1

经度和纬度不足以描述四元数。经度和纬度可以描述三维球体表面的一个点。假设这是正常点直接通过屏幕的点。你还有一定的自由度。球体可以围绕由lat-lon指定的点的法线向量旋转。如果你想要一个代表球体方向的四元数,你需要完全指定旋转。

让我们假设你想保持球体的北极向上。如果北极与对象的轴线对齐,并且屏幕上的'向上'与全球的轴线对齐,然后您想要旋转球体以便点R在表面上在屏幕上直接指出球体(其中R如您在评论中提到的那样使用经纬度到欧几里德找到),那么您创建旋转矩阵如下。

你想对象的[R要对齐世界+ Z(假设一个OpenGL样视图坐标系),你想对象的+ Z与世界+ Y对齐(尽可能接近可能)。我们需要第三个轴;所以我们规范化R然后找到:P = crossP([0 0 1]^T,R)。我们规范化P然后强制第二轴的正交性:Q = crossP(R,P)。最后,标准化Q。现在我们有3个正交矢量P,Q,R,我们希望分别与世界的x,y,z一致。

我假设P,Q,R是列向量;所以要创建一个变换矩阵,我们只需将它们粘在一起:M = [P Q R]。现在M是将世界坐标中的一个点转换为对象坐标的矩阵。要走相反的方向,我们找到M的倒数。幸运的是,当一个矩阵的列是正交矩阵时,逆矩阵与转置矩阵是相同的。所以我们得到:

   [ P^T ] 
M^-1 = M^T = [ Q^T ] 
      [ R^T ] 

从这一点,如果你需要,你可以找到使用matrix to quaternion conversion四元数。然后,您可以使用斯莱普或您选择的方法在四元数之间进行插值。

0

还有一种方法可以不使用矩阵或向量,类似于this numpy implementation。我们可以把经度/纬度看作两个四元数的旋转组合在一起。

让我们使用Z-up右手坐标系。我们称之为经度φ和纬度θ,并将这两个点表示为(φ,θ)。对于可视化,红轴对应于X,绿色为Y,和蓝色Z.

我们希望找到代表从旋转的四元数(0,0),在红色,以(一个b),在绿色:

Sphere with origin and destination points

我们可以表示该旋转作为第一纵向旋转的组合,则该纬向旋转,像这样:

First rotation Second rotation

首先,我们通过旋转一个沿着Z轴,其将在X和Y轴。然后,沿着新的局部Y轴旋转b。因此,我们知道这个旋转的两组轴/角度信息。

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

(cos(α/2), ω.x*sin(α/2), ω.y*sin(α/2), ω.z*sin(α/2)) 

所以第一旋转通过的一个度沿(0,0,1)轴的旋转来表示,给我们:

q1 = (cos(a/2), 0, 0, sin(a/2)) 

第二旋转通过的b沿着变换(0,1,0)轴度的旋转表示的,使我们:

q2 = (cos(b/2), 0, sin(b/2), 0) 

我们可以繁殖这些两个四元给我们表示从该化合物旋转的单个四元数(0,0)到(一个b)。四元数乘法的公式有点冗长,但你可以找到它here。结果如下:

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)) 

不是说它意味着多少,但我们可以确认这个公式与前面提到的numpy实现相同。

JCooper提到了一个很好的观点,即在这种情况下沿X轴还有一个自由度。如果θ保持在±90度以内,我们可以想象Z轴总是向上。这具有约束X轴旋转的效果,并且希望你想要的。

希望这会有所帮助!


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