所以我试图在我的OpenGL应用程序中捕获鼠标拖动。到目前为止,我已完成以下任务:
glfwSetMouseButtonCallback(window, mouse_callback);
static void mouse_callback(GLFWwindow* window, int button, int action, int mods)
{
if (button == GLFW_MOUSE_BUTTON_LEFT) {
double x;
double y;
glfwGetCursorPos(window, &x, &y);
if (previous_y_position - y > 0)
{
camera_translation.y -= 1.0f;
previous_y_position = y;
}
else
{
camera_translation.y += 1.0f;
previous_y_position = y;
}
}
}
这个问题是,如果我想放大,我需要向上移动鼠标,然后反复点击。出于某种原因,如果我按下鼠标左键并向上拖动它什么都不做。
答案 0 :(得分:2)
mouse_callback
是无国籍的。它接收事件,瞬间"行动"。
你需要让你的程序记住"记住"按下鼠标按钮。因此,当在第1帧中按下按钮时,您可以在此之后和释放鼠标按钮之前的所有帧中引用此信息。
简单的方法是在按下/释放时翻转布尔标志:
static void mouse_callback(GLFWwindow* window, int button, int action, int mods)
{
if (button == GLFW_MOUSE_BUTTON_LEFT) {
if(GLFW_PRESS == action)
lbutton_down = true;
else if(GLFW_RELEASE == action)
lbutton_down = false;
}
if(lbutton_down) {
// do your drag here
}
}
示意性地:
state released pressed released
timeline -------------|------------------------------|---------------
^ ^
mouse_callback calls GLFW_PRESS GLFW_RELEASE
困难的方法是使用状态机(特别是如果您需要更复杂的输入控制器状态组合)。
答案 1 :(得分:1)
在cursor_pos_callback中,只需确认按钮是否按下,即可。
void mouse_cursor_callback( GLFWwindow * window, double xpos, double ypos)
{
if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_RELEASE)
{
return;
}
// `write your drag code here`
}