5

我一直在关注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

4 回答 4

4

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

glfwSetMousePos(1024/2, 768/2);

显然,在带有 MacOS 的 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 );
于 2013-09-11T10:05:09.910 回答
3

正如GLFW3 的文档中提到的那样:

“窗口必须有输入焦点。”</p>

所以你应该打电话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);

       // ...
    }
于 2020-03-16T08:41:14.400 回答
1

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

为了禁用光标并因此将其捕获在窗口中,我在创建窗口后添加了它。

glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);

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

现在鼠标移动起作用了。但是,似乎从某个角度查看立方体时,左右移动鼠标时视图会旋转,而从其他角度来看,视图会左右移动。奇怪的。

于 2014-05-17T20:02:57.803 回答
1

对于 OSX 上的 GLFW2,在 glfwCreateWindow( ...,...,) 之后的 tutorial-XX.cpp 中添加这一行

glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);

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

double xpos_old, ypos_old;

最后注释掉 glfwSetCursorPos(window, 1024/2, 768/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 上效果很好!干杯!

于 2014-05-23T10:39:57.417 回答