2013-11-02 15 views
5

Tôi phải làm bài tập về nhà và thử thực hiện chức năng lookAt. Tôi đã cố gắng theo nhiều cách nhưng kết quả duy nhất tôi nhận được là một màn hình màu xanh. Phần còn lại của chương trình của tôi làm việc rất nhiều, infact nếu tôi sử dụng glm :: lookAt tất cả là tốt. Đây là mã của tôi:Chức năng LookAt: Tôi sẽ phát điên

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; 

Trả lời

9

tôi thấy bạn sử dụng thư viện GLM cho các hoạt động ma trận, vì vậy từ mã GLM thi lookat trông như thế này:

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

Trước tiên, bạn bình thường hóa các vectơ bạn sẽ sử dụng (f là hướng bạn nhìn vào, u lên và s là đúng véc tơ). Sau đó, để đảm bảo lên vector vuông góc với hướngvectơ đúng bạn tính toán lại nó như là sản phẩm chéo của họ, bởi vì khi bạn đưa ra một vector lên bạn không thể chắc chắn vuông góc của nó bằng mắt vector trung tâm (xem hướng), chúng chỉ là một mặt phẳng cung cấp cho bạn đúng vector.

Ma trận được tạo từ những thứ này. Để biết thêm chi tiết về cách hoạt động của nó, hãy kiểm tra trang http://www.songho.ca/opengl/gl_transform.html. Tóm lại: đây là một ma trận tạo ra cho bạn một hệ tọa độ mới, do đó các coloumns là các trục. Sau đó, tại coloumn cuối cùng, ma trận dịch được áp dụng.

(Nhìn vào ma trận sắc:

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

này cung cấp cho bạn chuẩn hệ thống phối hợp với không dịch.)

Sau đó, bạn nhân này với dự báo và mô hình ma trận (p * v * m) , thứ tự quan trọng. Khi bạn viết thực hiện của bạn chắc chắn rằng bạn sử dụng coloumn ma trận chính, vì opengl, hoặc transpose chúng.

Tôi hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan