所以基本上我正在学习OpenGL和GLFW库来自页面上的教程:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-6-keyboard-and-mouse/
我的问题是这个较少的课程显示了使用鼠标控制相机移动。 Basicaly它使应用程序像摄像机一样获得“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解决这个问题?
答案 0 :(得分:1)
问题有点陈旧,但我最近遇到了类似的问题。所以只是分享,存在更多解决方案。 我使用GLFW_CURSOR_DISABLED。在此模式下,当您收到' on'时,鼠标位置尚未更新。焦点事件,因此调用GetCursorPos提供以前的值。新的光标位置在“鼠标移动”回调之后到达'焦点事件。 我通过跟踪重新获得焦点来解决它,并使用此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");
}
}