2013-11-02 66 views
5

我必須做的一門功課,我嘗試實現的lookAt功能。我嘗試了很多方法,但我得到的唯一結果是藍屏。我的程序的其餘部分工作很大,事實上,如果我使用glm :: lookAt一切都很好。這是我的代碼:注視功能:我要瘋了

mat4 Transform::lookAt(const vec3 &eye, const vec3 &center, const vec3 &up) 
{ 
    vec3 w(glm::normalize(eye - center)) ; 
     vec3 u(glm::normalize(glm::cross(up, w))); 
     vec3 v(glm::cross(w, u)) ; 
    mat4 ret = mat4 (
     vec4 (u.x,v.x,w.x,0), 
      vec4 (u.y,v.y,w.y,0), 
      vec4 (u.z,v.z,w.z,0), 
     vec4 (-u.x*eye.x-u.y*eye.y-u.z*eye.z, 
      -v.x*eye.x-v.y*eye.y-v.z*eye.z, 
      -w.x*eye.x-w.y*eye.y-w.z*eye.z, 
      1) 
    ); 
    return ret; 

回答

9

我看見你使用GLM庫矩陣運算,所以從GLM代碼LOOKAT實施看起來是這樣的:

mat4x4 lookAt(vec3 const & eye, vec3 const & center, vec3 const & up) 
{ 
    vec3 f = normalize(center - eye); 
    vec3 u = normalize(up); 
    vec3 s = normalize(cross(f, u)); 
    u = cross(s, f); 

    mat4x4 Result(1); 
    Result[0][0] = s.x; 
    Result[1][0] = s.y; 
    Result[2][0] = s.z; 
    Result[0][1] = u.x; 
    Result[1][1] = u.y; 
    Result[2][1] = u.z; 
    Result[0][2] =-f.x; 
    Result[1][2] =-f.y; 
    Result[2][2] =-f.z; 
    Result[3][0] =-dot(s, eye); 
    Result[3][1] =-dot(u, eye); 
    Result[3][2] = dot(f, eye); 
    return Result; 
} 

你先歸你會用向量(˚F是你看,的方向U向上和小號是正確的矢量)。然後,以確保了矢量垂直於方向權向量您重新計算它當成自己的交叉產品,因爲當你給一個了矢量你不能確保它垂直於眼-center矢量(查看方向),他們只是形式,讓你的向右向量一個平面。

該基質由這些構成。有關更多詳細信息,請參閱http://www.songho.ca/opengl/gl_transform.html頁面。 簡而言之:這是一個矩陣,爲您創建一個新的座標系,所以coloumns是軸。然後在最後的顏色處應用翻譯矩陣。

(看矩陣:

AXIS  TRANSFORM 
x y z transl. 
1, 0, 0, 0 
0, 1, 0, 0, 
0, 0, 1, 0 
0, 0, 0, 1 

這給你一個標準座標系沒有翻譯。)

然後你用投影和模型矩陣(P * V * M)乘以該,順序很重要。 當你編寫你的實現時,確保你使用coloumn主矩陣,因爲opengl,或者轉置它們。

我希望它能幫助。