नहीं, यह एक इंजन बग या किसी विशेष रोटेशन प्रतिनिधित्व की एक कलाकृति नहीं है (वे भी हो सकते हैं, लेकिन यह प्रभाव हर प्रणाली पर लागू होता है जो रोटेशन, quaternions का प्रतिनिधित्व करता है)।
आपने त्रि-आयामी अंतरिक्ष में रोटेशन कैसे काम करता है, इसके बारे में एक वास्तविक तथ्य की खोज की है, और यह अनुवाद जैसे अन्य परिवर्तनों के बारे में हमारे अंतर्ज्ञान से प्रस्थान करता है:
जब हम एक से अधिक अक्षों पर घुमावों की रचना करते हैं, तो हमें जो परिणाम मिलता है, वह प्रत्येक अक्ष पर हमारे द्वारा लागू कुल / शुद्ध मान नहीं है (जैसा कि हम अनुवाद के लिए उम्मीद कर सकते हैं)। जिस क्रम में हम घुमाव लगाते हैं, उसका परिणाम बदल जाता है, क्योंकि प्रत्येक घुमाव उन अक्षों को ले जाता है, जिन पर अगला घुमाव लागू होता है (यदि वस्तु के स्थानीय अक्षों के बारे में घूमता है), या वस्तु और अक्ष के बीच का संबंध (यदि दुनिया के बारे में घूमता है) कुल्हाड़ियों)।
समय के साथ अक्ष के रिश्तों का बदलना हमारे अंतर्ज्ञान को भ्रमित कर सकता है कि प्रत्येक अक्ष को क्या करना है। विशेष रूप से, जबड़े और पिच के घुमाव के कुछ संयोजन एक रोल रोटेशन के समान परिणाम देते हैं!
आप यह सत्यापित कर सकते हैं कि प्रत्येक चरण हमारे द्वारा अनुरोध की गई धुरी के बारे में सही तरीके से घूम रहा है - हमारे संकेतन में कोई इंजन गड़बड़ या विरूपण साक्ष्य नहीं है जो हमारे इनपुट के साथ हस्तक्षेप करता है या अनुमान लगाता है - घूर्णन की गोलाकार (या हाइपरस्पेरिकल / चतुर्धातुक) प्रकृति बस हमारे परिवर्तनों का अर्थ है "लपेटो" चारों ओर "एक दूसरे पर। वे छोटे रोटेशन के लिए स्थानीय रूप से ऑर्थोगोनल हो सकते हैं, लेकिन जैसा कि वे ढेर करते हैं हम पाते हैं कि वे विश्व स्तर पर ऑर्थोगोनल नहीं हैं।
यह 90-डिग्री के लिए सबसे नाटकीय और स्पष्ट है जो ऊपर की तरह बदल जाता है, लेकिन भटकते हुए कुल्हाड़ी कई छोटे घुमावों पर भी रेंगते हैं, जैसा कि प्रश्न में दिखाया गया है।
तो हम इस बारे में क्या कर सकते हैं?
यदि आपके पास पहले से ही पिच-यव रोटेशन सिस्टम है, तो अवांछित रोल को खत्म करने के सबसे तेज़ तरीकों में से एक है ऑब्जेक्ट के स्थानीय अक्षों के बजाय वैश्विक या अभिभावक परिवर्तन अक्षों पर संचालित करने के लिए घुमावों में से एक को बदलना। इस तरह आप दोनों के बीच क्रॉस-संदूषण नहीं प्राप्त कर सकते हैं - एक अक्ष बिल्कुल नियंत्रित रहता है।
यहाँ पिच-यॉ-पिच का वही क्रम है जो ऊपर दिए गए उदाहरण में एक रोल बन गया है, लेकिन अब हम अपने yaw को ऑब्जेक्ट के बजाय वैश्विक Y अक्ष पर लागू करते हैं
तो हम "Pitch Locally, Yaw Globally" मंत्र के साथ पहले व्यक्ति के कैमरे को ठीक कर सकते हैं:
void Update() {
float speed = lookSpeed * Time.deltaTime;
transform.Rotate(0f, Input.GetAxis("Horizontal") * speed, 0f, Space.World);
transform.Rotate(-Input.GetAxis("Vertical") * speed, 0f, 0f, Space.Self);
}
यदि आप गुणन का उपयोग करके अपने घुमावों को कम कर रहे हैं, तो आप एक ही प्राप्त करने के लिए गुणा के बाएँ / दाएँ क्रम को फ्लिप करेंगे:
// Yaw happens "over" the current rotation, in global coordinates.
Quaternion yaw = Quaternion.Euler(0f, Input.GetAxis("Horizontal") * speed, 0f);
transform.rotation = yaw * transform.rotation; // yaw on the left.
// Pitch happens "under" the current rotation, in local coordinates.
Quaternion pitch = Quaternion.Euler(-Input.GetAxis("Vertical") * speed, 0f, 0f);
transform.rotation = transform.rotation * pitch; // pitch on the right.
(विशिष्ट आदेश आपके वातावरण में गुणन सम्मेलनों पर निर्भर करेगा, लेकिन बाएं = अधिक वैश्विक / सही = अधिक स्थानीय एक सामान्य विकल्प है)
यह नेट टोटल यव और कुल पिच को संग्रहीत करने के बराबर है, जिसे आप फ्लोट वैरिएबल के रूप में चाहते हैं, फिर हमेशा नेट रिजल्ट को एक ही बार में लागू करते हुए, इन कोणों से एक ही नई अभिविन्यास चतुर्धातुक या मैट्रिक्स का निर्माण करते हैं (बशर्ते आप totalPitch
ताली बजाते रहें :
// Construct a new orientation quaternion or matrix from Euler/Tait-Bryan angles.
var newRotation = Quaternion.Euler(totalPitch, totalYaw, 0f);
// Apply it to our object.
transform.rotation = newRotation;
या समकक्ष ...
// Form a view vector using total pitch & yaw as spherical coordinates.
Vector3 forward = new Vector3(
Mathf.cos(totalPitch) * Mathf.sin(totalYaw),
Mathf.sin(totalPitch),
Mathf.cos(totalPitch) * Mathf.cos(totalYaw));
// Construct an orientation or view matrix pointing in that direction.
var newRotation = Quaternion.LookRotation(forward, new Vector3(0, 1, 0));
// Apply it to our object.
transform.rotation = newRotation;
इस वैश्विक / स्थानीय विभाजन का उपयोग करते हुए, घुमावों को एक-दूसरे को संयोजित करने और प्रभावित करने का मौका नहीं मिलता है, क्योंकि वे कुल्हाड़ियों के स्वतंत्र सेट पर लागू होते हैं।
वही विचार मदद कर सकता है यदि यह दुनिया में एक ऐसी वस्तु है जिसे हम घुमाना चाहते हैं। ग्लोब की तरह एक उदाहरण के लिए, हम अक्सर इसे उल्टा करना चाहते हैं और स्थानीय रूप से हमारे याओ को लागू करते हैं (इसलिए यह हमेशा अपने डंडों के चारों ओर घूमता है) और विश्व स्तर पर पिच करता है (इसलिए यह हमारे विचार से / दूर, बजाय ऑस्ट्रेलिया की ओर / दूर जाने के सुझाव देता है) , जहाँ भी यह इंगित कर रहा है ...)
सीमाएं
यह वैश्विक / स्थानीय संकर रणनीति हमेशा सही फिक्स नहीं होती है। उदाहरण के लिए, 3D उड़ान / तैराकी के साथ एक गेम में, आप सीधे ऊपर / सीधे नीचे इंगित करने में सक्षम होना चाहते हैं और फिर भी पूर्ण नियंत्रण रख सकते हैं। लेकिन इस सेटअप के साथ आप जिम्बल लॉक से टकराएंगे - आपका यव अक्ष (वैश्विक अप) आपके रोल अक्ष (स्थानीय आगे) के समानांतर हो जाता है, और आपके पास मुड़ने के बिना बाएं या दाएं देखने का कोई तरीका नहीं है।
इस तरह के मामलों में आप इसके बजाय क्या कर सकते हैं, जैसा कि हमने ऊपर प्रश्न में शुरू किया था, जैसे कि शुद्ध स्थानीय घुमाव का उपयोग करना है (इसलिए आपके नियंत्रण वही महसूस करते हैं जहां आप देख रहे हैं), जो शुरू में कुछ रोल रेंगने देगा - लेकिन फिर हम इसके लिए सही हैं।
उदाहरण के लिए, हम अपने "फॉरवर्ड" वेक्टर को अपडेट करने के लिए स्थानीय घुमाव का उपयोग कर सकते हैं, फिर उस फ़ाइनल वेक्टर का उपयोग हमारे अंतिम ओरिएंटेशन को बनाने के लिए "अप" वेक्टर के संदर्भ में कर सकते हैं। (उदाहरण के लिए, एकता का उद्धरण का उपयोग करना। लुब्रिकेशन विधि, या मैन्युअल रूप से इन वैक्टरों से एक ऑर्थोनॉमिक मैट्रिक्स का निर्माण करना) अप वेक्टर को नियंत्रित करके, हम रोल या ट्विस्ट को नियंत्रित करते हैं।
उड़ान / तैराकी उदाहरण के लिए, आप इन सुधारों को धीरे-धीरे समय के साथ लागू करना चाहते हैं। यदि यह बहुत अचानक है, तो दृश्य विचलित करने वाला हो सकता है। इसके बजाय, आप खिलाड़ी के वर्तमान अप वेक्टर का उपयोग कर सकते हैं और इसे लंबवत, फ़्रेम-बाय-फ़्रेम की ओर इंगित कर सकते हैं, जब तक कि उनका दृश्य स्तर बाहर न हो। एक मोड़ के दौरान इसे लागू करना कभी-कभी कैमरे को घुमा देने की तुलना में कम उबाऊ हो सकता है, जबकि खिलाड़ी का नियंत्रण बेकार है।