2016-11-11 18 views
0

Я пытаюсь реализовать систему сбора объектов, и пока это работает, если я не перемещаю камеру.unproject не работает в соответствии с назначением объекта при перемещении камеры

Если я не перемещаю камеру, он правильно показывает положение мыши в мировых координатах. Я не могу захватить мышь в своем скриншоте, но она находится внутри белого «круга», а координаты находятся в верхнем левом углу изображения.

enter image description here

Но если я двигаю камеру немного вниз, он продолжает показывать (0, 0) в центре экрана снова.

enter image description here

То, что я хочу, и ожидать, что она является (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 всегда возвращает одинаковые значения, несмотря на то, что камера находится в другом положении. Что мне не хватает?

ответ

0

Если у других проблемы одинаковые, я понял это. Так что я забыл, что мои матрицы ряда основного так что моя unProject функции не так, здесь правильная функция:

inline vec3 unProject(const vec3 &pos, const mat4 &modelview, const mat4 &proj, const vec4 &viewport){ 
    mat4 inv = inverse(modelview * proj); 

    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 = transpose(inv) * temp; 

    obj /= obj.w; 

    return vec3(obj.x, obj.y, obj.z); 
} 

В принципе я изменил порядок первого умножения и транспонированием обратной матрицы, чтобы быть в состоянии умножить его на a vec4. Я также разделил окончательный vec4 obj на obj.w, просто чтобы быть более универсальной функцией и работать в проекции Перспективы, он не имеет никакого значения в орфографической проекции. Я также внес небольшие изменения в другой код.

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; 
mouse_offset = -mouse_offset; 

m_state = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_MIDDLE); 
if (m_state == GLFW_PRESS){ 
    view = translate(view, vec3(mouse_offset*0.5, 0.0f)); 
    glUniformMatrix4fv(view_loc, 1, GL_FALSE, &view.data[0][0]); 
} 

размножит mouse_offset на -1, чтобы иметь инвертированные управления, который является только предпочтением, но я также умножить на 0,5, который является в основном скоростью панорамирования камеры.

 Смежные вопросы

  • Нет связанных вопросов^_^