四元数可以表示超过360度的旋转吗?

时间:2013-05-20 07:44:22

标签: animation graphics 3d quaternions

我喜欢基于度数的欧拉旋转,因此我可以为大量度数的动画制作关键帧,例如1000,并在对象上获得多次完整的360度旋转,以便设置旋转等等。

然而,当我正在处理涉及两个不同轴之间的大量连续动画的事情时,我现在处于某一点,我认为我正在看到万向节锁的影响。当我执行其中一个链式动画时,我的对象在完成90度旋转后会保持翻转180度。这听起来像万向节锁吗?它只发生在沿不同轴的其他先前和成功旋转之后。

在任何情况下,我都尝试切换到四元数,但似乎四元数不适合这种旋转效果,因为它们只是为您提供方向,并且使用它将360的倍数视为0:

template <typename T>
 inline QuaternionT<T>  QuaternionT<T>::CreateFromAxisAngle(const Vector3<T>& axis, float radians)
 {
QuaternionT<T> q;
q.w = std::cos(radians / 2);
q.x = q.y = q.z = std::sin(radians / 2);
q.x *= axis.x;
q.y *= axis.y;
q.z *= axis.z;
return q;
}

是否可以通过四元数技术获得超过360度的旋转度?

1 个答案:

答案 0 :(得分:0)

你的情况听起来不像万向节锁。万向锁定是指您不能再向任何其他方向旋转,因为您的轴在彼此顶部对齐*。听起来更像是交叉产品会做的事情。无论如何你不应该有任何问题,因为你只有两个轴为你进行,所以只要你选择合适的旋转顺序,万向锁就没有任何问题。

quats工作的原因是它们统一表示旋转空间,并且该空间没有多余的值。你可以每180到90度键,quats可以正常工作。但是,它们不会像现在这样插入。事实上,你不能一次旋转多个轴,旋转时只有一个旋转,同时欧拉角可以一直保持转动二次旋转方向。实现此目的的一种方法是均匀地分割动画并使用quats进行插值,但使用eulers计算关键帧位置。另一种方法是在quat长度中编码旋转周期。

在任何情况下,结果都不会相同,因为你不会让euler摆动。

* you can visualize this by drawing rings at each axis orientation instead
  of your object and see how they move to overlap (like a gimbal hence the name).