【发布时间】:2013-04-12 13:45:01
【问题描述】:
我有一个 Y 轴向上的坐标系。我需要将其转换为 Z 为 UP 的坐标系。我将旋转存储在四元数中,所以我的问题是:如果我有一个四元数 X、Y、Z,我可以用 Z 切换 Y 并得到 Z 实际上是 UP 的结果吗?
【问题讨论】:
标签: matrix 3d rotation quaternions
我有一个 Y 轴向上的坐标系。我需要将其转换为 Z 为 UP 的坐标系。我将旋转存储在四元数中,所以我的问题是:如果我有一个四元数 X、Y、Z,我可以用 Z 切换 Y 并得到 Z 实际上是 UP 的结果吗?
【问题讨论】:
标签: matrix 3d rotation quaternions
只是在四元数中交换两个轴?不,这不起作用,因为这会翻转手性。然而,如果你翻转手性并否定四元数的实部,那么你就会回到原来的手性。一般来说,你可以这样写
Q'(Q, i'j'k') = εi'j'k' Qw_w + Qi _i + Qj_j + Qk_k
在哪里
是完全反对称张量,称为 Levi-Cevita 符号。
这不足为奇,因为四元数的 i²、j²、k² 规则也由相同的完全反对称张量定义。
【讨论】:
我正在修改this post 的答案,因为这里的答案较旧,可能更通用。
最好在将角度和轴转换为四元数的背景下考虑这一点。在Wikipedia 中,您可以阅读到您使用单位方向矢量 (x,y,z) 描述围绕轴的角度 θ 的旋转
q = cos(θ/2) + sin(θ/2)(xi + yj + zk)
您的帖子只告诉我们 Y ↦ Z,即旧的 Y 方向是新的 Z 方向。其他方向呢?你可能想保留 X ↦ X,但这仍然给我们留下了两个选择。
首先考虑第一种情况。更改坐标系对您的角度和轴有什么影响?好吧,轴坐标与您的点经历相同的坐标交换,并且角度改变了它的符号。所以你有
cos(−θ/2) + sin(−θ/2)(xi + zj + yk)
与上述相比,实部没有变化(因为 cos(x)=cos(−x))但是虚部改变了它们的符号,在除了顺序的变化。由此概括,在旧坐标系中描述旋转的四元数a + bi + cj + dk 将在新坐标系中转换为a − bi − dj − ck。或者进入−a + bi + dj + ck,这是对同一旋转的不同描述(因为它将 θ 改变了 360°,但 θ/2 改变了 180°)。
与此相比,Z ↦ -Y 的第二种情况保持 θ 的符号,所以你只需要调整轴。新的Z坐标是旧的Y坐标,新的Y坐标是否定的旧Z坐标。所以a + bi + cj + dk 被转换为a + bi − dj + ck(或它的负数)。请注意,这只是四元数乘以i 或−i,具体取决于您将其相乘的一侧。如果你想把它写成共轭,你有 θ=±45° 所以你在四元数中得到平方根,表示坐标系的变化。
【讨论】:
尝试: 四元数旋转 = new Quaternion(X,Z,Y, -W); //由于
,我不得不交换 Z 和 Y【讨论】:
不,您不能交换 y 和 z - 如果它是右手坐标系,它将变成左手坐标系(反之亦然)。
但是,您可以进行以下替换:
newX = oldZ
newY = oldX
newZ = oldY
我怀疑您真正想要的是围绕 x 轴的简单旋转。如果这就是您想要切换 y 和 z 的原因,那么您应该围绕 +x 轴应用 -90 度的旋转(假设您有右手坐标系)。
【讨论】: