GLFW-带有OpenGL相机的Mac OS X 10.7上的glfwSetMousePos错误

问题描述 投票:3回答:4

我一直在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或其他错误吗?

c++ macos opengl opengl-3 glfw
4个回答
2
投票
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 );


0
投票
为了禁用游标,从而将其捕获到窗口中,我在创建窗口后添加了它。

glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);

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

现在,鼠标移动有效。但是,当从某个角度查看立方体时,似乎在左右移动鼠标时旋转了视图,而从其他角度来看,视图则按其应在左右方向移动。奇怪。

0
投票
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);

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

double xpos_old, ypos_old;

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

// 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上效果很好!干杯!


0
投票

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

所以您应该调用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); // ... }

© www.soinside.com 2019 - 2024. All rights reserved.