Я пытаюсь реализовать систему сбора объектов, и пока это работает, если я не перемещаю камеру.unproject не работает в соответствии с назначением объекта при перемещении камеры
Если я не перемещаю камеру, он правильно показывает положение мыши в мировых координатах. Я не могу захватить мышь в своем скриншоте, но она находится внутри белого «круга», а координаты находятся в верхнем левом углу изображения.
Но если я двигаю камеру немного вниз, он продолжает показывать (0, 0) в центре экрана снова.
То, что я хочу, и ожидать, что она является (0, -5) или что-то.
Вот мой код:
double mouse_x, mouse_y;
glfwGetCursorPos(window, &mouse_x, &mouse_y);
vec3 mouse_pos = vec3(float(mouse_x), float(mouse_y), 0.0f);
world_mouse_pos = unProject(mouse_pos, view, projection, vec4(0, 0, window_width, window_height));
mouse_offset.x = last_mouse_pos.x - world_mouse_pos.x;
mouse_offset.y = last_mouse_pos.y - world_mouse_pos.y;
last_mouse_pos.x = world_mouse_pos.x;
last_mouse_pos.y = world_mouse_pos.y;
m_state = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_MIDDLE);
if (m_state == GLFW_PRESS){
view = translate(view, vec3(-mouse_offset, 0.0f));
glUniformMatrix4fv(view_loc, 1, GL_FALSE, &view.data[0][0]);
}
unProject функция:
inline vec3 unProject(const vec3 &pos, const mat4 &modelview, const mat4 &proj, const vec4 &viewport){
mat4 inv = inverse(proj * modelview);
vec4 temp = vec4(pos, 1.0f);
temp.x = ((temp.x - viewport.x)/viewport.z);
temp.y = ((temp.y - viewport.y)/viewport.w);
temp = temp * 2 - 1;
temp.y = - temp.y;
vec4 obj = inv * temp;
return vec3(obj.x, obj.y, obj.z);
}
Я использую ортогональной проекции. В основном unProject всегда возвращает одинаковые значения, несмотря на то, что камера находится в другом положении. Что мне не хватает?