জিএলএম: কোয়ার্টারিয়ন থেকে এলার অ্যাঙ্গেলস


12

আমি আশা করি আপনি জিএল গণিত ( জিএলএম ) জানেন কারণ আমার একটি সমস্যা হয়েছে, আমি ভাঙ্গতে পারি না:

আমার কাছে অয়লার অ্যাঙ্গেলসের সেট রয়েছে এবং তাদের মধ্যে আমার মসৃণ দ্বিখণ্ডন করা দরকার । সবচেয়ে ভালো উপায় তাদের রূপান্তরের উদ্দেশ্যে কোয়াটেরনিয়ন এবং প্রয়োগের SLERP alrogirthm।

আমার কাছে সমস্যাটি হ'ল এলার্ম অ্যাঙ্গেলসের সাথে কীভাবে গ্ল্যাম :: চতুষ্কালকের সূচনা করবেন, দয়া করে?

আমি বারবার জিএলএম ডকুমেন্টেশন পড়েছি , তবে আমি উপযুক্ত খুঁজে পাচ্ছি না, এটিতেQuaternion constructor signature তিনটি এলার অ্যাঙ্গেল লাগবে। সবচেয়ে কাছের একটিটি আমি খুঁজে পেয়েছি অ্যাঙ্গেলএক্সিস () ফাংশন, সেই কোণটির জন্য কোণ মূল্য এবং একটি অক্ষ গ্রহণ করে। দ্রষ্টব্য, দয়া করে, আমি কীভাবে সি উপায়ে যাচ্ছি, কীভাবে পার্স করব RotX, RotY, RotZ


আপনার তথ্যের জন্য এটি হ'ল উপরের ধাতব কোণ অ্যাক্সিস () ফাংশন স্বাক্ষর :

detail::tquat< valType > angleAxis (valType const &angle, valType const &x, valType const &y, valType const &z)

উত্তর:


13

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

এখানে কীভাবে (সিউডোকোড):

Quaternion QuatAroundX = Quaternion( Vector3(1.0,0.0,0.0), EulerAngle.x );
Quaternion QuatAroundY = Quaternion( Vector3(0.0,1.0,0.0), EulerAngle.y );
Quaternion QuatAroundZ = Quaternion( Vector3(0.0,0.0,1.0), EulerAngle.z );
Quaternion finalOrientation = QuatAroundX * QuatAroundY * QuatAroundZ;

(অথবা আপনার এলিউর এঙ্গেল আবর্তনগুলি প্রয়োগ করার উদ্দেশ্যে করা হয় সেই ক্রমের উপর নির্ভর করে আপনাকে সেই চতুর্ভুজগুলি চারদিকে স্যুইচ করতে হবে)

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

toQuat( orient3( EulerAngles ) )

ভাল উত্তর কারণ এটি প্রয়োগের ক্রম সম্পর্কে কম অস্পষ্ট।
রিচার্ড ফ্যাবিয়ান

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

যদিও সব উত্তর ভাল এবং মূল্যবান হয়, আমার মতে, এই সবচেয়ে বাস্তব অন্যতম। আমি এটিকে স্বীকৃত উত্তর হিসাবে চিহ্নিত করতে চাই ।
বুঙ্কাই.সেটেরি

@ ট্র্যাভোর: কোয়ার্টারিয়ন ফাইনাল ওরিয়েন্টেশন = কোটআউটএন্ডএক্স * কোয়াটআউন্ডওয়াই * কোয়াটাউন্ডজেড; আপনি কোন ধরণের গুণকে বোঝাতে চেয়েছেন? আমি অবাক হয়েছি যে, জিএলএম operator *কোয়ার্টেরিয়ান গুণনের জন্য ওভারলোড করে না , তাই সম্ভবত, আমাকে নিজেই গুণিত করতে হবে ।
বুঙ্কাই.সেটেরি

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

16
glm::quat myquaternion = glm::quat(glm::vec3(angle.x, angle.y, angle.z));

কোথায় angleএকটি হল glm::vec3ধারণকারী পিচ, Yaw, রোল যথাক্রমে।

