เมื่อ Nathan Reed และ Teodron เปิดเผยสูตรการหมุนเวกเตอร์vโดยหน่วย quaternion ความยาวหน่วยqคือ:
1) การสร้าง quaternion บริสุทธิ์Pออกมาจากโวลต์ นี่หมายถึงการเพิ่มพิกัดที่สี่เป็น 0:
p = ( vx, vY, vZ,0)⇔p=(v,0)
2) pre-multiply ด้วยqและ post-multiply ด้วย conjugate q * :
p′=q×p×q∗
3) สิ่งนี้จะส่งผลให้เกิด quaternion บริสุทธิ์อีกอันซึ่งสามารถกลับไปเป็นเวกเตอร์ได้:
v′=(p′x,p′y,p′z)
นี้เวกเตอร์เป็นหมุนโดยQv′vQ
นี้คือการทำงาน แต่ไกลจากที่ดีที่สุด การคูณแบบควอเทอเรียนหมายถึงการปฏิบัติงานเป็นตันและตัน ฉันอยากรู้เกี่ยวกับการใช้งานที่หลากหลายเช่นอันนี้และตัดสินใจที่จะหาจากที่มาเหล่านั้น นี่คือสิ่งที่ฉันค้นพบ
นอกจากนี้เรายังสามารถอธิบายqเป็นการรวมกันของเวกเตอร์ 3 มิติuและ scalar s :
Q= ( ux, UY, UZ, s ) ⇔ q= ( u , s )
ตามกฎของการคูณ quaternionและเมื่อการรวมกันของความยาวหน่วย quaternion เป็นเพียงการผกผันเราจะได้รับ:
พี'= qหน้าq* * * *= ( u , s ) ( v , 0 ) ( - u , s )= ( s v + u × v , - u ⋅ v ) ( - u , s )= ( ( - ยู⋅ วี) ( - ยู) + s ( s V + U × V ) + ( s V + U × วี) × ( - ยู) , ... ) = ( ( u ⋅ v ) u + s2v + s ( u × v ) + s v × ( - u ) + ( u × v ) × ( - u ) , … )
ส่วนที่สเกลาร์ (วงรี) ผลลัพธ์ในศูนย์ตามรายละเอียดที่นี่ สิ่งที่น่าสนใจเป็นส่วนหนึ่งเวกเตอร์อาคาหมุนเวกเตอร์ของเรา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 ) v + 2 s ( u × v )
นี่เป็นสิ่งที่ดีที่สุดแล้ว สองผลิตภัณฑ์ดอทผลิตภัณฑ์แบบไขว้และความพิเศษอื่น ๆ : ประมาณครึ่งหนึ่งของการปฏิบัติการ ซึ่งจะให้อะไรเช่นนั้นในซอร์สโค้ด (สมมติว่ามีห้องสมุดคณิตศาสตร์เวกเตอร์ทั่วไป):
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);
}