如何将鼠标坐标保持在 window height/width 范围内
How to keep mouse coordinates within window height/width limits
假设我有一个 600 x 600 window 通过 glfwCreateWindow()
创建的。
我在场景中渲染了一些模型并在 3D 中围绕它们移动 space 我使用相机 class 随光标移动以及 AWSD/spacebar键。
为了使运动“无缝”,我使用 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;
一种方法是存储 offset
(最初是 (0, 0)
)光标超出 window/viewport 边界的程度(X 和 Y 分开) .
本质上,每当您读取当前光标位置或被告知事件更新时,您都会计算 overshoot = cursorPos - offset
(X 和 Y 分开)。如果 overshoot
超过 (width, height)
,则将 offset
增加超过 (width, height)
的部分。同样,如果 overshoot
小于 (0, 0)
,则将 offset
减去负超调量。
这样,您就有了一个“滑动”window/rectangle,当您继续将鼠标光标移动到屏幕任一边缘之外时,它会四处滑动。
现在,只要您想获得更正的光标位置(在您的 window 内),您只需使用 withinWindowCursorPos = cursorPos - offset
.
然后您可以使用 withinWindowCursorPos
进行需要光标在 window/viewport 内的拾取计算。
假设我有一个 600 x 600 window 通过 glfwCreateWindow()
创建的。
我在场景中渲染了一些模型并在 3D 中围绕它们移动 space 我使用相机 class 随光标移动以及 AWSD/spacebar键。
为了使运动“无缝”,我使用 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;
一种方法是存储 offset
(最初是 (0, 0)
)光标超出 window/viewport 边界的程度(X 和 Y 分开) .
本质上,每当您读取当前光标位置或被告知事件更新时,您都会计算 overshoot = cursorPos - offset
(X 和 Y 分开)。如果 overshoot
超过 (width, height)
,则将 offset
增加超过 (width, height)
的部分。同样,如果 overshoot
小于 (0, 0)
,则将 offset
减去负超调量。
这样,您就有了一个“滑动”window/rectangle,当您继续将鼠标光标移动到屏幕任一边缘之外时,它会四处滑动。
现在,只要您想获得更正的光标位置(在您的 window 内),您只需使用 withinWindowCursorPos = cursorPos - offset
.
然后您可以使用 withinWindowCursorPos
进行需要光标在 window/viewport 内的拾取计算。