Quaternions का उपयोग करना: मैं उनके साथ क्या कर सकता हूं? (गणित के बिना)


24

मैं एक गेम डेवलपर हूं और गणित का अध्ययन नहीं किया है। इसलिए मैं केवल Quaternions को एक उपकरण के रूप में उपयोग करना चाहता हूं। और 3 डी रोटेशन के साथ काम करने में सक्षम होने के लिए, क्वाटरनियन (या मैट्रिक्स का उपयोग करना आवश्यक है, लेकिन आइए इस प्रश्न में यहां क्वाटरनियन पर रहें)। मुझे लगता है कि कई डेवलपर्स के लिए उनका उपयोग करना महत्वपूर्ण है। इसलिए मैं अपने ज्ञान को साझा करना चाहता हूं और आशा है कि मेरे पास जो छेद हैं, उन्हें भरें। अभी व....

जहाँ तक मैंने समझा:

एक उद्धरण 2 बातों का वर्णन कर सकता है:

  1. 3 डी ऑब्जेक्ट का वर्तमान अभिविन्यास।
  2. एक वस्तु को रोटेशन परिवर्तन कर सकता है। (RotationChange)

आप एक उद्धरण के साथ कर सकते हैं:

गुणा:

  1. Quaternion endOrientation = चतुर्भुज रोटेशनक्रूज * क्वाटर्नियन करंट ऑरियंटेशन;

    इसलिए उदाहरण के लिए: मेरी 3 डी ऑब्जेक्ट को 90 ° छोड़ दिया जाता है - और मेरा रोटेशन I गुणा 180 ° दाएं घूमता है, अंत में मेरा 3D ऑब्जेक्ट 90 ° दाईं ओर मुड़ जाता है।

  2. क्वाटरनियन रोटेशन क्रैग = क्वाटरनियन एंडरोटेशन * क्वाटरनियन.इंटरवर्स (स्टार्टरोटेशन);

    इसके साथ आपको एक रोटेशनचेंज मिलता है, जिसे दूसरे ओरिएंटेशन पर लागू किया जा सकता है।

  3. वेक्टर 3 एंडपोस्टियन = क्वाटरनियन रोटेशनचेंज * वेक्टर 3 वर्तमान स्थिति;

    इसलिए उदाहरण के लिए: मेरी 3 डी ऑब्जेक्ट पोजीशन (0,0,0) पर है और मेरा रोटेशन मैं गुणा करता हूं 180 ° से दाएं घूमता हूं, मेरा एंडपोजिशन कुछ ऐसा है (0, -50,0)। उस कुटेरियन के अंदर एक अक्ष है - और उस अक्ष के चारों ओर एक घूर्णन। आप अपनी बात उस धुरी Y डिग्री के चारों ओर घुमाते हैं।

  4. वेक्टर 3 रोटेटऑफसेटवेक्टर = क्वाटरनियन रोटेशनचेंज * वेक्टर 3 वर्तमानऑफसेटवेक्टर;

    उदाहरण के लिए: मेरी प्रारंभ दिशा यूपी दिखा रही है - (0,1,0), और मेरा रोटेशन मैं गुणा करके 180 ° से दाएं घूम रहा है, मेरी अंतिम दिशा नीचे दिखाई दे रही है। (0, -1,0)

सम्मिश्रण (Lerp और Slerp):

  1. क्वाटरनियन करंट ऑरियंटेशन = क्वाटर्नियन।स्लेर (स्टार्टऑरेंटेशन, एंड ऑरिजनेशन, इंटरपोलर)

    यदि प्रक्षेपक 1 है: currentOrientation = endOrientation

    यदि प्रक्षेपक 0 है: currentOrientation = startOrientation

    स्लरप अधिक सटीक प्रक्षेपित करता है, लेरप अधिक कर्ता को प्रक्षेपित करता है।

मेरे सवाल):

क्या मैंने अब तक जो कुछ भी समझाया वह सही है?

क्या यह "सभी" आप Quaternions के साथ कर सकते हैं? (obv नहीं)

