我一直在使用OpenGL创建3D第一人称射击游戏。我决定将摄影机的运动抽象到一个单独的玩家类中,并且设法使这些方法起作用,但是我唯一的问题是,每当鼠标首次进入屏幕时,摄影机就会发生很大的跳跃。
我知道解决此问题的方法是检查鼠标是否首次移动,但是我已经这样做了,但是仍然会导致跳转。这是代码:
void player::mouse_input(double &mouse_x_coordinate, double &mouse_y_coordinate, bool &first_mouse)
{
if (first_mouse)
{
last_x = mouse_x_coordinate;
last_y = mouse_y_coordinate;
first_mouse = false;
}
float xoffset = mouse_x_coordinate - last_x;
float yoffset = last_y - mouse_y_coordinate;
last_x = mouse_x_coordinate;
last_y = mouse_y_coordinate;
xoffset *= sensitivity;
yoffset *= sensitivity;
yaw += xoffset;
pitch += yoffset;
if (pitch > 89.0f)
pitch = 89.0f;
if (pitch < -89.0f)
pitch = -89.0f;
glm::vec3 front;
front.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
front.y = sin(glm::radians(pitch));
front.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
a_forward_direction = glm::normalize(front);
}
mouse_x_coordinate
和mouse_y_coordinate
参数是包含我通过glfwSetCursorPosCallback()
函数获得的鼠标x和y坐标的全局变量。
first_mouse
布尔值也是一个初始化为true
的全局变量。
这是a_forward_direction向量的初始化:
glm::vec3 a_forward_direction = glm::vec3(0.0, 0.0, -1.0);
在使用mouse_input方法之后,我发现front的值应该匹配,但仍然会导致跳转。
谁能告诉我为什么鼠标仍然跳动?