我意识到这个问题之前在stackoverflow上有问题,但我还没有找到一个我完全理解的答案,所以我想我会得到一些特定于我的情况的帮助。如何在OpenGL中使用鼠标在相机中移动?
我基本上想要能够使用鼠标围绕Y轴旋转。以下是我用于实际旋转的功能(角度以度为单位)。
void CCamera::RotateY (GLfloat Angle)
{
RotatedY += Angle;
//Rotate viewdir around the up vector:
ViewDir = Normalize3dVector(ViewDir*cos(Angle*PIdiv180)
- RightVector*sin(Angle*PIdiv180));
//now compute the new RightVector (by cross product)
RightVector = CrossProduct(&ViewDir, &UpVector);
}
由于我使用GLUT,我使用被动函数来获取光标的x,y坐标。然后在我的显示我有以下几点:
void display(void) {
...
mouseDisplacement = mouseX - oldMouseX;
if (mouseDisplacement > 0) Camera.RotateY(-1.0*abs(mouseDisplacement));
else if (mouseDisplacement < 0) Camera.RotateY(1.0*abs(mouseDisplacement));
oldMouseX = mouseX;
glutWarpPointer(centerWindowX, centerWindowY); // move the cursor to center of window
...
}
现在的问题是很明显的,因为显示功能运行60次第二,鼠标光标正好卡在中间,每当我尝试将其移动。如果我没有显示功能循环,旋转真的是滞后和东西。那么做这件事的正确方法是什么?
再次注意,我只是希望让相机使用鼠标左右移动。虽然如果我能够像正常的fps一样工作,它会非常棒,但它并不是真正必要的。
任何帮助,非常感谢。
我的坏没有说清楚。我已经在使用glutPassiveMotionFunc(...)来更新全局变量'mouseX'。问题出现在我想在相机周围移动时,鼠标居中在窗口中。 – Bazinga
好的。我相信问题来自您的三角洲计算。您应该计算当前光标位置和窗口中心之间的差异(光标将在每帧之后设置)。 –
感谢您花时间帮助我。我也尝试了你上面说的,通过对中心坐标进行位移。但是,由于我将光标更新为保持在中间,所以位移总是为0或非常接近于0.因此,不应该像移动摄像机那样移动摄像机。 – Bazinga