【问题标题】:How to keep mouse coordinates within window height/width limits如何将鼠标坐标保持在窗口高度/宽度限制内
【发布时间】:2021-01-03 20:34:45
【问题描述】:

假设我通过glfwCreateWindow() 创建了一个 600 x 600 的窗口。

我在场景中渲染了几个模型,为了在 3D 空间中移动它们,我使用了一个相机类,它随着光标和 AWSD/空格键移动。

为了使运动“无缝”,我使用glfwSetInputMode(this->window, GLFW_CURSOR, GLFW_CURSOR_DISABLED)

现在的问题是我也在尝试实现各种鼠标选择器(将光线从光标位置投射到场景)。

所以我从我在 yt 上找到的视频中实现了鼠标选择器,但它不能正常工作。原因是我的鼠标 X 和 Y 坐标会大于宽度和高度,例如,如果我在原地旋转(我可以通过这种方式无限增加)。

我知道发生这种情况是因为由于glfwSetInputMode(this->window, GLFW_CURSOR, GLFW_CURSOR_DISABLED),我没有将光标绑定在分辨率限制内。我在问我应该如何纠正这个问题,以便我可以保持无缝性以及能够将光标坐标限制在宽度和高度范围内(否则鼠标选择器功能将不起作用,因为标准化的鼠标坐标完全超过 [1,1]打破它等等)。

我将不胜感激。

编辑:

@httpdigest 的回答放入非常基本的代码中:

        //store offsetX and offsetY values (and dont forget to give them 0 as initial value)
        overshootX = mouseX - offsetX;
        overshootY = mouseY - offsetY;

        if (overshootX > width) {
            offsetX = offsetX + overshootX - width;
        }
        if (overshootX < 0) {
            offsetX = offsetX + overshootX;
        }
        if (overshootY > height) {
            offsetY = offsetY + overshootY - height;
        }
        if (overshootY < 0) {
            offsetY = offsetY + overshootY;
        }

        float withinWindowCursorPosX = mouseX - offsetX;
        float withinWindowCursorPosY = mouseY - offsetY;

【问题讨论】:

  • 我在 api 中看到 glfwSetCursorPos(GLFWWindow*, int xpos, int ypos) 。鉴于你有这个,并且可以在鼠标回调中获得位置,我认为你应该能够限制它?没有真正尝试过,只是一个想法。有效实现鼠标坐标的钳制。另一个想法是可能将偏移量存储到单独的状态中,并且仅当旧鼠标位置在边界内时才添加到偏移量。

标签: opengl glfw


【解决方案1】:

一种方法是存储一个offset(最初是(0, 0)),根据光标移动超出窗口/视口边界的程度(X 和Y 分开)。

基本上,每当您读取当前光标位置或被事件告知更新时,您都会计算 overshoot = cursorPos - offset(X 和 Y 分开)。如果overshoot 超过(width, height),则将offset 增加超过(width, height) 的超出部分。同样,如果overshoot 小于(0, 0),则将offset 减少负超调。

这样,您就有了一个“滑动”窗口/矩形,当您继续将鼠标光标移动到屏幕的任一边缘之外时,它会四处滑动。

现在,只要您想获得正确的光标位置(在您的窗口内),您只需使用withinWindowCursorPos = cursorPos - offset

然后,您可以使用withinWindowCursorPos 进行需要在窗口/视口中使用光标的拾取计算。

【讨论】:

  • 嘿,伙计,我有点迷路了。我了解这将如何解决我的问题,我试图将其转换为代码,但它不会按预期工作。
  • 我已经根据您的回答使用我正在处理的代码编辑了问题,如果您能看一下,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多