【问题标题】:Rotate 3D Euler point using Quaternions to avoid gimbal lock使用四元数旋转 3D 欧拉点以避免万向节锁定
【发布时间】:2011-06-13 00:34:27
【问题描述】:

首先,我已经做了很多谷歌搜索并检查了有关此问题的其他 stackoverflow 帖子,但无法获得有效的回复或有效代码的 sn-p。数学不是我的强项。

我需要一个例程来获取一个相机点 (CX,CY,CZ) 并将其围绕一个观察点 (LX,LY,LZ) 旋转三个旋转角度 (RX,RY,RZ)。在某些我需要避免的情况下,使用欧拉旋转会导致万向节锁定。所以我听说了使用四元数。

我发现这可以将旋转转换为四元数 http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToQuaternion/index.htm

这可以从四元数转换回欧拉 XYZ 旋转 http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/index.htm

它们似乎工作正常,但我需要知道如何使用四元数将 CX、CY、CZ 围绕 LX、LY、LZ 旋转,然后返回新的 CX、CY、CZ 而不会出现万向节锁定问题。

关于这方面的内容太多了,我相信一个好的解释和 sn-p 的代码不仅会帮助我,而且会在未来帮助许多其他人。

所以,如果可以的话,请提供帮助。非常感谢。

【问题讨论】:

    标签: quaternions euler-angles


    【解决方案1】:

    简短的回答,如果你的四元数是 Q 并且新的相机点是 C'

    C' = Q*(C-L)*Q^-1 + L
    

    其中点用 Cw=0 增加,乘法和逆运算根据四元数规则。

    具体来说,让 D = C - L。然后我们让F = Q*D

    Fw = Qw*0  - Qx*Dx - Qy*Dy - Qz*Dz
    Fx = Qw*Dx + Qx*0  + Qy*Dz - Qz*Dy
    Fy = Qw*Dy - Qx*Dz + Qy*0  + Qz*Dx
    Fz = Qw*Dz + Qx*Dy - Qy*Dx + Qz*0
    

    最后,我们得到C' = F*Q^-1 + L

    Cw' = 0
    Cx' = Fw*Qx - Fx*Qw + Fy*Qz - Fz*Qy + Lx
    Cy' = Fw*Qy - Fx*Qz - Fy*Qw + Fz*Qx + Ly
    Cz' = Fw*Qz + Fx*Qy - Fy*Qx - Fz*Qw + Lz
    

    但是,请注意,如果您从 Euler 表示创建四元数,您仍然会得到万向节锁定。万向节锁是欧拉表示的一个属性,四元数将只表示相同的变换。要摆脱万向节锁定,您需要完全避免使用欧拉表示,除非我误解了您的使用方式。

    【讨论】:

    • 感谢您的提示。因此,如果将欧拉转换为四元数仍然会导致万向节锁定,那么我怎样才能在 3D 空间中获取相机位置并在没有任何问题的情况下旋转它?如果我有 XYZ 相机位置和旋转角度?我假设我没有看到完整的图片,但是应该有一种简单的方法来获取相机位置并同时围绕所有 3 个轴旋转而无需万向节锁定?还是太天真了?
    猜你喜欢
    • 2017-05-22
    • 2015-04-30
    • 1970-01-01
    • 2011-07-12
    • 2014-06-14
    • 1970-01-01
    • 2013-06-07
    • 2018-08-25
    • 1970-01-01
    相关资源
    最近更新 更多