পুনশ্চ. যদি সন্দেহ হয় তবে কেবল শিরোনামে গিয়ে দেখুন। সংজ্ঞাটি glm / gtc / quaternion.hpp এ পাওয়া যাবে:

explicit tquat(tvec3<T> const & eulerAngles) {
        tvec3<T> c = glm::cos(eulerAngle * value_type(0.5));
    tvec3<T> s = glm::sin(eulerAngle * value_type(0.5));

    this->w = c.x * c.y * c.z + s.x * s.y * s.z;
    this->x = s.x * c.y * c.z - c.x * s.y * s.z;
    this->y = c.x * s.y * c.z + s.x * c.y * s.z;
    this->z = c.x * c.y * s.z - s.x * s.y * c.z;    
}

কোথায় quatএকটি ভাসা হয় typedef হয় tquat


এটি বেশ অস্পষ্ট, এগুলি কী অর্ডারে প্রয়োগ হবে? ইউলারদের আবর্তন অর্ডার করা হয় এবং এখানে কোয়ার্টেরিয়ন কনস্ট্রাক্টর এর বিষয়ে যত্নশীল বলে মনে হয় না।
রিচার্ড ফ্যাবিয়ান

ফাংশন সংজ্ঞাটি আপনার মতো ঠিক একই; এটি গুরুত্বপূর্ণ হলে আমি আমার উত্তরে পোস্ট করেছিলাম posted
মিথ্যাচারিত কাবিয়ার

আর্গুমেন্টের ক্রম নয়, আবর্তনের প্রয়োগের ক্রম। আমার উত্তরটিতে উইকিপিডিয়া নিবন্ধ থেকে নেওয়া XYZ ক্রম রয়েছে, তবে আমরা আমার পুরানো সংস্থায় আবেদনের জেডওয়াইএক্স ক্রম এবং আমার বর্তমানের ওয়াইজেডএক্স ব্যবহার করি। x কোণটি এখনও সব ক্ষেত্রে ভেক্টর / আর্গুমেন্ট তালিকার প্রথম মান, তবে প্রকৃত ফলাফল রূপান্তরটি এক নয়।
রিচার্ড ফ্যাবিয়ান

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

2
-১ ঘূর্ণন
ক্রমটির

7

সমাধানটি উইকিপিডিয়ায় রয়েছে: http://en.wikedia.org/wiki/Conversion_between_quaternions_and_ Euler_angles

এটি ব্যবহার করে:

sx = sin(x/2); sy = sin(y/2); sz = sin(z/2);
cx = cos(x/2); cy = cos(y/2); cz = cos(z/2);

q( cx*cy*cz + sx*sy*sz,
   sx*cy*cz - cx*sy*sz,
   cx*sy*cz + sx*cy*sz,
   cx*cy*sz - sx*sy*cz ) // for XYZ application order

q( cx*cy*cz - sx*sy*sz,
   sx*cy*cz + cx*sy*sz,
   cx*sy*cz - sx*cy*sz,
   cx*cy*sz + sx*sy*cz ) // for ZYX application order

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

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


1
+1, হাই এবং দুর্দান্ত উত্তরের জন্য ধন্যবাদ। আমি ওপেনজিএল ব্যবহার করার সাথে সাথে জেড মানটি স্ক্রিনের বাইরে চলে যায়। আমার অ্যাপ্লিকেশনটিতে আমি জাইওয়াইএক্স গুণনের ক্রম সম্পাদন করি । মূলত, আমি ভেবেছিলাম, জিএলএমের এই কার্যকারিতা উপলব্ধ রয়েছে, তবে আমি দেখতে পাচ্ছি, তারা এখনও এটি প্রয়োগ করেনি, সুতরাং আপনার বিকল্প অনুসারে একটি বিকল্পটি ম্যানুয়ালি রূপান্তর তৈরি করছে ।
বুঙ্কাই.সেটেরি

এটি এখানে সেরা উত্তর।
প্লাজম্যাসেল

1
vec3 myEuler (fAngle[0],fAngle[1],fAngle[2]);
glm::quat myQuat (myEuler);

রেডিয়ানদের মধ্যে অবশ্যই আবশ্যক!


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