চতুর্দিকে ভেক্টর 3 ঘুরছে


25

আমি একটি প্রদত্ত চৌকোণ দ্বারা একটি ভেক্টর 3 ঘোরানোর চেষ্টা করছি।

আমি জানি যে এটি সত্য

বনাম'=কুইবনামকুই-1

আমি জানি যে হ'ল বিপরীত যা ঠিক , তবে আমি কীভাবে ভেক্টরকে পুনরুত্থানের জন্য কোয়ার্টেরিয়ানের গুনটির মানচিত্র করব?কুই-1-কুইমিএকটিএনআমিটিতোমার দর্শন লগ করা(কুই)

আমি দেখেছি যে আপনি বিবেচনা করতে পারেন একটি ম্যাট্রিক্স, এবং ধর্মান্তরিত যেমন এবং ম্যাট্রিক্স, এবং তারপর রূপান্তর একটি ভেক্টর করার জন্য একটি ম্যাট্রিক্স থেকে, কিন্তু এই উপরের উপর একটু শুধু একটি ভেক্টর পেতে বলে মনে হয়। আমি ব্যবহার করতে পারি এমন কোন ক্লিনার প্রয়োগ রয়েছে কি?বনামকুইকুই'বনাম'

উত্তর:


36

নাথান রিড এবং টিওড্রন যেমন প্রকাশ পেয়েছে, ইউনিট দৈর্ঘ্যের চতুর্ভুজ Q দ্বারা ভেক্টর v ঘোরানোর রেসিপিটি হ'ল:

1) ভি এর বাইরে খাঁটি কোয়ার্টেরন পি তৈরি করুন । এর অর্থ হ'ল 0 এর চতুর্থ স্থানাঙ্ক যুক্ত করা:

পি=(বনামএক্স,বনামY,বনামz- র,0)পি=(বনাম,0)

২) এটিকে Q এর সাথে পূর্বে গুণিত করুন এবং সংঘবদ্ধ Q * এর সাথে এটি বহুগুণ করুন :

পি'=কুই×পি×কুই*

3) এর ফলে আরও একটি বিশুদ্ধ চৌকোণ দেখা দেবে যা ভেক্টরে ফিরে যেতে পারে:

বনাম'=(পিএক্স',পিY',পিz- র')

এই ভেক্টর বনাম' হয় বনাম দ্বারা আবর্তিত ।কুই


এটি কাজ করছে তবে অনুকূল থেকে অনেক দূরে । কোয়ার্টারিয়ন গুণগুলি অর্থ টন এবং টন ক্রিয়াকলাপ। আমি এটির মতো বিভিন্ন বাস্তবায়নের বিষয়ে আগ্রহী ছিলাম এবং সেগুলি কোথা থেকে এসেছে তা সন্ধান করার সিদ্ধান্ত নিয়েছিলাম। এখানে আমার অনুসন্ধান আছে।

আমরা বর্ণনা করতে পারেন কুই একটি 3-মাত্রিক ভেক্টরের সংমিশ্রন হিসেবে তোমার দর্শন লগ করা হবে এবং একটি স্কেলার গুলি :

কুই=(তোমার দর্শন লগ করাএক্স,তোমার দর্শন লগ করাY,তোমার দর্শন লগ করাz- র,গুলি)কুই=(তোমার দর্শন লগ করা,গুলি)

কোয়ার্টারিয়ন গুণনের নিয়ম অনুসারে , এবং একক দৈর্ঘ্যের চতুর্থাংশের সংযোগ হিসাবে এটি কেবল বিপরীত হয়, আমরা পাই:

