Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Opengl使用鼠标旋转对象(C+;+;)_C++_Opengl_Rotation_Mouse_Glut - Fatal编程技术网

C++ Opengl使用鼠标旋转对象(C+;+;)

C++ Opengl使用鼠标旋转对象(C+;+;),c++,opengl,rotation,mouse,glut,C++,Opengl,Rotation,Mouse,Glut,我想在Opengl中使用鼠标旋转一个对象(我使用glut)。我跟踪鼠标的移动,并根据鼠标x和y的变化进行旋转。但问题是物体不能按我所希望的方式移动。例如,当我在x中移动,然后在y中移动,然后再次在x中移动时,对象似乎是对角移动的,而我希望它从左向右移动。我知道这是因为较新的旋转在较旧的旋转之前完成(导致非直观的旋转),因为矩阵乘法是如何工作的 但我不知道如何解决这个问题。我想到的一种方法是根据当前的旋转来改变我旋转的轴,但我不知道这是否会产生正确的结果。我想到的另一件事是确保最新的旋转最后完成(

我想在Opengl中使用鼠标旋转一个对象(我使用glut)。我跟踪鼠标的移动,并根据鼠标x和y的变化进行旋转。但问题是物体不能按我所希望的方式移动。例如,当我在x中移动,然后在y中移动,然后再次在x中移动时,对象似乎是对角移动的,而我希望它从左向右移动。我知道这是因为较新的旋转在较旧的旋转之前完成(导致非直观的旋转),因为矩阵乘法是如何工作的

但我不知道如何解决这个问题。我想到的一种方法是根据当前的旋转来改变我旋转的轴,但我不知道这是否会产生正确的结果。我想到的另一件事是确保最新的旋转最后完成(但在glulookat转换场景之前),但我不知道如何做到这一点。
那么,解决这个问题的最佳方法是什么呢?

您可以采取两种主要方法

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

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


  • 我们不知道你的代码的行为是什么,你认为什么行为是正确的。您需要添加代码,并准确地告诉我们它正在做什么以及您希望它做什么。很难确切地知道您想要什么,但您似乎在追求某种类型的“arcball”实现。Ken Shoemake的原始论文是,但您应该能够找到在线的实现和描述。另外,您需要一个描述当前旋转状态的四元数,并且在设置动画时,一个临时四元数与当前值相乘,直到您“释放”鼠标,以防止出现迟滞现象。抱歉,如果不是100%清楚我的意思。我在谷歌上搜索了“arcball”,不知怎的,这就是我想要的,但我想没有那么严格。我只想根据鼠标的移动来旋转,如果我真的在点击这个对象,这是无关紧要的。如果我按下鼠标键,然后从左向右移动,我希望对象围绕y轴旋转。谢谢你的建议。我想我已经在用你的第二种方法了。但是因为我是沿着-z轴看的,所以叉积就是x轴(我绕着x轴旋转)。我的问题是,当我旋转它时,它与当前矩阵相乘,它在旋转之前应用(如果有意义的话)。因此,当我想通过向左移动鼠标来向左旋转时,对象可能会以对角线方向移动。