2016-11-11 9 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); 
} 

基本的に私は、最初の乗算の順序を変更してそれを掛けることができるように逆行列を転置します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を掛け。

関連する問題