পি'=কুইপিকুই*=(তোমার দর্শন লগ করা,গুলি)(বনাম,0)(-তোমার দর্শন লগ করা,গুলি)=(গুলিবনাম+ +তোমার দর্শন লগ করা×বনাম,-তোমার দর্শন লগ করাবনাম)(-তোমার দর্শন লগ করা,গুলি)=((-তোমার দর্শন লগ করাবনাম)(-তোমার দর্শন লগ করা)+ +গুলি(গুলিবনাম+ +তোমার দর্শন লগ করা× বনাম)+ +(গুলিবনাম+ +তোমার দর্শন লগ করা×বনাম)×(-তোমার দর্শন লগ করা),...)=((তোমার দর্শন লগ করাবনাম)তোমার দর্শন লগ করা+ +গুলি2বনাম+ +গুলি(তোমার দর্শন লগ করা×বনাম)+ +গুলিবনাম×(-তোমার দর্শন লগ করা)+ +(তোমার দর্শন লগ করা×বনাম)×(-তোমার দর্শন লগ করা),...)

স্ক্যালার অংশ (উপবৃত্তাকার) এর ফলাফল শূন্যের ফলাফল হিসাবে এখানে রয়েছে । মজার বিষয় হ'ল ভেক্টর অংশ, এ কে এ আমাদের ঘোরানো ভেক্টর ভি 'কিছু বেসিক ভেক্টর পরিচয় ব্যবহার করে এটি সরল করা যেতে পারে :

বনাম'=(তোমার দর্শন লগ করাবনাম)তোমার দর্শন লগ করা+ +গুলি2বনাম+ +গুলি(তোমার দর্শন লগ করা×বনাম)+ +গুলি(তোমার দর্শন লগ করা×বনাম)+ +তোমার দর্শন লগ করা×(তোমার দর্শন লগ করা×বনাম)=(তোমার দর্শন লগ করাবনাম)তোমার দর্শন লগ করা+ +গুলি2বনাম+ +2গুলি(তোমার দর্শন লগ করা×বনাম)+ +(তোমার দর্শন লগ করাবনাম)তোমার দর্শন লগ করা-(তোমার দর্শন লগ করাতোমার দর্শন লগ করা)বনাম=2(তোমার দর্শন লগ করাবনাম)তোমার দর্শন লগ করা+ +(গুলি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);
}

উন্নততর লিখিত প্রতিক্রিয়া হিসাবে হাটগুলি বন্ধ করুন । এবং বিবেচনা করে যে বেশিরভাগ পারফরম্যান্স ফ্রিক্স ভেক্টর ক্রিয়াকলাপ সম্পাদন করতে অভ্যন্তরীণ ব্যবহার করে, আপনি বেশ গতি অর্জন করতে পারেন (এমনকি প্লেইন চতুর্থাংশ গুণ, বিশেষত ইন্টেল আর্কিটেকচারে)।
teodron

চূড়ান্ত ফলাফল রদ্রিগসের ঘূর্ণন সূত্রের অনুরূপ - এটি একই ভিত্তিতে ভেক্টর রয়েছে, যাইহোক; সহগগুলি মেলে কিনা তা দেখতে আমাকে কিছু ট্রিগ পরিচয় খনন করতে হবে।
নাথন রিড

@ নাথানরিড এটি একই ফলাফলে আসার অন্য উপায় বলে মনে হচ্ছে। আমি এটিও মেলে কিনা তাও জানতে চাই। যে ইশারা জন্য ধন্যবাদ!
লরেন্ট কুইভিডু