आप उनके साथ और क्या कर सकते हैं?

2 Quaternions के बीच डॉट उत्पाद और क्रॉस उत्पाद क्या हैं?

संपादित करें:

कुछ सवालों के साथ अद्यतन प्रश्न


मान लें कि आपके पास 2 नहीं हैं, लेकिन nविभिन्न झुकाव (दृष्टिकोण, पोज़ आदि) हैं। फिर आप उन्हें भार का उपयोग करके औसत कर सकते हैं, प्रभावी रूप से स्लैप / एलआरपी को सामान्य कर सकते हैं। आप एक रोटर को एक रोटर में भी बदल सकते हैं, जो एक कठोर शरीर के लिए एक निश्चित समय के लिए कोणीय वेग को लागू करने के बराबर है। इसलिए आप चतुर्धातुक के साथ कोणीय वेग एकीकरण का भी वर्णन कर सकते हैं। आप यह भी अनुमान लगा सकते हैं कि असमानता दो झुकाव कैसे हैं (हाइपरस्फियर पर दो चतुर्धातुक द्वारा छोड़े गए चाप की लंबाई की गणना करें)।
तेओद्रोन

और हां, पहली नज़र में, आपका औचित्य सही है (किसी तकनीकी व्यक्ति के लिए quaternions की समझ काफी अच्छी है)। यह एक टिप्पणी के लिए अनुचित है, लेकिन बधाई! यहां तक ​​कि तकनीकी रूप से गिफ्ट किए गए सभी चतुर्भुज उपयोगों को भी नहीं जानते हैं, हालांकि वे उन्हें एक उद्देश्य के लिए सॉफ्टवेयर इंजीनियरिंग उपकरण के रूप में उपयोग करते हैं।
तेओद्रोन

4
"और 3 डी रोटेशन के साथ काम करने में सक्षम होने के लिए, Quaternions का उपयोग करना आवश्यक है" मैं पर्याप्त तनाव नहीं कर सकता कि यह वाक्य कितना गलत है। आप गेम डेवलपमेंट के लिए यूलर या टैट-ब्रायन कोण का उपयोग कर सकते हैं, एकमात्र समस्या जिम्बल लॉक है। यदि आप गेम डेवलपर बनना चाहते हैं, तो आपको एक बिंदु पर गणित की आवश्यकता होगी, इसे जानें।
बैलिंट

1
"गेम डेवलपर" और "गणित का अध्ययन नहीं करना" एक ऑक्सीमोरोन है।
मार्गरेट ब्लूम

2
मैं सराहना करता हूं कि आप प्रश्न के साथ क्या करने की कोशिश कर रहे हैं, लेकिन उत्तर एक प्रश्न में होना चाहिए, न कि प्रश्न में। यदि आपको लगता है कि यह "सारांश" उत्तर है तो उन्हें टटोलने लायक बनाएं।
बेसिक

जवाबों:


23

गुणन

कम से कम एकता के Quaternions के कार्यान्वयन के संदर्भ में, प्रश्न में वर्णित गुणन क्रम सही नहीं है। यह महत्वपूर्ण है क्योंकि 3D रोटेशन कम्यूटेटिव नहीं है

इसलिए, अगर मैं rotationChangeइसके शुरू होने से एक वस्तु को घुमाना चाहता हूं, तो मैं currentOrientationइसे इस तरह लिखूंगा:

Quaternion newOrientation = rotationChange * currentOrientation;

(यानी। ट्रांसफ़ॉर्मेशन बायीं ओर स्टैक होता है - एकता के मैट्रिक्स कन्वेंशन के समान। सबसे दाएं घुमाव को "सबसे स्थानीय" छोर पर पहले लागू किया जाता है)

और अगर मैं एक रोटेशन द्वारा एक दिशा या ऑफसेट वेक्टर को बदलना चाहता था, तो मैं इसे इस तरह लिखूंगा:

Vector3 rotatedOffsetVector = rotationChange * currentOffsetVector;

