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ướng và vectơ đú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.