1
আমি এটির জিএলএম এর বাস্তবায়ন পরীক্ষা করে দেখছিলাম এবং মনে হচ্ছে এটি কিছুটা ভিন্নভাবে প্রয়োগ করা হয়েছে, যেমন নীচের মত: এটি vprime = v + ((cross(u, v) * s) + cross(u, cross(u, v)) * 2.0fকি একই রকম অপটিমাইজেশন? এটি দেখতে কিছুটা অনুরূপ, তবে একই নয় - এটি কেবল ক্রস পণ্য ব্যবহার করে, কোনও বিন্দুজাতীয় পণ্য ব্যবহার করে না। মূল উত্স কোডটি অফিসিয়াল জিএলএম রিপোজিটরির টাইপ_কোটা.এনএল ফাইলের মধ্যে পাওয়া যাবে operator*যা একটি vec<3, T, Q> operator*(qua<T, Q> const& q, vec<3, T, Q> const& v)
কোয়ার্টারিয়ন

7

প্রথমত, q ^ (- 1) -ক / প্রশস্ততা (কিউ) নয়; এটি কিউ * / (परिमाण (কিউ)) ^ 2 (কিউ * হল কনজুগেট; যা আসলটি বাদে সমস্ত উপাদানকে অবহেলা করে)। অবশ্যই, যদি আপনার সমস্ত কোয়ার্টেরনগুলি ইতিমধ্যে স্বাভাবিক করা হয় তবে আপনি সাধারণত কোনও ঘূর্ণন ব্যবস্থায় থাকবেন তবে আপনি প্রস্থের দ্বারা বিভাজনটি ছেড়ে দিতে পারেন।

কোনও ভেক্টরের সাথে গুণনের ক্ষেত্রে, আপনি কেবল কোটরের প্রকৃত উপাদানটি শূন্য এবং তার আইজক উপাদানগুলি ভেক্টরের জাইজেজে সেট করে ভেক্টরকে একটি কোয়াটারিয়নে প্রসারিত করেছেন। তারপরে আপনি ভি 'পেতে কোয়ার্টেরিয়ান গুণগুলি করেন এবং তারপরে আবার আইজকের উপাদানগুলি বের করতে পারেন। (ভি'র আসল অংশটি সর্বদা শূন্য, প্লাস বা বিয়োগের কিছু ভাসমান-পয়েন্ট ত্রুটিযুক্ত হওয়া উচিত))


5

প্রথম পর্যবেক্ষণ: বিপরীতটি qনয় -q/magnitude(q), এটি সম্পূর্ণ ভুল। কোয়ার্টেরিনগুলির সাথে আবর্তনগুলি বোঝায় যে এই 4 ডি জটিল সংখ্যার সমতুল্য একক আদর্শ রয়েছে, সুতরাং 4D স্পেসের এস 3 ইউনিট গোলকের সাথে থাকে। কোট একক হওয়ার অর্থ এই যে এর আদর্শ norm(q)^2=q*conjugate(q)=1এবং এর অর্থ হল কোটের বিপরীতটি তার সংযোগ।

একটি ইউনিট চার বস্তুর সমষ্টি হিসেবে লেখা হয়, তাহলে q=(w,x,y,z)= (কোসাইন্ (টি), পাপ (টি) বনাম ), তারপর তার অনুবন্ধী হল conjugate(q)=(w,-x,-y,-z)- = (পাপ (টি) কোসাইন্ (টি), বনাম , যেখানে) টি ঘূর্ণন কোণ এবং অর্ধেক বনাম ঘূর্ণন অক্ষ (অবশ্যই ইউনিট ভেক্টর হিসাবে)।

যখন হ্যামিল্টন ডিউড উচ্চ মাত্রায় জটিল সংখ্যার সমতুল্য হয়ে চারপাশে খেলার সিদ্ধান্ত নিয়েছে, তখন তিনি কিছু সুন্দর সম্পত্তিকেও হোঁচট খেয়েছিলেন। উদাহরণস্বরূপ, আপনি যদি পুরোপুরি খাঁটি কোয়ার্টেরিয়ন q=(0,x,y,z)(কোনও স্ক্যালার পার্ট ডাব্লু !) নিযুক্ত করেন, তবে আপনি সেই বর্জ্যটিকে ভেক্টর হিসাবে বিবেচনা করতে পারেন (এটি আসলে একটি কোট যা লোকেরা এস 3 গোলকের নিরক্ষীয় অঞ্চলকে ডাকে, এটি একটি এস 2 গোলক)! ! - 19 ম শতাব্দীর প্রযুক্তিগতভাবে লোকেরা আমাদের আজকাল আইফোন কাউবয় বলে মনে হয় যদি আমরা বিবেচনা করি তবে আমরা কীভাবে বাঁকানো জিনিসগুলি বিবেচনা করব)। হ্যামিল্টন সেই ভেক্টরটিকে তার কোট আকারে নিয়েছে: v=(0,x,y,z)এবং কোটের জ্যামিতিক বৈশিষ্ট্য বিবেচনা করে একাধিক পরীক্ষা-নিরীক্ষা করেছিল .. দীর্ঘ গল্পের সংক্ষিপ্ত:

