在 Imgui 中,我如何使用 glfw 处理一般鼠标事件?

Nor*_*r-s 3 glfw imgui

我使用 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,在这种情况下,即使在其他imgui窗口中操作,相机也会移动,如下所示。

我不知道如何处理这个问题。

我应该使用类似的东西将此逻辑放在 IMGUI 的开始和结束之间吗ImGui::IsWindowHovered()

像这样:

ImGui::Begin("scene");
{
    if(ImGui::IsWindowHovered())
    {
        //camera setting    
    }
}
ImGui::End()
Run Code Online (Sandbox Code Playgroud)

Oma*_*mar 5

上面的回答都是错误的。这在亲爱的 ImGui 常见问题解答中得到了回答: 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 标志。


小智 5

我今天也遇到了同样的问题。对于现在看到此内容的任何人,您必须在初始化 ImGui 之前定义 glfw 回调。ImGui 此时会设置自己的回调,并处理将输入发送到已经存在的回调(如果之前未使用)。如果您随后定义回调,则会覆盖 ImGui 创建的回调。