(यदि आप इसके विपरीत करते हैं तो एकता एक संकलित त्रुटि उत्पन्न करेगी)

सम्मिश्रण

अधिकांश मामलों के लिए आप लेरपिंग घुमावों से दूर हो सकते हैं। ऐसा इसलिए है क्योंकि एक चतुर्भुज में "हुड के नीचे" का उपयोग किया गया कोण रोटेशन का आधा कोण है, जिससे यह मैट्रिक्स की तरह कुछ की तुलना में लार्प के रैखिक सन्निकटन के काफी करीब हो जाता है (जो सामान्य रूप से लार्प अच्छी तरह से नहीं होगा !)। अधिक स्पष्टीकरण के लिए इस वीडियो में लगभग 40 मिनट देखें

एक मामला जब आपको वास्तव में स्लेर्प की आवश्यकता होती है, जब आपको समय के साथ लगातार गति की आवश्यकता होती है, जैसे एनीमेशन टाइमलाइन पर कीफ्रेम के बीच इंटरपोलिंग। उन मामलों के लिए जहां आप सिर्फ यह ध्यान रखते हैं कि एक आउटपुट दो इनपुट्स (जैसे एक एनीमेशन की परतों के बीच) के बीच मध्यवर्ती है, तो आमतौर पर लेरप काफी अच्छी तरह से कार्य करता है।

और क्या?

दो यूनिट चतुर्भुजों का डॉट उत्पाद उनके बीच के कोण का कोसाइन देता है, इसलिए यदि आप घुमावों की तुलना करना चाहते हैं तो आप समानता के माप के रूप में डॉट उत्पाद का उपयोग कर सकते हैं। हालांकि यह थोड़ा अस्पष्ट है, इसलिए अधिक सुपाठ्य कोड के लिए मैं अक्सर Quaternion.Angle (a, b) का उपयोग करता हूं , जो कि अधिक स्पष्ट रूप से व्यक्त करता है कि हम कोणों की तुलना कर रहे हैं, परिचित इकाइयों (डिग्री) में।

इस प्रकार की सुविधा विधियाँ जो कि एकता के लिए प्रदान करती हैं, सुपर उपयोगी हैं। लगभग हर परियोजना में मैं इसका उपयोग कम से कम कुछ बार करता हूं :

Quaternion.LookRotation(Vector3 forward, Vector3 up)

यह एक चतुर्भुज बनाता है कि:

  • forwardसदिश तर्क के साथ इंगित करने के लिए स्थानीय z + अक्ष को घुमाता है
  • upसदिश तर्क के लिए संभव के रूप में करीब इंगित करने के लिए स्थानीय y + अक्ष को घुमाता है, यदि प्रदान किया गया है, या (0, 1, 0)यदि छोड़ा गया है

"अप" केवल "जितना संभव हो उतना करीब" होने का कारण यह है कि सिस्टम अतिव्यापी है। Z + का forwardउपयोग करके स्वतंत्रता की दो डिग्री का उपयोग किया जाता है (जैसे कि जम्हाई और पिच) इसलिए हमारे पास स्वतंत्रता की केवल एक डिग्री शेष है (रोल)।

मुझे बहुत बार लगता है कि मैं विपरीत सटीकता गुणों के साथ कुछ चाहता हूं: मैं चाहता हूं कि स्थानीय y + बिल्कुल साथ-साथ इंगित करें up, और स्थानीय z + forwardशेष स्वतंत्रता के साथ जितना संभव हो सके ।

यह उदाहरण के लिए आता है जब आंदोलन इनपुट के लिए एक कैमरा-सापेक्ष समन्वय फ्रेम बनाने की कोशिश की जाती है: मैं चाहता हूं कि मेरी स्थानीय दिशा मंजिल या झुकी हुई सतह के लिए लंबवत बनी रहे, इसलिए मेरा इनपुट इलाके में चरित्र को सुरंग करने की कोशिश नहीं करता है। या उन्हें इससे दूर करना।

