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 相机和鼠标控制的主要内容,如果未能解决你的问题,请参考以下文章