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