INPUT: _v=(x,y,z)_ a random 3D vector to rotate about an __u__ unit axis by an angle of _theta_

OUTPUT: q*(0,_v_)*conjugate(q)

কোথায়

 q = (cos(theta/2), sin(theta/2)*u)
 conjugate(q) = inverse(q) = (cos(theta/2), -sin(theta/2)*u)
 norm(q)=magnitude(q)=|q|=1

পর্যবেক্ষণ: কিউ * (0, ভি) * কনজ (কিউ) ফর্মের অন্য কোট হতে হবে (0, ভি ')। কেন এটি ঘটে যায় সে সম্পর্কে আপাতদৃষ্টিতে জটিল জটিলতার মধ্যে আমি যাব না, তবে আপনি যদি এই পদ্ধতির মাধ্যমে খাঁটি কল্পিত চৌম্বকটি (বা আমাদের ক্ষেত্রে কোনও ভেক্টর) ঘোরান, তবে আপনাকে অবশ্যই একই ধরণের অবজেক্টটি পেতে হবে: খাঁটি কাল্পনিক কোট। এবং আপনি এর ফলাফল হিসাবে এর কল্পিত অংশ গ্রহণ। আপনার কাছে এটি রয়েছে, বাদামের (টি) শেলের কোয়ার্টেরিনগুলির সাথে আবর্তনের দুর্দান্ত পৃথিবী of

দ্রষ্টব্য : যার সাথে এই অতিব্যবহৃত বাক্যাংশটি লাফিয়ে লাফিয়ে যায়: কোট ভাল হয় কারণ তারা 'গিম্বল লক এড়ায়' .. তাদের কল্পনাটি প্রথমে আনলক করা উচিত !! কোটস একটি নিখরচায় "মার্জিত" গাণিতিক যন্ত্রপাতি এবং অন্যান্য পদ্ধতির ব্যবহার করে একেবারে এড়ানো যেতে পারে, আমি যেটি জ্যামিতিকভাবে অক্ষের কোণ পদ্ধতির সমতুল্য বলে মনে করি।

কোড : আমি যে সি ++ লাইব্রেরিটি পছন্দ করি তা বরং সরলবাদী, তবে সমস্ত ম্যাট্রিক্স, ভেক্টর এবং কোট অপারেশন রয়েছে একটি 3 ডি গ্রাফিক্স পরীক্ষামূলককে এটি শেখার জন্য 15 মিনিটেরও বেশি সময় ব্যয় না করেই করা উচিত .. আপনি এখানে যা লিখেছেন তা পরীক্ষা করে দেখতে পারেন 15 মিনিটের মধ্যে যদি আপনি সি ++ নবাগত না হন। শুভকামনা!


আপনার নোটের জন্য +1 আমি বাজি ধরেছি যে যদি বেশিরভাগ লোকেরা চেষ্টা করে তবে তারা বাস্তব জিম্বল লকটি অর্জন করতে পারেনি I ঘূর্ণন সম্পাদন করার সময় এটি কোনও অপ্রত্যাশিত আচরণের জন্য সমস্ত বাক্য হয়ে উঠেছে।
স্টিভ এইচ

বেশিরভাগ লোকেরা একটি সঠিক গিম্বল প্রক্রিয়া তৈরি করতে পারে না এবং মনে করে যে তারা যদি 3 টি আবর্তিত ম্যাট্রিককে এক সাথে চেইন করে তবে তারা স্বয়ংক্রিয়ভাবে "এলার অ্যাঙ্গেলগুলি" উপস্থাপনের সাথে শেষ হয় .. গিম্বল টাকি কেবলমাত্র একটি সহজ রোবট-আর্ম-প্রকারের ঘূর্ণন বিপরীতমুখী গতিবিজ্ঞান সম্পাদনের চেষ্টা করার সময় যে সংযোগগুলি রিডানডেন্সি অনুভব করতে পারে (এটি আসলে কাঙ্ক্ষিত অভিযোজন উত্পাদন করার প্রয়োজনের তুলনায় এটির আরও বেশি ডিগ্রি রয়েছে)। ওহ ভাল, এটি অন্য একটি বিষয়, তবে আমি ভেবেছিলাম সিজি প্রোগ্রামারদের মধ্যে এই "কিংবদন্তি" ইস্যুটি হাইপ থেকে দূরে
থাকাই ভালো

নাইটপিকেরি: অক্ষ অক্ষের সমান হলেও উভয় উপস্থাপনা এসও (3) এর সমস্ত ঘূর্ণনকে স্বতন্ত্রভাবে উপস্থাপন করতে পারে (ঠিক আছে, সাধারণ ডাবল কভারটি মডুলো করে) এবং অবশ্যই তাদের মধ্যে পিছনে পিছনে প্রায় তুচ্ছ একটি রূপান্তর রয়েছে, অন্যান্য নন-ম্যাট্রিক্স উপস্থাপনাগুলির তুলনায় রচনা করা অনেক সহজ হওয়ার সুবিধা।
স্টিভেন স্টাডনিকি

কোনও অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজে বিশেষত অপারেটর ওভারলোডিং ব্যবহার করার সময় তাদের দুর্দান্ত আচরণের কারণে তাদের রচনা করা সহজ হওয়ার সুবিধা রয়েছে। আমি নিশ্চিত নই, তবে সম্ভবত তাদের গোলাকার অন্তরঙ্গ বৈশিষ্ট্য অক্ষ-কোণের জন্য সংরক্ষণ করে (সম্ভবত স্কোয়াড বাদে ?!)।
teodron

2

কোয়ার্টেরিয়ন দ্বারা কোনও ভেক্টরকে রূপান্তর করার বিকল্প উপায় এখানে। এমএস এটি xna ফ্রেমওয়ার্কে এটি করে। http://pastebin.com/fAFp6NnN


-1

আমি এটি হাতে হাতে কাজ করার চেষ্টা করেছি, এবং নিম্নলিখিত সমীকরণ / পদ্ধতি নিয়ে এসেছি:

// inside quaterion class
// quaternion defined as (r, i, j, k)
Vector3 rotateVector(const Vector3 & _V)const{
    Vector3 vec();   // any constructor will do
    vec.x = 2*(r*_V.z*j + i*_V.z*k - r*_V.y*k + i*_V.y*j) + _V.x*(r*r + i*i - j*j - k*k);
    vec.y = 2*(r*_V.x*k + i*_V.x*j - r*_V.z*i + j*_V.z*k) + _V.y*(r*r - i*i + j*j - k*k);
    vec.z = 2*(r*_V.y*i - r*_V.x*j + i*_V.x*k + j*_V.y*k) + _V.z*(r*r - i*i - j*j + k*k);
    return vec;
}

আমি প্রশংসা করব যে কেউ যদি আমি ব্যবহার করে এমটি ডাইভারিভিশন দেখে থাকি তবে http://pastebin.com/8QHQqGbv আমি এমন কোনও পাঠ্য সম্পাদককে অনুলিপি করার পরামর্শ দেব যা সাইড স্ক্রোলিং সমর্থন করে

আমার স্বীকৃতিতে আমি কনজুগেট বোঝাতে q ^ (- 1) ব্যবহার করেছি, এবং বিপরীতমুখী নয় এবং বিভিন্ন সনাক্তকারী, তবে আমি আশা করি এটি অনুসরণযোগ্য। আমি মনে করি যে বেশিরভাগই সঠিক, বিশেষত যেখানে ভেক্টরের আসল অংশটি প্রমাণ করার পরে অদৃশ্য হয়ে যায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.