Khi Nathan Reed và teodron tiếp xúc, công thức để quay vectơ v theo một bậc bốn q đơn vị là:
1) Tạo một quernion tinh khiết p ra khỏi v . Điều này chỉ có nghĩa là thêm tọa độ thứ tư bằng 0:
p=(vx,vy,vz,0)⇔p=(v,0)
2) Nhân trước nó với q và nhân nó với liên hợp q * :
p′=q×p×q∗
3) Điều này sẽ dẫn đến một tứ phương thuần túy khác có thể được quay lại thành một vectơ:
v′=(p′x,p′y,p′z)
Đây vector v′ là v xoay bởi q .
Điều này đang làm việc nhưng xa tối ưu . Phép nhân bậc bốn có nghĩa là tấn và tấn hoạt động. Tôi tò mò về các triển khai khác nhau như cái này , và quyết định tìm từ nơi chúng đến. Dưới đây là những phát hiện của tôi.
Chúng ta cũng có thể mô tả q là sự kết hợp của vectơ 3 chiều u và vô hướng s :
q=(ux,uy,uz,s)⇔q=(u,s)
Theo quy tắc nhân tứ phương , và khi liên hợp của một đơn vị độ dài đơn vị đơn giản là nó nghịch đảo, chúng ta nhận được:
p'= qp q*= ( u , s ) ( v , 0 ) ( - u , s )= ( s v + u × v , - u ⋅ v ) ( - u , s )= ( ( - u ⋅ v ) ( - u ) + s ( s v + u × v ) + ( s v + u × v ) × ( - u ) , Câu ) = ( ( U ⋅ v ) u + s2v+s(u×v)+sv×(−u)+(u×v)×(−u),…)
Phần vô hướng (elip) cho kết quả bằng 0, như chi tiết ở đây . Điều thú vị là phần vectơ, AKA vectơ xoay của chúng tôi v ' . Nó có thể được đơn giản hóa bằng cách sử dụng một số định danh vector cơ bản :
v′=(u⋅v)u+s2v+s(u×v)+s(u×v)+u×(u×v)=(u⋅v)u+s2v + 2 s ( u × v ) + ( u ⋅ v ) u - ( u ⋅ u ) v= 2 ( u ⋅ v ) u + ( s2- u ⋅ u ) v + 2 s ( u × v )
Điều này bây giờ tối ưu hơn nhiều ; hai sản phẩm chấm, một sản phẩm chéo và một vài tính năng bổ sung: khoảng một nửa hoạt động. Mà sẽ cung cấp một cái gì đó như thế trong mã nguồn (giả sử một số thư viện toán học vectơ chung):
void rotate_vector_by_quaternion(const Vector3& v, const Quaternion& q, Vector3& vprime)
{
// Extract the vector part of the quaternion
Vector3 u(q.x, q.y, q.z);
// Extract the scalar part of the quaternion
float s = q.w;
// Do the math
vprime = 2.0f * dot(u, v) * u
+ (s*s - dot(u, u)) * v
+ 2.0f * s * cross(u, v);
}