GLFW相机和鼠标控制

时间:2015-11-17 16:05:13

标签: c++ camera glfw

所以基本上我正在学习OpenGL和GLFW库来自页面上的教程:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-6-keyboard-and-mouse/

我的问题是这个较少的课程显示了使用鼠标控制相机移动。 Basicaly它使应用程序像摄像机一样获得“FPS”,禁用光标在每个帧的屏幕中心移动。但是当我们失去对窗户的注意力然后它重新获得时,相机会变得疯狂。例如,如果我们点击窗口以从视图中间重新获得焦点,则相机将被大量移动。我试图通过添加窗口焦点回调来解决这个问题:

void window_focus_callback(GLFWwindow* window, int focused){
if (focused)
{
    //center mouse on screen
    int width, height;
    glfwGetWindowSize(window, &width, &height);
    glfwSetCursorPos(window, 1024 / 2, 768 / 2);
    windowFocused = true;
}
else
{
    windowFocused = false;
}

在主应用程序循环中:

if(windowFocused) computeMatricesFromInputs();

但由于某种原因,这个解决方案无效。 有没有办法使用glfw解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题有点陈旧,但我最近遇到了类似的问题。所以只是分享,存在更多解决方案。 我使用GLFW_CURSOR_DISABLED。在此模式下,当您收到' on'时,鼠标位置尚未更新。焦点事件,因此调用GetCursorPos提供以前的值。新的光标位置在“鼠标移动”回调之后到达'焦点事件。 我通过跟踪重新获得焦点来解决它,并使用此OnMouseMove回调来调度MouseInit(捕捉光标)或常规MouseMove。

通过这种方式,我可以ALT + TAB从我的窗口中退出,然后将光标返回到其他地方,而不会出现相机的恶劣跳跃/旋转。

void InputManagerGLFW::Callback_OnMouseMove(
            GLFWwindow* window,
            double      xpos,               //
            double      ypos)               //
{
    if (!mFocusRegained)
    {
        mMouseBuffer.Move(xpos, ypos);
    }
    else
    {
        mFocusRegained = false;
        mMouseBuffer.Init(xpos, ypos);
    }
}

void InputManagerGLFW::Callback_OnFocus(
            GLFWwindow* window,
            int         focused)
{
    if (focused)
    {
        // The window gained input focus
        // Note: the mouse position is not yet updated
        //       the new position is provided by the mousemove callback AFTER this callback
        Log::Info("focus");

        // use flag to indicate the OnMouseMove that we just regained focus,
        // so the first mouse move must be handled differently
        mFocusRegained = true;

        // this will NOT work!!!
        // double x,y;
        // glfwGetCursorPos(window,&x,&y);
        // mMouseBuffer.Init(x,y);
    }
    else
    {
        // The window lost input focus
        Log::Info("focus lost");
    }
}