我可以在四元数中切换 X Y Z 吗?

Posted

技术标签:

【中文标题】我可以在四元数中切换 X Y Z 吗?【英文标题】:Can i switch X Y Z in a quaternion? 【发布时间】:2013-04-12 13:45:01 【问题描述】:

我有一个 Y 轴向上的坐标系。我需要将其转换为 Z 为 UP 的坐标系。我将旋转存储在四元数中,所以我的问题是:如果我有一个四元数 X、Y、Z,我可以用 Z 切换 Y 并得到 Z 实际上是 UP 的结果吗?

【问题讨论】:

【参考方案1】:

只是在四元数中交换两个轴?不,这不起作用,因为这会翻转手性。然而,如果你翻转手性并否定四元数的实部,那么你就会回到原来的手性。一般来说,你可以这样写

Q'(Q, i'j'k') = εi'j'k' Qw_w + Qi _i + Qj_j + Qk_k

在哪里

是完全反对称张量,称为 Levi-Cevita 符号。

这不足为奇,因为四元数的 i²、j²、k² 规则也由相同的完全反对称张量定义。

【讨论】:

所以,这告诉我的是 new.w = old.w ;新的.x = -old.x;新的.y=-旧的.z;新的.z=新的.y; ?假设 NEW = Z UP, X RIGHT, Y 朝向屏幕,OLD = Y UP, X RIGHT, Z 朝向我? 这是否也适用于四元数的 W 值? 嗯,其实我得考虑一下。 W“包含”旋转角度,所以从技术上讲(如果我没记错的话)你应该否定 only W 并保持其他元素的符号不变。 @CaptainGouLash:坦率地说,到目前为止,我从未在实践中切换过四元数的手性。我绝对知道这是一个完全反对称的操作,你可以通过使用 Levi-Cevita 符号来做到这一点。 否定四元数的所有 4 个分量对旋转没有影响。如果您想通过否定事物来翻转手性,则需要采用共轭,它仅否定 i/j/k 部分(或者,等效地,仅否定实部......)。【参考方案2】:

我正在修改this post 的答案,因为这里的答案较旧,可能更通用。

最好在将角度和轴转换为四元数的背景下考虑这一点。在Wikipedia 中,您可以阅读到您使用单位方向矢量 (x,y,z) 描述围绕轴的角度 θ 的旋转

q = cos(θ/2) + sin(θ/2)(xi + yj + zk)

您的帖子只告诉我们 Y ↦ Z,即旧的 Y 方向是新的 Z 方向。其他方向呢?你可能想保留 X ↦ X,但这仍然给我们留下了两个选择。

    要么使用 Z ↦ Y。在这种情况下,您可以在左手坐标系和右手坐标系之间进行转换,并且转换本质上是一种反射。 或者您使用 Z ↦ -Y,那么它只是围绕 X 轴旋转 90°。坐标系的手性保持不变。

手性变化

首先考虑第一种情况。更改坐标系对您的角度和轴有什么影响?好吧,轴坐标与您的点经历相同的坐标交换,并且角度改变了它的符号。所以你有

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° 所以你在四元数中得到平方根,表示坐标系的变化。

【讨论】:

【参考方案3】:

尝试: 四元数旋转 = new Quaternion(X,Z,Y, -W); //由于

,我不得不交换 Z 和 Y

【讨论】:

【参考方案4】:

不,您不能交换 y 和 z - 如果它是右手坐标系,它将变成左手坐标系(反之亦然)。

但是,您可以进行以下替换:

newX = oldZ
newY = oldX
newZ = oldY

我怀疑您真正想要的是围绕 x 轴的简单旋转。如果这就是您想要切换 y 和 z 的原因,那么您应该围绕 +x 轴应用 -90 度的旋转(假设您有右手坐标系)。

【讨论】:

好吧,如果根据 Levi-Cevita 张量缩放四元数,从技术上讲,您可以交换 Y 和 Z 或进行任何其他完全反对称的排列。 不知道置换张量。谢谢!

以上是关于我可以在四元数中切换 X Y Z 吗?的主要内容,如果未能解决你的问题,请参考以下文章

在四元数旋转上应用镜像效果的有效方法?

如何将欧拉角转换为四元数并从四元数中得到相同的欧拉角?

从四元数中提取偏航

什么是四元数旋转?

如何理解glm中四元数与向量相乘函数的写法

ros Python 四元数转欧拉角