নাথান রিড এবং টিওড্রন যেমন প্রকাশ পেয়েছে, ইউনিট দৈর্ঘ্যের চতুর্ভুজ Q দ্বারা ভেক্টর v ঘোরানোর রেসিপিটি হ'ল:
1) ভি এর বাইরে খাঁটি কোয়ার্টেরন পি তৈরি করুন । এর অর্থ হ'ল 0 এর চতুর্থ স্থানাঙ্ক যুক্ত করা:
p = ( vএক্স, ভিY, ভিz- র, 0 ) ⇔ পি = ( ভি , 0 )
২) এটিকে Q এর সাথে পূর্বে গুণিত করুন এবং সংঘবদ্ধ Q * এর সাথে এটি বহুগুণ করুন :
পি'= কিউ× পি × কিউ*
3) এর ফলে আরও একটি বিশুদ্ধ চৌকোণ দেখা দেবে যা ভেক্টরে ফিরে যেতে পারে:
বনাম'= ( পি'এক্স, পি'Y, পি'z- র)
এই ভেক্টর বনাম' হয় বনাম দ্বারা আবর্তিত ।কুই
এটি কাজ করছে তবে অনুকূল থেকে অনেক দূরে । কোয়ার্টারিয়ন গুণগুলি অর্থ টন এবং টন ক্রিয়াকলাপ। আমি এটির মতো বিভিন্ন বাস্তবায়নের বিষয়ে আগ্রহী ছিলাম এবং সেগুলি কোথা থেকে এসেছে তা সন্ধান করার সিদ্ধান্ত নিয়েছিলাম। এখানে আমার অনুসন্ধান আছে।
আমরা বর্ণনা করতে পারেন কুই একটি 3-মাত্রিক ভেক্টরের সংমিশ্রন হিসেবে তোমার দর্শন লগ করা হবে এবং একটি স্কেলার গুলি :
কুই= ( ইউএক্স, UY, Uz- র, গুলি ) ⇔ কিউ= ( আপনি , গুলি )
কোয়ার্টারিয়ন গুণনের নিয়ম অনুসারে , এবং একক দৈর্ঘ্যের চতুর্থাংশের সংযোগ হিসাবে এটি কেবল বিপরীত হয়, আমরা পাই:
পি'= কিউp q*= ( ইউ , এস ) ( ভ , 0 ) ( - ইউ , এস )= ( এস ভি + ইউ × ভি , - ইউ ⋅ ভি ) ( - ইউ , এস )= ( ( - - ইউ ⋅ ভি ) ( - ইউ ) + এস ( এস ভি + ইউ × ভি ) + ( এস ভি + ইউ × ভি ) × ( - ইউ ) , ... ) = ( ( ইউ ⋅ ভি ) ইউ + এস2v + s ( u × v ) + s v × ( - u ) + ( u × v ) × ( - u ) , … )
স্ক্যালার অংশ (উপবৃত্তাকার) এর ফলাফল শূন্যের ফলাফল হিসাবে এখানে রয়েছে । মজার বিষয় হ'ল ভেক্টর অংশ, এ কে এ আমাদের ঘোরানো ভেক্টর ভি ' । কিছু বেসিক ভেক্টর পরিচয় ব্যবহার করে এটি সরল করা যেতে পারে :
বনাম'= ( u ⋅ v ) ইউ + এস2v + s ( u × v ) + s ( u × v ) + u × ( u × v )= ( u ⋅ v ) ইউ + এস2v + 2 s ( u × v ) + ( u ⋅ v ) u - ( u ⋅ u ) v= 2 ( ইউ ⋅ ভি ) ইউ + ( গুলি )2- ইউ ⋅ ইউ ) ভি + ২ এস ( ইউ × ভি )
এটি এখন অনেক বেশি অনুকূল ; দুটি বিন্দু পণ্য, একটি ক্রস পণ্য এবং কয়েকটি অতিরিক্ত: প্রায় অর্ধেক অপারেশন। যা উত্স কোডে এর মতো কিছু দেয় (কিছু জেনেরিক ভেক্টর গণিতের গ্রন্থাগার ধরে):
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);
}