जैसा कि नाथन रीड और टेओड्रॉन ने उजागर किया, एक इकाई-लंबाई चतुर्धातुक q द्वारा वेक्टर v को घुमाने का नुस्खा है:
1) v से शुद्ध paternion p बनाएँ । इसका सीधा सा मतलब है 0 का चौथा समन्वय जोड़ना:
p=(vx,vy,vz,0)⇔p=(v,0)
2) इसे q के साथ प्री-गुणा करें और कंजुगेट q * से पोस्ट-गुणा करें :
p′=q×p×q∗
3) इसके परिणामस्वरूप एक और शुद्ध बटेरियन होगा जिसे एक वेक्टर में वापस लाया जा सकता है:
v′=(p′x,p′y,p′z)
यह वेक्टर v′ हैv तक घुमायाq ।
यह काम कर रहा है लेकिन इष्टतम से बहुत दूर है । क्वाटरनियन गुणन का मतलब है टन और संचालन के टन। मैं इस तरह के एक के रूप में विभिन्न कार्यान्वयन के बारे में उत्सुक था , और उन लोगों को खोजने का फैसला किया जहां से वे आए थे। यहाँ मेरे निष्कर्ष हैं।
हम q का वर्णन 3-आयामी वेक्टर u और अदिश s के संयोजन के रूप में भी कर सकते हैं :
q=(ux,uy,uz,s)⇔q=(u,s)
चतुर्धातुक गुणा के नियमों द्वारा , और एक इकाई लंबाई चतुर्भुज के संयुग्म के रूप में बस इसका उलटा होता है, हमें मिलता है:
p′=qpq∗=(u,s)(v,0)(−u,s)=(sv+u×v,−u⋅v)(−u,s)=((−u⋅v)(−u)+s(sv+u× v)+(sv+u×v)×(−u),…)=((u⋅v)u+s2v+s(u×v)+sv×(−u)+(u×v)×(−u),…)
स्केलर भाग (दीर्घवृत्त) का परिणाम शून्य होता है, जैसा कि यहां विस्तृत है । क्या दिलचस्प है वेक्टर हिस्सा, AKA हमारे घुमाए गए वेक्टर v ' । कुछ बुनियादी वेक्टर पहचानों का उपयोग करके इसे सरल बनाया जा सकता है :
v′=(u⋅v)u+s2v+s(u×v)+s(u×v)+u×(u×v)=(u⋅v)u+s2v+2s(u×v)+(u⋅v)u−(u⋅u)v=2(u⋅v)u+(s2−u⋅u)v+2s(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);
}