4

我试图在我的项目中实现与 Maya 相同的旋转效果。我对四元数和轨迹球示例有一些了解。

不幸的是,我仍然无法理解使用四元数来获得预期效果的概念。

基本上,我仍然遇到与 3d 轨迹球相同的问题。将对象倒置后,然后尝试向右旋转,对象将向左旋转。好吧,实际上它是我的相机以相反的方向围绕焦点旋转。

问题是我正在使用屏幕坐标和轨迹球来获取旧/新向量并从这两个向量中获取旋转角度。这样我总是会得到错误的旋转轴。

我应该如何解决这个问题?

4

2 回答 2

2

我不了解 Maya,所以我只能猜测它的旋转是这样的:如果你左右旋转,感觉很自然。然后如果你把物体上下旋转180度,然后再左右旋转,感觉还是很自然的。

如果您熟悉使用矩阵进行变换(如旋转、缩放和平移)的概念,那么四元数只是相同的概念,但它只允许旋转,因此您可能希望使用它来将变换限制为旋转。在实践中,您可以使用矩阵或四元数来做同样的事情。

您需要做的是记住对象的当前四元数状态,然后当下一帧旋转发生时,将旋转与四元数(按此顺序)相乘,得到下一帧的四元数。这将确保无论对象处于什么方向,下一帧的旋转都将从观察者的角度应用。这与一些简单的旋转相反,您只是说“用户正在向上/向下滚动,因此改变对象的 X 轴旋转”,这会导致翻转。

请记住,与矩阵一样,四元数需要以与实际应用操作相反的顺序相乘,这就是为什么我说将新操作乘以现有四元数的原因。

以一个例子结束。假设用户将执行 2 个操作:

  • 在第 1 帧上,用户将对象围绕 X 轴旋转 180 度(上/下旋转)。
  • 在第 2 帧上,用户将对象绕 Y 轴旋转 90 度(左/右旋转)。

假设对象有一个四元数 Q。每一帧,您都将对象重置为其默认坐标并应用四元数 Q 来旋转它。现在您可以使用身份四元数对其进行初始化,但我们只说初始四元数称为 Q0。

  • 在第 1 帧上,创建一个新的四元数 R1,它是一个“围绕 X 轴旋转 180 度”的四元数(您可以找到一些数学来计算这样的四元数)。将新运算与现有四元数预乘:Q1 = R1 * Q0。
  • 在第 2 帧上,创建一个新的四元数 R2,它是一个“绕 Y 轴旋转 90 度”的四元数。将新操作与现有四元数预乘:Q2 = R2 * Q1。

在第 1 帧,您将使用 Q1 显示对象,在第 2 帧,您将使用 Q2。您可以简单地继续对四元数应用任何后续用户操作,并且它将始终在查看器的参考框架中旋转。

于 2010-12-06T08:34:23.070 回答
1

我认为您在更改坐标系时遇到问题。

假设您想先在 X 轴上旋转对象,然后在 Y 轴上旋转,然后移动并缩放。因此,您应该将变换 maxtrix(一开始它等于实体矩阵)乘以旋转矩阵(首先到 X,然后到 Y),然后乘以平移矩阵,最后乘以缩放矩阵。因此,当您当前的矩阵乘以结果矩阵时,您的坐标系会发生变化。

为避免此问题,您可以使用 2 种方法:

1)将您的结果矩阵累积为所有先前矩阵的乘积。

2)使用堆栈,其中顶部将是矩阵,它等于该矩阵底部(堆栈中)的所有矩阵的乘积。

PS我不确定,它对你有帮助。我从来没有在我的项目中使用过四元数。

于 2010-12-06T08:56:52.527 回答