2008-11-25 31 views
14

Vì vậy, tôi đã viết một máy ảnh 3D dựa trên Quaternion hướng tới các lập trình viên mới để nó dễ dàng tích hợp và bắt đầu sử dụng.Máy ảnh 3D dựa trên Quaternion có nên tích lũy các góc Quaternions hoặc Euler không?

Trong khi tôi đang phát triển nó, lúc đầu tôi sẽ lấy đầu vào của người dùng làm góc Euler, sau đó tạo ra một Quaternion dựa tắt của đầu vào cho khung đó. Sau đó tôi sẽ lấy Quaternion của Camera và nhân nó với cái mà chúng ta tạo ra cho đầu vào, và theo lý thuyết, chỉ cần thêm vòng quay đầu vào vào trạng thái hiện tại của vòng quay của máy ảnh, và mọi thứ sẽ rất béo và hạnh phúc. Cho phép gọi này: Tích lũy Quaternions, bởi vì chúng tôi đang lưu trữ và thêm Quaternions chỉ.

Nhưng tôi nhận thấy rằng đã xảy ra sự cố với phương pháp này. Tôi càng sử dụng nó, ngay cả khi tôi chỉ quay trên một góc Euler, nói rằng Yaw, nó sẽ, trong một số lần lặp lại, bắt đầu chảy máu sang một số khác, nói Pitch. Đó là một chút, nhưng khá không thể chấp nhận được. Vì vậy, tôi đã làm một số nghiên cứu và tìm thấy một bài báo nói rằng nó là tốt hơn để tích lũy góc Euler, do đó, máy ảnh lưu trữ quay hiện tại của nó như góc Euler, và đầu vào chỉ đơn giản là thêm vào mỗi khung. Sau đó, tôi tạo ra một Quaternion từ mỗi khung hình, mà lần lượt được sử dụng để tạo ra ma trận xoay của tôi. Và điều này cố định vấn đề luân phiên chảy máu vào trục không đúng.

Vì vậy, mọi thành viên Stackoverflow có bất kỳ thông tin chi tiết nào về vấn đề này không? Đó có phải là cách làm đúng đắn không?

Trả lời

12

Nhân các quaternion sẽ bị tích lũy các vấn đề roundoff dấu chấm động (ngay cả các góc đơn giản như 45 độ sẽ không chính xác). Đó là một cách tuyệt vời để quay tổng hợp, nhưng độ chính xác của từng thành phần quaternion của bạn sẽ giảm dần theo thời gian. Các chảy máu qua là một tác dụng phụ, một cái nhìn trực quan tồi tệ hơn mặc dù quaternion của bạn có thể bắt đầu kết hợp với một yếu tố quy mô - để phục hồi điều đó, bạn sẽ phải renormalize trở lại góc Euler trong mọi trường hợp. Góc Euler cố định sẽ không tích lũy vòng tròn.

Tính toán lại quaternion trên mỗi khung hình là tối thiểu. Tôi sẽ không bận tâm cố gắng tối ưu hóa nó. Bạn có thể có thể cho phép một vài quaternions tích lũy trước khi bạn chuẩn hóa lại để có được độ chính xác trở lại, nhưng nó thực sự không phải là giá trị nỗ lực.

+0

tương tự với cách tiếp cận ma trận biến đổi và nó không phải là nỗ lực nhiều để thêm một số truy cập của các hoạt động vào góc quaternion euler dựa trên (vài dòng chỉ). btw tôi không khuyên bạn nên bình thường hóa quá thường xuyên vì nó có thể gây rối một chút với các hiệu ứng chuyển đổi mong muốn của bạn. Tôi thường bình thường hóa mọi hoạt động 64-128 – Spektre

+0

_ "để phục hồi điều đó, bạn phải tái chuẩn hóa lại góc Euler trong mọi trường hợp" _ - Điều này không đúng chút nào - yếu tố tỷ lệ có thể được phục hồi bằng cách lấy độ lớn của quaternion – Eric

1

Tôi đã thấy cả hai được tranh luận. Tôi nghĩ rằng câu hỏi thực sự bạn sẽ phải đối phó là sự linh hoạt trong hệ thống camera của bạn xuống dòng; IMO yaw nhìn chung thú vị hơn ở góc nhìn thứ ba (bởi vì bạn sẽ xoay quanh trục thẳng đứng của nhân vật). Trong khi bạn có thể cho là "ngáp" xung quanh chiều dọc trong góc nhìn người thứ nhất, tôi không chắc nó thực sự là giống nhau.

Tuy nhiên, tôi nghĩ rằng đó là một sự lãng phí để tính toán lại quaternions cho mỗi khung hình của bạn. Có lẽ nó sẽ là tốt hơn để lưu trữ các quaternions mới nhất và đánh dấu chúng bẩn nếu khung của bạn nhận được đầu vào?

+0

Vì vậy, có thể lưu trữ cả hai góc Euler và Quaternions, và chỉ cập nhật Quaternion nếu cần thiết, hoặc thậm chí tốt hơn, lưu trữ ma trận xoay, và chỉ cập nhật nó thông qua một Quaternion mới nếu mọi thứ được cập nhật. Điều này quan trọng hơn đối với việc quay các đối tượng, b/c máy ảnh sẽ thay đổi thường xuyên. – Adam

4

Tích lũy là một quá trình không chính xác. Tích lũy rất nhiều phép quay gia tăng sẽ tích lũy lỗi roundoff cho dù bạn làm điều đó với quaternion hoặc ma trận.

Tôi tưởng tượng một cái gì đó như thế này: bạn có mã của bạn và chạy, nhưng nhận thấy rằng sau một số lượng nhất định chuyển hướng máy ảnh của bạn là gót trên khó chịu - vi phạm một bất biến bạn đã không nghĩ đến trước. Có hiệu quả, bạn đã nhận ra rằng bạn không cần muốn để tích lũy các phép quay; thay vào đó bạn muốn làm điều gì đó khác.

Bạn có thể xem vấn đề này như một vấn đề về thiết kế giao diện hơn là vấn đề về độ chính xác về số.Về cơ bản, mọi người mong đợi một máy ảnh để điều hướng theo pitch, yaw, và roll, vì vậy việc lựa chọn để kiểm soát và đại diện cho các góc trực tiếp có thể tránh được rất nhiều vấn đề.

Bummer ở ​​đây là các quaterions dường như đã trở thành dư thừa (cho việc sử dụng cụ thể này, ít nhất). Bạn vẫn muốn quaternions, mặc dù - interpolating với các góc thô/yaw/roll thô có thể được xấu xí. Một lần nữa, đó là một câu hỏi thiết kế giao diện: bạn cần phải tìm ra nơi bạn sẽ cần quaternions, và làm thế nào để có được chúng trong và ngoài ...

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