Máy ảnh của tôi xoay quanh một điểm khi tôi cố thay đổi hướng. Nếu tôi xoay máy ảnh của tôi, nói, 30 độ trong trục Y, thay vì camera nhìn 30 độ về bên phải, máy ảnh xoay quanh điểm mà nó đang nhìn.Tại sao máy ảnh của tôi xoay quanh một điểm với phép toán này?
o is the camera, A and B are 3D models. The lines show line-of-sight.
This is what I expect:
A B
| >/
|/
|/
|/
o
This is what actually happens:
A B
|\
| \
| \
| > \
o
Bây giờ, theo hiểu biết của tôi, để di chuyển camera, tôi phải di chuyển thế giới bằng nghịch đảo của số tiền đó. Vì vậy, nếu tôi muốn di chuyển +1 trong trục Z, tôi dịch thế giới -1 trong trục Z. Vì tôi đang sử dụng quaternion để đại diện cho định hướng, tôi sử dụng nghịch đảo của quaternion camera (vì định hướng luôn là quaternion đơn vị, tôi tối ưu hóa bằng cách sử dụng liên hợp thay vì tính nghịch đảo) để xoay thế giới với số lượng phù hợp.
Sau đây là cách để chuyển đổi một quaternion đến một ma trận, trong đó q là quaternion đảo ngược:
[1 - 2 * (q.y * q.y + q.z * q.z) 2 * (q.x * q.y - q.w * q.z) 2 * (q.x * q.z + q.w * q.y) 0]
|2 * (q.x * q.y + q.w * q.z) 1 - 2 * (q.x * q.x + q.z * q.z) 2 * (q.y * q.z - q.w * q.x) 0|
|2 * (q.x * q.z - q.w * q.y) 2 * (q.y * q.z + q.w * q.z) 1 - 2 * (q.x * q.x + q.y * q.y) 0|
[0 0 0 1]
Sau đó, tôi thiết lập các thành phần dịch của ma trận:
[... ... ... -x]
|... ... ... -y|
|... ... ... -z|
[0 0 0 1]
Và cuối cùng Tôi nhân nó vào ngăn xếp ma trận xem mô hình, sau đó render tất cả các đối tượng của tôi. Tôi khá chắc chắn toán học này là chính xác, nhưng nó không tạo ra kết quả mà tôi mong đợi. Rõ ràng các vectơ về phía trước và bên phải là vấn đề, vì vậy câu hỏi duy nhất của tôi là tại sao chúng sai và chúng nên được đặt như thế nào nếu tôi muốn nhận được kết quả mà tôi mong đợi. Cảm ơn.
EDIT: Tôi đã tìm thấy giải pháp từ this guy's quaternion camera class. Đầu tiên tôi xây dựng một ma trận xoay như tôi đã làm trước đây, nhưng sau đó tôi lấy các vectơ cột của ma trận từ các cột đầu tiên, thứ hai và thứ ba (tương ứng, ya và za). Sau đó, tôi thiết lập các thành phần tịnh tiến của ma trận như thế này:
[... ... ... -xa.dotProduct(cameraPos)]
|... ... ... -ya.dotProduct(cameraPos)|
|... ... ... -za.dotProduct(cameraPos)|
[... ... ... ... ]
Sau đó, ma trận kết quả có thể được nhân lên ma trận modelview ngăn xếp, và nó hoạt động hoàn hảo.
Hãy chỉnh sửa giải pháp của bạn và chấp nhận giải pháp đó. Đó là cách chúng tôi đánh dấu các câu hỏi được giải quyết quanh đây. Ngoài ra tôi nghĩ rằng bạn xứng đáng với một số giải thích những gì đang xảy ra. Tôi sẽ viết một câu trả lời cho điều này. – datenwolf