2016-11-11 6 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

다른 사람들이 같은 문제가있는 경우, 나는 알아 냈습니다.

기본적으로
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); 
} 

는 내가 처음 곱셈의 순서를 변경하고하여 증식 할 수있는 역 행렬을 전치 : 그래서 내 행렬 내 unProject 기능이 잘못 있도록 행 중요한 것을 잊고, 여기에 올바른 기능입니다 vec4. 또한 최종 vec4 obj를 obj.w로 나누었습니다. 더 일반적인 목적의 함수이고 Perspective 투영에서 작동하기 때문에 직각 투영에서는 아무런 차이가 없습니다. 다른 코드도 약간 변경했습니다.

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]); 
} 

난 그냥 선호되는, 반전 컨트롤을 가지고 -1 mouse_offset를 곱하지만, 나는 또한 카메라를 패닝의 속도는 기본적으로 인 0.5를 곱하면됩니다.