GLFW - 使用OpenGL摄像头的Mac OS X 10.7上的glfwSetMousePos Bug

时间:2013-01-22 21:09:39

标签: c++ macos opengl opengl-3 glfw

我一直关注http://opengl-tutorials.org的教程,到目前为止他们都非常出色(我在Mac上,所以我不得不使用OpenGL 3.2和GLSL 1.50而不是OpenGL 3.3和GLSL 3.30)。到目前为止教程中唯一的问题是,使用3D相机教程(教程6:键盘和鼠标),当我移动鼠标时,我没有得到任何旋转,如果我这样做,它只会慢慢在向下的方向;即使我向任何方向移动鼠标。

我已经编译了给定的代码(OpenGL 2.1和3.x)以及手工编写,这仍然存在这个错误。我不知道为什么会这样。这可能是GLFW,Mac OS X或其他什么的错误吗?

4 个答案:

答案 0 :(得分:3)

GLFW3’s doc所述:

“窗口必须具有输入焦点。”

因此,您应该调用glfwSetCursorPos直到窗口具有输入焦点为止!在MacOS的GLFW中这不是错误!

代码应为:


    bool firstMouse = true;

    float centerX = (float)mWidth / 2, centerY = (float)mHeight / 2;

    GLFWwindow* mWindow;

    void mouse_callback(GLFWwindow *window, double xPos, double yPos) {
      if (firstMouse) {
        // why here?
        // As
        // https://www.glfw.org/docs/3.3/group__input.html#ga04b03af936d906ca123c8f4ee08b39e7
        // mention :
        // "The window must have input focus."
        glfwSetCursorPos(mWindow, centerX, centerY);
        firstMouse = false;
      }

      // ...
    }

    void main() {
       // ...

       glfwSetCursorPosCallback(mWindow, mouse_callback);

       // ...
    }

答案 1 :(得分:2)

我知道这是一个很老的问题,但我遇到了同样的问题,所以它可能会有所帮助。我已经从网站上下载了代码并且在common / controls.cpp中这行评论了:

glfwSetMousePos(1024/2, 768/2);

显然,MacF的GLFW中存在一个错误,该指令无法正常运行。希望他们在新版本中修复它,但我还没有测试过它。

在旁注中,注释这一行将使教程工作,但是在夹紧垂直摄像机角度时可能会遇到一些问题:如果您将鼠标移动到夹紧点(例如向上),鼠标位置将保持不变更新,当您向下移动鼠标时,您必须等到摄像机再次移动之前到达夹紧点。

[编辑]这是完整修改后的代码

// Reset mouse position for next frame
// EDIT : Doesn't work on Mac OS, hence the code below is a bit different from the website's
//glfwSetMousePos(1024/2, 768/2);

// Compute new orientation
horizontalAngle = 3.14f + mouseSpeed * float( 1024/2 - xpos );
verticalAngle   = mouseSpeed * float( 768/2 - ypos );

答案 2 :(得分:0)

OS X 10.9上的GLFW 3仍然存在同样的问题。

要禁用光标并将其捕获到窗口内,我在创建窗口后添加了它。

glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);

然后我在controls.cpp中注释掉//glfwSetCursorPos(window, 1024 / 2, 768 / 2);

现在鼠标移动有效。但是,从某个角度观察立方体时,似乎在向左和向右移动鼠标时旋转视图,而从其他角度看,视图左右移动。奇怪。

答案 3 :(得分:0)

对于OSX上的GLFW2,在glfwCreateWindow(...,...,)之后的教程-XX.cpp中添加此行

glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);

然后在common / controls.cpp中创建两个全局变量

double xpos_old, ypos_old;

最后注释掉glfwSetCursorPos(窗口,1024 / 2,368 / 2);并将角度的计算更改为新设置,其目的是获得旧鼠标和新鼠标之间的差异。最终代码应如下所示:

// Reset mouse position for next frame
// glfwSetCursorPos(window, 1024/2, 768/2);
// Compute new orientation

horizontalAngle += mouseSpeed * float( xpos_old - xpos );
verticalAngle   += mouseSpeed * float( ypos_old - ypos );
xpos_old = xpos;
ypos_old = epos;

这在我的Mac上运行得很好!干杯!