आपको यह भी मिल सकता है यदि आप चाहते हैं कि टारगेट के बुर्ज हाउसिंग एक टारगेट का सामना करें, बिना टंकी के शरीर के ऊपर से नीचे जाने पर / नीचे निशाना लगाने पर।

हम ऐसा करने के लिए अपने स्वयं के सुविधा समारोह का निर्माण कर सकते हैं, LookRotationजिसका उपयोग भारी उठाने के लिए किया जाता है:

Quaternion TurretLookRotation(Vector3 approximateForward, Vector3 exactUp)
{
    Quaternion rotateZToUp = Quaternion.LookRotation(exactUp, -approximateForward);
    Quaternion rotateYToZ = Quaternion.Euler(90f, 0f, 0f);

    return rotateZToUp * rotateYToZ;
}

यहाँ हम सबसे पहले लोकल y + से z +, और लोकल z + से y- घुमाते हैं।

फिर हम नए z + को अपनी दिशा में घुमाते हैं (इसलिए शुद्ध परिणाम स्थानीय y + अंक सीधे साथ होता है exactUp), और नया y + जितना संभव हो उतना ही आगे की ओर नकारात्मक दिशा में जाता है (इसलिए शुद्ध परिणाम स्थानीय z + बिंदु जितना संभव हो उतना करीब है approximateForward)

एक और आसान सुविधा विधि है Quaternion.RotateTowards, जिसका मैं अक्सर उपयोग करता हूं:

Quaternion newRotation = Quaternion.RotateTowards(
                             oldRotation, 
                             targetRotation,
                             maxDegreesPerSecond * Time.deltaTime
                         );

यह हमें targetRotationफ्रैमरेट की परवाह किए बिना एक सुसंगत, नियंत्रणीय गति पर बंद होने देता है - घुमाव के लिए महत्वपूर्ण है जो गेमप्ले यांत्रिकी के परिणाम / निष्पक्षता को प्रभावित करता है (जैसे एक चरित्र के आंदोलन को मोड़ना, या एक बुर्ज ट्रैक-इन खिलाड़ी पर होना)। इस स्थिति में Naively Lerping / Slerping आसानी से उन मामलों को जन्म दे सकती है जहां आंदोलन उच्च स्तर पर स्नैपर हो जाता है, जिससे खेल संतुलन प्रभावित होता है। (यह कहना गलत नहीं है कि ये तरीके गलत हैं - निष्पक्षता को बदले बिना उनका सही तरीके से उपयोग करने के तरीके हैं, इसके लिए बस देखभाल की आवश्यकता है। RotateTowardsएक सुविधाजनक शॉर्टकट देता है जो हमारे लिए इस बात का ध्यान रखता है)


युक्ति: वीडियो URL के अंत में & t = 40m जोड़ें ताकि यह सीधे वहां हो सके (वैकल्पिक रूप से 40m5s)। क्वाटरनियन डॉट उत्पाद गोलाकार गेमवुअर्स के साथ काम करते समय भी काम आते हैं - या अधिक मोटे तौर पर जब घूमने वाले गोले के टुकड़ों को उन्मुख करते हैं।
ल्यूक ब्रिग्स

@ ल्यूक ब्रिग्स: गोलाकार गेम वर्ल्ड पॉइंट ऐसा लगता है कि अगर आप इसके लिए तैयार होंगे (तो विशेष रूप से आरेख के साथ) इसके स्वयं के जवाब में विस्तार से बताने लायक होगा। :)
DMGregory

महान विचार - यह यहां 3 बजे है (इसलिए मुझे लगता है कि यह थोड़ा अस्पष्ट हो जाएगा!), लेकिन मुझे कल एक साथ कुछ खींचने में खुशी होगी (अगर मुझे याद है!)
ल्यूक ब्रिग्स

