经度/四元数纬度

| 我有一个经度和纬度,想将其转换为四元数,并且想知道如何做到这一点?我想使用它,因为我有一个可以将地球投射到球体上的应用程序,而且我想从一个位置旋转到另一个位置。 最好!     
已邀请:
有一种无需使用矩阵或向量即可解决此问题的方法,类似于此numpy实现。我们可以将经度/纬度视为两个四元数旋转组合在一起。 让我们使用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))
因此,第一次旋转是通过围绕世界(0,0,1)轴旋转一个度表示的,从而得到:
q1 = (cos(a/2), 0, 0, sin(a/2))
第二次旋转由沿变换/局部(0,1,0)轴的b度旋转表示,这使我们:
q2 = (cos(b/2), 0, sin(b/2), 0)
我们可以将这两个四元数相乘,得到一个表示从(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))
这并不意味着什么,但是我们可以确认该公式与前面提到的numpy实现相同。 JCooper提到了一个重要观点,在这种情况下,沿X轴仍保留一个自由度。如果θ保持在±90度以内,我们可以想象Z轴始终指向上方。这具有约束X轴旋转的效果,希望是您想要的。 希望这可以帮助! 编辑:请注意,这与使用2个Euler角基本相同。因此,要反转此转换,可以使用任何四元数到欧拉角的转换,只要旋转顺序相同即可。     
也许您可以研究boost C ++库如何实现它。 (甚至可能使用它)http://www.boost.org/doc/libs/1_46_0/libs/math/doc/quaternion/html/boost_quaternions/quaternions/create.html 经度和纬度与球坐标系中的方位角(θ-[0,2 * PI])和倾斜角(rho [0,PI])非常相似(表面的半径r = 1)。 Boost在我发布的链接中具有从球形到四元数的功能。     
纬度和经度不足以描述四元数。纬度和经度可以描述3d球面的一个点。假设这是法线直接通过屏幕指向的点。您还剩下一个自由度。球体可以绕由lat-lon指定的点的法线向量旋转。如果要使用表示球体方向的四元数,则需要完全指定旋转。 因此,假设您要使球体的北极保持指向上方。如果北极与对象的+ z轴对齐,并且屏幕上的'up \'与世界的+ y轴对齐,那么您要旋转球体,以使球体的表面直接指向屏幕(如您在注释中提到的,使用latlon到Euclidean找到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是列向量;因此,要创建一个转换矩阵,我们只需将\'em放在一起:M = [P Q R]。现在M是将世界坐标中的点转换为对象坐标的矩阵。为了朝相反的方向,我们找到M的逆。幸运的是,当矩阵的列为正交时,该逆与转置相同。这样我们得到:
             [ P^T ]
M^-1 = M^T = [ Q^T ]
             [ R^T ]
由此,如果需要,您可以找到使用矩阵到四元数转换的四元数。然后,您可以使用slerp或您选择的方法在四元数之间进行插值。     

要回复问题请先登录注册