OpenGL相机 - 使用SetCursorPos(x,y)时,移动相机而不会向后拍摄;?

时间:2012-05-07 20:31:06

标签: c++ opengl camera mousemove glulookat

我尝试更新相机时遇到问题。

我想通过鼠标改变相机的俯仰和偏航(它的外观) 但我希望鼠标保持定位在窗口的中心。

//where MouseP.x .y is the mouse position 
//(which is centered to the current window)

//get old position of the mouse
OldP.x = MouseP.x;
OldP.y = MouseP.y;

//work out the distance traveled
Delta.x = MouseP.x - OldP.x;
Delta.y = MouseP.y - OldP.y;

//update the camera(using  distance traveled)
Rot.Yaw -=Delta.x/5;
Rot.Pitch -= Delta.y/5;

//move mouse to the center of the screen
SetCursorPos(CENTER_SCREEN_X,CENTER_SCREEN_Y);

问题是当鼠标设置为返回原点时,相机会快速回到某一点。

我希望按原点行进的距离更新相机,而不是距离原点的距离。

如果我把它取出来,它可以很好地工作,但是当时的鼠标可以走出窗外。

3 个答案:

答案 0 :(得分:2)

人们必须小心光标和3D鼠标移动。人们倾向于认为它是相关的,但事实上并非如此。 阅读msdn上的文章: http://msdn.microsoft.com/en-us/library/windows/desktop/ee418864%28v=vs.85%29.aspx “利用高清鼠标移动” 这就是必须在3D应用程序中输入鼠标的方法。 应该隐藏光标。

如果你试图重新定位它,它会产生一种可怕的锯齿状感觉,光标试图通过用户移动鼠标逃离中心,但是被一个看不见的弹簧保持在原位。哪个看起来不太专业。你无法对抗,因为你的应用程序没有在鼠标光标显示之前安排。

答案 1 :(得分:1)

我认为这里的问题是你的代码块可能在WM_MOUSEMOVE事件的捕获范围内?

当您致电SetCursorPos时,它本身会生成另一个WM_MOUSEMOVE事件,因此您在移动鼠标时会处理此代码块,而在您调用SetCursorPos时会再次处理此代码块与此相反。

您可能不希望将SetCursorPos放在WM_MOUSEMOVE事件catch中,否则您将生成无限循环的消息(每SetCursorPos生成另一个消息)。

也许您可以将此代码移到消息泵之外,并在更新循环中每帧运行一次:查询当前鼠标位置,使相机变换,然后将光标设置回原点。

答案 2 :(得分:0)

if(g_States::Instance().MouseLook())
{
    //Test the mouse input
    POINT mousePos;
    GetCursorPos(&mousePos);

    mouseX = mousePos.x; //g_InputEngine::Instance().GetX();
    mouseY = mousePos.y; //g_InputEngine::Instance().GetY();

    mouseX = mouseX - m_HalfWidth;
    mouseY = mouseY - m_HalfHeight;

    mouseFloat = mouseX * C_MOUSESMOOTHINGFACTOR;
    g_Scene::Instance().GetCamera()->RotateYaw(-mouseFloat);

    mouseFloat = mouseY * C_MOUSESMOOTHINGFACTOR;
    g_Scene::Instance().GetCamera()->RotatePitch(mouseFloat);

    //Reset mouse to center on the screen
    SetCursorPos(m_HalfWidth,m_HalfHeight);
}

所以这是一个spacegame原型的Mouselook函数,我正在开发一段时间后,我所做的就是将它更改为使用GetCursorPos(&mousePos);代替。无论您的输入代码何时更新鼠标光标位置,都将获得光标的当前位置。该功能的其余部分仅用于灵敏度并实际旋转相机。希望这段代码有助于让你的工作有所帮助。

如果您需要更多解释,请告诉我。

编辑:我记得我这样做的原因。这是因为屏幕闪烁它会移动,但输入引擎会被SetCursorPos()调用更新,因为我使用WM_MOUSEMOVE来更新输入引擎。我不确定你是如何得到你的意见的,但这仍然可以帮到你。