1
संपादित करें: मैं एक जवाब तो चुनौती स्वीकार कर लिया के बारे में सोच कर थोड़ा दूर ले गया है! मैं कम से कम इसे एक मोटे कट के रूप में चिह्नित करूंगा ताकि लोग देर रात के जलने से अवगत हो सकें जो इसमें चला गया था: पी
ल्यूक ब्रिग्स

हम वहाँ चलें! मैंने इसे इस आधार पर चित्रमय अवलोकन अर्थ में कवर करने का प्रयास किया कि आपका उत्तर पहले से ही अंतर्निहित कार्यों को वास्तव में अच्छी तरह से कवर करता है। मुझे लगता है कि कुछ नींद के लिए समय!
ल्यूक ब्रिग्स

14

डॉट उत्पाद का उपयोग कहां किया जाता है?

एकता में, डॉट उत्पाद के सबसे आम उपयोगकर्ताओं में से एक है जब भी आप जांचते हैं कि दो बटेरियन समान हैं ==या नहीं !=। एकता आंतरिक उत्पाद को सीधे x, y, z, w मानों की तुलना करने के बजाय समानता की जांच करने के लिए डॉट उत्पाद की गणना करती है। यह इस बात को ध्यान में रखने के लायक है क्योंकि यह कॉल को महंगा बनाता है जितना कि आप इसे होने की उम्मीद कर सकते हैं।

हम इसे एक दिलचस्प उपयोग के मामले में भी उपयोग करते हैं।

क्वाटरनियन डॉट उत्पादों के साथ मज़ा - गोलाकार दुनिया और ऑर्बिटल्स

पूरे ग्रहों और यहां तक ​​कि पूरे सौर मंडल के सिमुलेशन तेजी से आम हो रहे हैं। वास्तविक समय में इसे बंद करने के लिए, हमें चतुर्भुज डॉट उत्पाद की भी आवश्यकता है। बहुत से। चतुर्धातुक उत्पाद का बहुत उपयोग किया जाता है, लेकिन इसके उपयोग निश्चित रूप से होते हैं - आइए एक नज़र डालते हैं!

सबसे पहले, हमारे पास विचार करने के लिए घुमावों की एक पूरी श्रृंखला है:

  1. (वैकल्पिक रूप से) गांगेय केंद्र के चारों ओर का तारा
  2. तारे के चारों ओर का ग्रह
  3. ग्रह का झुकाव
  4. ग्रह का स्पिन
  5. पास के ग्रिड कोशिकाओं की स्थिति (ग्रहों की कोर के बारे में घुमाया गया) *
  6. कई कक्षीय विमान

उन सभी को एक साथ मिलाएं और आप बहुत अधिक जटिलता (और बहुत बड़ी संख्या में!) के साथ समाप्त होते हैं। जब दर्शक ग्रह की सतह पर खड़ा होता है, तो हम नहीं चाहते हैं कि वे हमारे गेमवेयर स्पेस के माध्यम से कुछ पागल गति से चोट पहुंचाएं। हम वास्तव में चाहते थे कि वे स्थिर थे और कहीं-कहीं उत्पत्ति के निकट थे - बजाय खिलाड़ी के चारों ओर ब्रह्मांड को स्थानांतरित करें।

घूमता हुआ ग्रह

महत्वपूर्ण रूप से, इस परिदृश्य में हमें ग्रह की स्पिन और झुकाव को सही तरीके से प्राप्त करने में सक्षम होने के लिए, हमें पोल ​​को लॉक करने की आवश्यकता है ताकि यह ऊपर की छवि पर केवल ऊपर / नीचे स्विंग कर सके (जैसा कि खिलाड़ी यात्रा करता है "ऊपर" झूल रहा है)। उत्तर)। यही कारण है कि एक quaternion डॉट उत्पाद आता है। अगर हम यहाँ एक डॉट उत्पाद का उपयोग नहीं किया और इसके बजाय सिर्फ झुकाव भी गुणा, यह होगा:

गलत तरीके से झुका हुआ 'ग्रह'

