我试图在我的项目中实现与 Maya 相同的旋转效果。我对四元数和轨迹球示例有一些了解。
不幸的是,我仍然无法理解使用四元数来获得预期效果的概念。
基本上,我仍然遇到与 3d 轨迹球相同的问题。将对象倒置后,然后尝试向右旋转,对象将向左旋转。好吧,实际上它是我的相机以相反的方向围绕焦点旋转。
问题是我正在使用屏幕坐标和轨迹球来获取旧/新向量并从这两个向量中获取旋转角度。这样我总是会得到错误的旋转轴。
我应该如何解决这个问题?
我试图在我的项目中实现与 Maya 相同的旋转效果。我对四元数和轨迹球示例有一些了解。
不幸的是,我仍然无法理解使用四元数来获得预期效果的概念。
基本上,我仍然遇到与 3d 轨迹球相同的问题。将对象倒置后,然后尝试向右旋转,对象将向左旋转。好吧,实际上它是我的相机以相反的方向围绕焦点旋转。
问题是我正在使用屏幕坐标和轨迹球来获取旧/新向量并从这两个向量中获取旋转角度。这样我总是会得到错误的旋转轴。
我应该如何解决这个问题?
我不了解 Maya,所以我只能猜测它的旋转是这样的:如果你左右旋转,感觉很自然。然后如果你把物体上下旋转180度,然后再左右旋转,感觉还是很自然的。
如果您熟悉使用矩阵进行变换(如旋转、缩放和平移)的概念,那么四元数只是相同的概念,但它只允许旋转,因此您可能希望使用它来将变换限制为旋转。在实践中,您可以使用矩阵或四元数来做同样的事情。
您需要做的是记住对象的当前四元数状态,然后当下一帧旋转发生时,将新旋转与旧四元数(按此顺序)相乘,得到下一帧的四元数。这将确保无论对象处于什么方向,下一帧的旋转都将从观察者的角度应用。这与一些简单的旋转相反,您只是说“用户正在向上/向下滚动,因此改变对象的 X 轴旋转”,这会导致翻转。
请记住,与矩阵一样,四元数需要以与实际应用操作相反的顺序相乘,这就是为什么我说将新操作乘以现有四元数的原因。
以一个例子结束。假设用户将执行 2 个操作:
假设对象有一个四元数 Q。每一帧,您都将对象重置为其默认坐标并应用四元数 Q 来旋转它。现在您可以使用身份四元数对其进行初始化,但我们只说初始四元数称为 Q0。
在第 1 帧,您将使用 Q1 显示对象,在第 2 帧,您将使用 Q2。您可以简单地继续对四元数应用任何后续用户操作,并且它将始终在查看器的参考框架中旋转。
我认为您在更改坐标系时遇到问题。
假设您想先在 X 轴上旋转对象,然后在 Y 轴上旋转,然后移动并缩放。因此,您应该将变换 maxtrix(一开始它等于实体矩阵)乘以旋转矩阵(首先到 X,然后到 Y),然后乘以平移矩阵,最后乘以缩放矩阵。因此,当您当前的矩阵乘以结果矩阵时,您的坐标系会发生变化。
为避免此问题,您可以使用 2 种方法:
1)将您的结果矩阵累积为所有先前矩阵的乘积。
2)使用堆栈,其中顶部将是矩阵,它等于该矩阵底部(堆栈中)的所有矩阵的乘积。
PS我不确定,它对你有帮助。我从来没有在我的项目中使用过四元数。