GLFW 相机和鼠标控制

Posted

技术标签:

【中文标题】GLFW 相机和鼠标控制【英文标题】:GLFW camera and mouse control 【发布时间】:2015-11-17 16:05:12 【问题描述】:

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

我的问题是这个较少的课程显示了用鼠标控制相机移动。 基本上它使应用程序获得像相机一样的“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】:

问题有点老了,但我最近遇到了类似的问题。所以只是分享,还有更多的解决方案。 我使用 GLFW_CURSOR_DISABLED。在此模式下,当您收到“on”焦点事件时鼠标位置(尚未)更新,因此对 GetCursorPos 的调用会提供先前的值。新的光标位置在“on”焦点事件之后到达 MouseMove 回调。 我通过跟踪焦点的重新获得来解决它,并在 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");
    

【讨论】:

以上是关于GLFW 相机和鼠标控制的主要内容,如果未能解决你的问题,请参考以下文章

Unity C#:使用自动定位和鼠标外观的相机控制

如果在加载场景时移动鼠标光标不会消失 - OpenGL 和 GLFW

鼠标离开GLFWwindow后触发GLFW鼠标回调?

GLFW 鼠标事件延迟与窗口拖动

Three.js用相机选择对象,没有鼠标

鼠标在屏幕上的移动来控制相机水平,垂直旋转