【问题标题】:Opengl rotate an object using the mouse (C++)Opengl使用鼠标旋转对象(C++)
【发布时间】: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


【解决方案1】:

您可以采取两种主要方法。

  • 通过将鼠标坐标投影到球体上来使用四元数(轨迹球方法)。将球体设为窗口大小,这样您就不必担心单击对象。

  • 围绕 y 旋转以进行水平鼠标移动。然后,对于垂直鼠标移动,围绕视图向量和 y 的叉积旋转(如果叉积为零,请小心)。这是 Maya 和其他人用来定位编辑视图的方法。

【讨论】:

  • 感谢您的建议。我想我已经在使用你的第二种方法了。但是由于我直视 -z 轴,因此叉积是 x 轴(我正在旋转)。我遇到的问题是当我旋转它时,它乘以它在旋转之前应用的当前矩阵(如果这有意义的话)。因此,当我想通过将鼠标向左移动来向左旋转时,对象可能会沿对角线移动。
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
相关资源
最近更新 更多