मेरे Quaternion का उपयोग करते हुए FPS कैमरा को कैसे झुका और गड़बड़ कर रखा है?


17

मैं एक एफपीएस-जैसे कैमरे का उपयोग कर रहा हूं, और यह quaternions का उपयोग करता है। लेकिन, जब भी मैं देखने की कोशिश करता हूं और फिर बग़ल में देखता हूं, वह झुक जाता है, और कभी-कभी यह उल्टा भी हो सकता है। मैं इसे कैसे ठीक करूं?


3
(7 घंटे में स्व-उत्तर होगा) ...
Aeodyn

जवाबों:


16

आप अपने चतुर्भुज को एक यव / पिच / रोल सेट के कोणों में विघटित कर सकते हैं, लेकिन यह आमतौर पर ओवरकिल होता है।

इस तरह अपने quaternions की रचना के बजाय:

cameraOrientation = cameraOrientation * framePitch * frameYaw;

इसे इस्तेमाल करे:

cameraOrientation = framePitch * cameraOrientation * frameYaw;

इसके बाद यह कभी भी झुकाव / रोल उत्पन्न नहीं करेगा और अलग-अलग भंडारण के बराबर है


3
इस। यही वह है जिसकी तलाश में मैं हूं। एक लाइनर में मेरी समस्या का समाधान किया। अच्छा!
अद्रवार्क

1
हैं framePitchऔर frameYaw floatप्रकार? इसके अलावा, मैं आपके पहले वाक्य पर कुछ स्पष्टीकरण के लिए आभारी रहूंगा।
२०

1
@ सिरदैंक cameraOrientation, framePitchऔर frameYawसभी बटेरियन हैं (प्रत्येक चतुर्भुज 4 फ्लोट्स या डबल्स हैं)।
दान

8

यह एक समस्या है जो मुझे थोड़ी देर के लिए थी, और मुझे इसके लिए कोई जवाब नहीं मिला, इसलिए मैंने सोचा कि मैं इसे यहां पोस्ट करूंगा।

यह वास्तव में काफी सरल है। आप सबसे अधिक संभावना यह है कि घुमाव इस प्रकार हैं:

currentDirection * newRotation;

लेकिन, इसे इस तरह से करना भी काम नहीं करता है।

newRotation * currentDirection;

आपको जो करना है, वह ऊपर और नीचे की घुमाव के लिए पहले क्रम में, और बग़ल में घुमाव के लिए दूसरे क्रम में करना है।

मेरे लिए, यह इस तरह था:

        if (keyboard.IsKeyDown(Keys.Up))
            Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), TurnSpeed);
        if (keyboard.IsKeyDown(Keys.Down))
            Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(-1, 0, 0), TurnSpeed);
        if (keyboard.IsKeyDown(Keys.Left))
            Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, 1), TurnSpeed) * Direction;
        if (keyboard.IsKeyDown(Keys.Right))
            Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, -1), TurnSpeed) * Direction;

एक कारण के लिए, पहला तरीका वर्तमान बग़ल दिशा के सापेक्ष रोटेशन है, जिसे आप ऊपर और नीचे चाहते हैं, लेकिन आप नहीं चाहते कि बग़ल में घुमाव हो, जिसके कारण दूसरे क्रम की आवश्यकता है।


मुझे अपने जवाब देने के लिए 7 घंटे इंतजार करना पड़ा ...
ऐयोडन

क्षमा करें, क्या आप इसे कुछ स्क्रीनशॉट के साथ समझा सकते हैं? "पहला ऑर्डर" और "दूसरा ऑर्डर" थोड़ा भ्रामक है - धन्यवाद!
Atav32

क्वाटर्न्स के साथ काम करते समय, ऑर्डर मायने रखता है, क्योंकि यह हमेशा 3 डी घुमाव के साथ होता है। मेरे उदाहरण में, "दिशा * = नयाकरण" "दिशा = दिशा * नयाकरण" के समान है। लेकिन, बाएं और दाएं घुमाव के साथ, हम इसे दूसरे तरीके से चाहते हैं। यह ऊपर और नीचे झुकाव पर निर्भर नहीं करता है, जो रोल का कारण बनता है।
अयोध्या

ओह, हालांकि मैंने झगड़े की बात यह थी कि यह जिम्बल लॉक से बचा था और घुमाव सभी स्वतंत्र थे, लेकिन मैंने पाठ्यपुस्तक को गलत समझा हो सकता है। तो बस स्पष्ट करने के लिए, क्या आप कह रहे हैं कि यदि आप रोटेशन परिवर्तनों के क्रम को उलटते हैं, तो आप कैमरे को झुकाव से रोक सकते हैं? या आप मैन्युअल रूप से रोल और पिच परिवर्तनों को 0 पर सेट कर रहे हैं जब आप याओ को घुमाते हैं?
अताव ३२

5

एक एफपीएस कैमरा के लिए आप आमतौर पर रोल नहीं चाहते हैं और +/- 90 डिग्री पिच तक ही सीमित रहते हैं, इसलिए मैं सिर्फ यव और पिच कोणों का उपयोग करके वर्तमान स्थिति का ट्रैक रखना चाहूंगा। चतुर्धातुक पूर्ण शक्ति वास्तव में इसके लिए सहायक नहीं है।

यदि आप एफपीएस कैमरा और एनिमेटेड कैमरों के बीच क्वाटरनियन कीफ़्रेम इंटरपोलेशन का उपयोग करके या ऐसा कुछ करना चाहते हैं, तो आप अभी भी यव / पिच एंगल्स को क्वाटर्न्स से परिवर्तित कर सकते हैं।


0

एक और सरल ट्रिक है कैमरा को गेमऑब्जेक्ट में लगाना, और गेम ऑब्जेक्ट को यव रोटेशन कंट्रोल करना है, जबकि चाइल्ड कैमरा को पिच के निर्देशांक से कॉन्फ़िगर किया गया है:

playerCameraHolder.transform.Rotate(0, rotationYaw, 0);
playerCamera.transform.Rotate(rotationPitch, 0, 0);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.