gpt4 book ai didi

c++ - GLFW 相机和鼠标控制

转载 作者:行者123 更新时间:2023-11-30 05:35:50 27 4
gpt4 key购买 nike

所以基本上是从页面上的教程学习 OpenGL 和 GLFW 库:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-6-keyboard-and-mouse/

我的问题是这个较少的类(class)展示了用鼠标控制相机移动。基本上它使应用程序获得像相机一样的“FPS”,禁用光标在每一帧的屏幕中心移动。但是当我们失去对 window 的焦点然后又重新聚焦时,相机就会变得疯狂。例如,如果我们单击窗口以从 View 中间重新获得焦点,相机将移动大量。我试图通过添加窗口焦点回调来解决这个问题:

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 解决这个问题吗?

最佳答案

问题有点老,但我最近遇到了类似的问题。所以只是分享,更多的解决方案存在。我使用 GLFW_CURSOR_DISABLED。在此模式下,当您收到“打开”焦点事件时,鼠标位置(尚未)不会更新,因此调用 GetCursorPos 会传递先前的值。新的光标位置在“打开”焦点事件之后到达 MouseMove 回调中。我通过跟踪重新获得焦点并使用此 int 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");
}
}

关于c++ - GLFW 相机和鼠标控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33761593/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com