0

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

但是,我现在正在处理一些涉及两个不同轴之间的大量连续动画的事情,我认为我正在看到gimbal lock的效果。当我执行其中一个链接动画时,我的对象在完成 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 度的旋转?

4

1 回答 1

0

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

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

在任何情况下,结果都不一样,因为你不会得到欧拉摆动。

* 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).
于 2013-05-26T12:28:06.290 回答