我通常如何使用 glfw 在 Imgui 中处理鼠标事件?
How do I handle mouse events in general in Imgui with glfw?
我使用了glfw回调函数,用鼠标移动了相机。
鼠标回调函数为:
void mouse_callback(GLFWwindow *window, double xposIn, double yposIn)
{
if (is_pressed)
{
camera.ProcessMouseMovement((static_cast<float>(yposIn) - prev_mouse.y) / 3.6f, (static_cast<float>(xposIn) - prev_mouse.x) / 3.6f);
prev_mouse.x = xposIn;
prev_mouse.y = yposIn;
}
cur_mouse.x = xposIn;
cur_mouse.y = yposIn;
}
void mouse_btn_callback(GLFWwindow *window, int button, int action, int mods)
{
if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS)
{
prev_mouse.x = cur_mouse.x;
prev_mouse.y = cur_mouse.y;
is_pressed = true;
}
else
{
is_pressed = false;
}
}
但是,在这种情况下,即使在其他 imgui 中操作,相机也会移动 windows,如下所示。
我不知道怎么处理。
我是否应该使用 ImGui::IsWindowHovered()
之类的东西将此逻辑放在 IMGUI 的开始和结束之间?
像这样:
ImGui::Begin("scene");
{
if(ImGui::IsWindowHovered())
{
//camera setting
}
}
ImGui::End()
我对ImGui不熟悉,不知道ImGui中哪些函数需要调用,哪些不需要调用。
但是,GLFW 是一个相对较低级别的 windowing API,它不考虑 window 上可能存在的更高级别的抽象。当您将回调传递给 glfwSetCursorPosCallback
时,将在 window.
的任何可访问部分调用该回调
如果您需要让鼠标移动(或任何鼠标交互)仅在鼠标悬停在界面的相关部分上时响应,您需要某种机制来定义该部分是什么。再说一次:我不知道你在 ImGui 中是怎么做到的,但它可能看起来像这样:
void mouse_callback(GLFWwindow *window, double xposIn, double yposIn)
{
//Structured Binding; we expect these values to all be doubles.
auto [minX, maxX, minY, maxY] = //Perhaps an ImGui call to return the bounds of the openGL surface?
if(xposIn < minX || xposIn > maxX || yposIn < minY || yposIn > maxY) {
return; //We're outside the relevant bounds; do not do anything
}
//I'm assuming setting these values should only happen if the mouse is inside the bounds.
//Move it above the first if-statement if it should happen regardless.
cur_mouse.x = xposIn;
cur_mouse.y = yposIn;
if (is_pressed)
{
camera.ProcessMouseMovement((static_cast<float>(yposIn) - prev_mouse.y) / 3.6f, (static_cast<float>(xposIn) - prev_mouse.x) / 3.6f);
prev_mouse.x = xposIn;
prev_mouse.y = yposIn;
}
}
以上回答错误。
这在 Dear ImGui FAQ 中得到了回答:
https://github.com/ocornut/imgui/blob/master/docs/FAQ.md#q-how-can-i-tell-whether-to-dispatch-mousekeyboard-to-dear-imgui-or-my-application
TL;DR 检查鼠标的 io.WantCaptureMouse 标志。
我使用了glfw回调函数,用鼠标移动了相机。
鼠标回调函数为:
void mouse_callback(GLFWwindow *window, double xposIn, double yposIn)
{
if (is_pressed)
{
camera.ProcessMouseMovement((static_cast<float>(yposIn) - prev_mouse.y) / 3.6f, (static_cast<float>(xposIn) - prev_mouse.x) / 3.6f);
prev_mouse.x = xposIn;
prev_mouse.y = yposIn;
}
cur_mouse.x = xposIn;
cur_mouse.y = yposIn;
}
void mouse_btn_callback(GLFWwindow *window, int button, int action, int mods)
{
if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS)
{
prev_mouse.x = cur_mouse.x;
prev_mouse.y = cur_mouse.y;
is_pressed = true;
}
else
{
is_pressed = false;
}
}
但是,在这种情况下,即使在其他 imgui 中操作,相机也会移动 windows,如下所示。
我不知道怎么处理。
我是否应该使用 ImGui::IsWindowHovered()
之类的东西将此逻辑放在 IMGUI 的开始和结束之间?
像这样:
ImGui::Begin("scene");
{
if(ImGui::IsWindowHovered())
{
//camera setting
}
}
ImGui::End()
我对ImGui不熟悉,不知道ImGui中哪些函数需要调用,哪些不需要调用。
但是,GLFW 是一个相对较低级别的 windowing API,它不考虑 window 上可能存在的更高级别的抽象。当您将回调传递给 glfwSetCursorPosCallback
时,将在 window.
如果您需要让鼠标移动(或任何鼠标交互)仅在鼠标悬停在界面的相关部分上时响应,您需要某种机制来定义该部分是什么。再说一次:我不知道你在 ImGui 中是怎么做到的,但它可能看起来像这样:
void mouse_callback(GLFWwindow *window, double xposIn, double yposIn)
{
//Structured Binding; we expect these values to all be doubles.
auto [minX, maxX, minY, maxY] = //Perhaps an ImGui call to return the bounds of the openGL surface?
if(xposIn < minX || xposIn > maxX || yposIn < minY || yposIn > maxY) {
return; //We're outside the relevant bounds; do not do anything
}
//I'm assuming setting these values should only happen if the mouse is inside the bounds.
//Move it above the first if-statement if it should happen regardless.
cur_mouse.x = xposIn;
cur_mouse.y = yposIn;
if (is_pressed)
{
camera.ProcessMouseMovement((static_cast<float>(yposIn) - prev_mouse.y) / 3.6f, (static_cast<float>(xposIn) - prev_mouse.x) / 3.6f);
prev_mouse.x = xposIn;
prev_mouse.y = yposIn;
}
}
以上回答错误。 这在 Dear ImGui FAQ 中得到了回答: https://github.com/ocornut/imgui/blob/master/docs/FAQ.md#q-how-can-i-tell-whether-to-dispatch-mousekeyboard-to-dear-imgui-or-my-application TL;DR 检查鼠标的 io.WantCaptureMouse 标志。