Kỹ Thuật Nén Lưu Trữ Số Quaternion Sáng Tạo
Khi nghiên cứu mã nguồn thư viện hoạt ảnh gần đây, tôi đã phát hiện một phương pháp xử lý quaternion vô cùng độc đáo. Trong đồ họa 3D, quaternion thường được dùng để biểu diễn phép quay không gian với 4 thành phần số thực (x, y, z, w). Tuy nhiên nhờ tính chất chuẩn hóa x² + y² + z² + w² = 1, chúng ta không cần lưu trữ toàn bộ thông tin.
Sự dư thừa bắt nguồn từ hai yếu tố: Thứ nhất, độ chính xác 23-bit của kiểu float vượt xa nhu cầu thực tế - sai lệch 1/2²³ radian hoàn toàn không quan sát được bằng mắt thường. Thứ hai, do giá trị tuyệt đối các thành phần luôn nhỏ hơn 1, bit mũ trong biểu diễn float bị lãng phí 1 bit.
Thay vì dùng half float (16-bit) chỉ cung cấp 10 bit độ chính xác tương đối thô (khoảng 0.1%), giải pháp đột phá của ozz-animation sử dụng hệ thống số định điểm 16-bit. Việc này mang lại độ phân giải lên tới 1/60,000 chu kỳ tròn đầy, vượt trội hơn 16 lần so với half float truyền thống.
Kỹ thuật thông minh tiếp theo là “tối ưu hóa thành phần”:
- Thay vì lưu 3 thành phần đầu, hệ thống chọn lưu 3 thành phần nhỏ nhất. Với thành phần lớn nhất không vượt quá 1/√2, các giá trị được nhân hệ số √2 để tăng độ phân giải bổ sung ~0.5 bit
- Chỉ cần 2 bit để mã hóa vị trí thành phần lớn nhất và 1 bit cho dấu của nó. Tổng cộng 3 bit bổ sung này được tích hợp khéo léo vào mã định danh xương (bone ID), tận dụng hiệu quả không gian lưu trữ
Kết quả cuối cùng là mỗi quaternion được nén gọn trong 3 số định điểm 16-bit, với 14 bit dành cho độ chính xác và 1 bit dấu cho mỗi thành phần. Giải pháp này không chỉ tối ưu hóa không gian lưu trữ mà còn đảm bảo độ chính xác thị giác tối đa, đặc biệt hữu ích trong các hệ thống hoạt ảnh yêu cầu hiệu năng cao.