ध्यान दें कि हमारे परिक्रमा करने वाले 'ग्रहों' के ध्रुव हमेशा तारे की ओर कैसे झुकते हैं। वास्तविकता में ऐसा नहीं है - झुकाव एक निश्चित दिशा में है

विषय से बहुत दूर जाने के बिना, यहाँ एक त्वरित सारांश है:

  • एक क्षेत्र पर, एक अभिविन्यास भी बड़े करीने से एक सतह की स्थिति का वर्णन करता है।
  • हमें एक साथ गठबंधन करने के लिए बहुत सारे घुमाव मिले हैं।
  • सब कुछ रोटेशन के रूप में वर्णन करें; दर्शक की स्थिति भी। यह प्रदर्शन को बढ़ावा देने में मदद करता है क्योंकि आखिरकार हम कम संचालन करते हैं।
  • घूर्णन (हमारे डॉट उत्पाद) के बीच का कोण तब देशांतर को मापने में मदद करता है और झुकाव से निपटने में विशेष रूप से अच्छी तरह से काम करता है।

केवल कोण प्राप्त करके, हम उस अवांछित घुमाव को छोड़ देते हैं । उसी समय हम एक देशांतर माप के साथ भी समाप्त हुए जो नेविगेशन के साथ-साथ स्थानीय जलवायु के लिए उपयोगी है।

* ग्रहों का निर्माण बहुत सारी ग्रिड कोशिकाओं से किया जाता है । केवल पास वाले ही वास्तव में प्रदर्शित होते हैं।


2
यह दृश्य को सेट करने और समस्या को प्रेरित करने के लिए एक महान काम करता है, लेकिन मैं अभी भी थोड़ा फजी हूं कि कैसे क्वाटरनियन डॉट प्रोडक्ट का गणित (यानी। स्केलर उत्पाद जो dot(a, b) = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.wकि क्वाटरनियन रचना के विपरीत है, जिसे हम चेन-एक साथ उपयोग करेंगे। रोटेशन) हमें इस समस्या को हल करने में मदद करेगा। मैं वोट दें ख़ुशी होगी अगर आपका थोड़ी देर बाद इस पर विस्तृत करने में सक्षम (मैं अपने slerp से आप रखने के लिए मतलब यह नहीं है ... मैं मतलब नींद!)
DMGregory

@DmGregory संक्षिप्त उत्तर है झुकाव एक बाहर विषम है; सब कुछ उस एक को छोड़कर अच्छी तरह से रचना करता है (ग्रह अन्यथा अपने स्टार के आसपास डगमगाने के लिए दिखाई देगा)। मैं (उम्मीद है!) कल कुछ और संदर्भ जोड़ूंगा!
ल्यूक ब्रिग्स

@DMGregory मैंने कुछ अतिरिक्त जानकारी जोड़ी है (मैं सो नहीं सका!) - उम्मीद है कि यह स्पष्ट हो।
ल्यूक ब्रिग्स

1
क्षमा करें यदि मैं थोड़ा घना हो रहा हूं, लेकिन कई बार फिर से पढ़ने के बाद भी मुझे नहीं पता कि मैं आपके द्वारा बताए गए परिवर्तन को प्राप्त करने के लिए सूत्र में डॉट उत्पाद का उपयोग कैसे करूंगा। क्या आप अपने द्वारा स्पष्ट रूप से किए गए कार्यों को पूरा करने के लिए थोड़ा छद्म कोड जोड़ पाएंगे?
DMGregory

@DMGregory मैं quaternions से परिचित नहीं हूं, लेकिन अगर यह एक गोले पर घूमता है, तो यह रोटेशन रचनाएं नहीं है। यह वैक्टर के साथ गोलाकार ज्यामिति का उपयोग कर रहा है, किसी भी परिधि की सतह पर "लाइन" के लिए सामान्य वेक्टर की गणना करने के लिए। एक बार फिर, उत्तर बहुत कम देता है और न ही यह सवाल करता है, लेकिन मेरा मानना ​​है कि वे गोलाकार ज्यामिति का उपयोग कर रहे हैं।
द ग्रेट डक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.