【发布时间】:2015-01-23 17:50:25
【问题描述】:
我有一个对象,我想在 Opengl 中使用鼠标旋转(我正在使用 glut)。我正在跟踪鼠标的移动,并根据鼠标 x 和 y 的变化进行旋转。但问题是对象并没有按照我想要的方式移动。例如,当我向 x 移动,然后向 y 移动,然后再次向 x 移动时,对象似乎沿对角线移动,而我希望它从左向右移动。我知道这是因为由于矩阵乘法的工作原理,较新的旋转在较旧的旋转之前完成(导致不直观的旋转)。
但我不知道如何解决这个问题。我想到的一种方法是根据当前旋转更改我旋转的轴,但我不知道这是否会产生正确的结果。我想到的另一件事是确保最后完成最新的旋转(但在 glulookat 转换场景之前),但我不知道该怎么做。 那么解决这个问题的最佳方法是什么?
【问题讨论】:
-
我们不知道您的代码的行为是什么以及您认为什么行为是正确的。您需要添加代码并准确告诉我们它在做什么以及您希望它做什么。
-
很难确切地知道你想要什么,但似乎你正在追求某种类型的“arcball”实现。 Ken Shoemake 的原始论文是here,但是你应该可以在网上找到quaternions 的实现和描述。此外,您需要一个描述当前旋转状态的四元数,并且在制作动画时,一个临时四元数与当前相乘,直到您“释放”鼠标,以防止滞后。
-
对不起,如果不是 100% 清楚我的意思。我用谷歌搜索了“arcball”,不知何故这是我想要的,但我猜不那么严格。我只想根据鼠标移动进行旋转,我是否实际单击对象无关紧要。如果我按下鼠标按钮并从左到右移动,我希望对象围绕它的 y 轴旋转。
标签: c++ opengl rotation mouse glut