如何让玛雅像轮换?

时间:2010-12-06 08:11:44

标签: c++ opengl graphics rotation quaternions

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

不幸的是,我仍无法围绕使用四元数来获得理想效果的概念。

基本上我仍然遇到了之前使用3D轨迹球的问题。将对象翻转过来然后尝试向右旋转后,对象将向左旋转。实际上我的相机在相反方向围绕焦点旋转。

问题在于我正在使用屏幕坐标&轨迹球获取旧/新向量并从这两个向量获得旋转角度。我将总是以这种方式得到错误的旋转轴。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

我不知道玛雅所以我只能猜测它的旋转是这样的:如果你左右旋转,感觉很自然。然后,如果您将对象向上旋转180度,然后再次左右旋转,它仍然感觉自然。

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

您需要做的是记住对象的当前四元数状态,然后在下一个旋转帧发生时,将 new 旋转与四元数相乘(按顺序)给你下一帧的四元数。这将确保无论物体处于什么方向,下一帧的旋转将从观察者的视点应用。这与一些天真的旋转相反,你只是说“用户向上/向下滚动,因此改变对象的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。您可以继续将任何后续用户操作应用于四元数,并始终在查看器的参考框架中旋转。

答案 1 :(得分:1)

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

假设您要在X轴中旋转对象,然后在Y轴中旋转,然后移动它并缩放。因此,您应该将变换maxtrix(在开始时它等于itentity矩阵)乘以旋转矩阵(首先是X,然后是Y),然后是转换矩阵,最后是缩放矩阵。因此,当您的当前矩阵与所得矩阵相乘时,您的坐标系会发生变化。

要避免此问题,您可以使用以下两种方法:

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

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

P.S。我不确定,它对你有所帮助。我从未在项目中使用过四元数。