रोटेशन दर्पण मद्धम


9

मैं निम्नलिखित कोड का उपयोग करके लक्ष्य को देखने के लिए अपने खेल चरित्र को घुमाता हूं:

        transform.rotation = Quaternion.Slerp(startQuaternion, lookQuaternion, turningNormalizer*turningSpeed/10f)

startQuaternion एक नया लक्ष्य दिए जाने पर चरित्र की वर्तमान रोटेशन है।

लुकक्वेरियन वह दिशा है जिसे चरित्र को देखना चाहिए और यह इस तरह सेट है:

    destinationVector = currentWaypoint.transform.position - transform.position;
    lookQuaternion = Quaternion.LookRotation(destinationVector, Vector3.up);

टर्ननॉर्मालाइज़र सिर्फ बढ़ा हुआ है Time.deltaTimeऔर turningSpeedसंपादक में दिया गया एक स्थिर मूल्य है।

समस्या यह है कि जब चरित्र बदल जाता है, तो उसे अधिकतर समय होना चाहिए, जब उसे 180 डिग्री के करीब करना पड़ता है तो उसे समस्या होती है। फिर यह कई बार जिटर्स और रोटेशन को मिरर करता है:

यहाँ छवि विवरण दर्ज करें

इस खराब खींची गई छवि में चरित्र (दाईं ओर) बाईं ओर सर्कल की ओर मुड़ना शुरू कर देता है। केवल या तो बाएं या दाएं से मुड़ने के बजाय यह "दर्पण नृत्य" शुरू करता है:

  1. यह नए फेसिंग की ओर घूमने लगता है
  2. फिर यह अचानक उसी कोण पर जाता है लेकिन दूसरी तरफ और घूमता रहता है

यह "मिररिंग" तब तक करता है जब तक कि वह लक्ष्य को न देख ले। क्या यह चतुर्भुज के साथ एक बात है, थप्पड़ मारना / झूठ बोलना या कुछ और?

EDIT1: जाहिरा तौर पर यह मुद्दा घूर्णन से उत्पन्न नहीं होता है। अधिक संभावना मुद्दा यह है कि चरित्र घूमते समय सामना की ओर बढ़ता है। सामना करने और लक्ष्य के बीच कोण को सीमित करने के रूप में, जब चरित्र को कम करने की अनुमति दी जाती है और कई बार घबराना / मिररिंग रोटेशन को समाप्त करता है।

यह निश्चित रूप से अधिक प्रश्न उठाता है कि चरित्र मुद्दों के बिना एक ही समय पर क्यों नहीं घूम सकता है? आंदोलन के लिए उपयोग किया जाने वाला कोड:

transform.Translate(Vector3.forward * runningSpeed/10f * Time.deltaTime);

क्या हर फ्रेम में 'लुकक्वाटर' अपडेट किया जा रहा है? यदि ऐसा है, तो मेरी धारणा यह होगी कि कुछ छोटी गलतियाँ एक प्रकार की घबराहट की ओर ले जाती हैं, जहाँ खिलाड़ी 'लुक-रोटेशन' को ओवरशूट करता है और इसलिए देखने की नई दिशा बस अन्य की 'सीधे पीछे की तरफ ... ।
स्टीवन स्टैडनिक

जवाबों:


5

3 डी अंतरिक्ष में प्रत्येक अभिविन्यास को 2 अलग-अलग इकाई चतुष्कोणों द्वारा दर्शाया जा सकता है, qऔर -q(घटक-वार नकारात्मक q)। उदाहरण के लिए 3x3 पहचान मैट्रिक्स द्वारा दर्शाया गया अभिविन्यास I2 बटेरों द्वारा दर्शाया जा सकता है:

 q:  { 0,  0,  0},  1
-q:  {-0, -0, -0}, -1

दोनों 3 डी अंतरिक्ष में एक ही अभिविन्यास का प्रतिनिधित्व करते हैं, उनका डॉट उत्पाद बिल्कुल है -1, उनमें से प्रत्येक दूसरे गोलार्ध में झूठ बोल रहा है, बिल्कुल हाइपरस्फियर के विपरीत किनारों पर।

जब आप थप्पड़ को घुमाने के लिए लंबे समय तक चाप लेते हैं, तो आप जो परिणाम देखते हैं, वह तब होता है जब 2 चतुर्धातुक के बीच एक ही गोलार्ध में झूठ नहीं बोलते हैं। अगर ऐसा होता है, तो बस उनमें से एक को नकारने से पहले नकार दें, फिर थप्पड़ को छोटा चाप लगेगा।

डॉट उत्पाद यह पता लगाने का एक आसान उपकरण है कि क्या होता है। यदि दोनों चतुष्कोणों का डॉट उत्पाद इससे कम है0 , तो वे एक ही गोलार्ध में नहीं रहते हैं। इसलिए अगर दोनों का डॉट प्रोडक्ट इससे कम है 0, तो घटक-वार दूसरे को कम करने से पहले दूसरे क्वाटर्नियन को नकार दें।


मुझे आश्चर्य है कि अगर मैंने आपको सही तरीके से समझा जैसे कि मैंने इसके साथ प्रयास किया if(Quaternion.Dot (lookQuaternion, startQuaternion) < 0) { startQuaternion = Quaternion.Inverse(startQuaternion); }लेकिन यह मुद्दा सही नहीं हुआ। खराब फॉर्मेटिंग के लिए क्षमा करें, मैं इस टिप्पणी अनुभाग को वश में नहीं कर सकता।
एसा

लगभग, लेकिन नहीं Inverse, वह एक अलग ऑपरेशन है Negateif(Quaternion.Dot (lookQuaternion, q) < 0) { q.x = -q.x; q.y = -q.y; q.z = -q.z; q.w = -q.w; }मैं C # का उपयोग नहीं करता हूं, लेकिन दीक्षाओं के लुक से ऐसा लगता है कि आप सीधे नेगेट-फंक्शन का भी उपयोग कर सकते हैं।
माईक सेमर

if(Quaternion.Dot (lookQuaternion, startQuaternion) < 0) { startQuaternion = Quaternion.Negate(startQuaternion); }
माईक सेमर

मुझे डर है कि ये समस्या ठीक नहीं हुई। मैंने सवाल अपडेट किया है।
एसा

हाँ, शायद विभिन्न बगों का मिश्रण है। अपने परीक्षण सेटअप को सरल बनाएं, एक समय में एक चीज़ का परीक्षण करें, एक ही समय में अनुवाद और रोटेशन नहीं। पहले सुनिश्चित करें कि एक काम करता है, फिर दूसरा, और फिर दोनों एक साथ। केवल पहले रोटेशन पर ध्यान दें, कुछ प्रसिद्ध अभिविन्यास मूल्यों का उपयोग करें, जैसे कि 170 डिग्री से शुरू, शून्य से नीचे जाना, देखें कि यह कहां गलत है और इसे यहां पोस्ट करें
Maik Semder

1

वैसे आपकी समस्या यह है क्योंकि आपके चतुर्भुज को बनाने वाले दो वैक्टर 180 डिग्री बनाते हैं, इसलिए यह प्रश्न पूछा जाना चाहिए कि प्रक्षेप करते समय यह किस चाप को लेना चाहिए? ऊपरी चाप या निचला एक ??

यह वही है जो मूल रूप से मिररिंग का कारण बनता है, हर बार जब आप इसे प्रक्षेपित कर रहे होते हैं तो यह कोण को बनाए रखते हुए दूसरे रास्ते पर ले जाता है।

इस लिंक के अनुसार ।

जब थीटा 180 डिग्री पर होता है तो परिणाम अपरिभाषित होता है क्योंकि घूमने के लिए कोई सबसे छोटी दिशा नहीं होती है, मुझे नहीं लगता कि यह स्थिति अभी तक सही तरीके से संभाली गई है, बेहतर होगा कि हम कुछ मनमाना अक्ष चुनें जो qa या qb के लिए सामान्य हो, I ऐसा करने के सर्वोत्तम तरीके के लिए किसी भी विचार की सराहना करें।

आपको जो करने की आवश्यकता है वह एक मध्यवर्ती चतुर्भुज के साथ आपके प्रारंभिक चतुर्भुज को प्रक्षेपित कर रहा है (यह निर्धारित करने के लिए कि कौन सा चाप लेना है) और वास्तविक लक्ष्य चतुर्भुज को जारी रखने के लिए मध्यवर्ती चतुर्भुज का उपयोग करने के लिए कब पहुंचा।


1

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

अब, एक गोले पर अधिकांश बिंदुओं के लिए, पास के बिंदु पास के महान मंडलियों के अनुरूप हैं; मिसाल के तौर पर, लॉस एंजिल्स और फीनिक्स के बीच विलय करने वाले मध्याह्न एक-दूसरे के काफी करीब हैं। लेकिन जब गंतव्य बिंदु मूल बिंदु का एंटिपोड होता है - प्रारंभ बिंदु के उत्तरी ध्रुव के दक्षिणी ध्रुव - उन दोनों के माध्यम से अब एक भी महान चक्र नहीं है, बल्कि सभी एक के माध्यम से महान वृत्त दूसरे के माध्यम से जाते हैं। क्या बुरा है, इसका मतलब है कि दक्षिणी ध्रुव के पास के बिंदु 'अधिकांश बिंदु' नहीं हैं; एक दूसरे के पास और दक्षिण ध्रुव के पास दोनों बिंदुओं में बेतहाशा विचलन हो सकता है।

मुझे संदेह है कि आप जो देख रहे हैं वह मध्याह्न में इस अस्थिरता की अभिव्यक्ति है - या दूसरे शब्दों में, प्रक्षेप चाप। जब लुक टारगेट सीधे चरित्र के पीछे होता है, तब चरित्र की स्थिति के आपके 'यूलर इंटीग्रेशन' में पहले-क्रम की अशुद्धि जैसी चीजें, और जिस तरह से लुक डायरेक्शन फ्रेम-टू-फ्रेम में परिवर्तन होता है, वह इन बेतहाशा नेतृत्व करने वाला है अलग-अलग प्रक्षेप एक फ्रेम से दूसरे में आते हैं, और यह 'स्टैगर' की ओर ले जाएगा जो आप देख रहे हैं।

जहाँ तक इसके साथ क्या करना है, सबसे अच्छी बात जो मन को भाती है, वह है हर फ्रेम में 'टारगेट' लुक डायरेक्शन को फिर से नहीं करना; इसके बजाय, कई फ़्रेमों की अवधि के लिए एक ही का उपयोग करें, फिर एक नए की गणना करें और इसका उपयोग कई फ़्रेमों आदि के लिए करें। यदि आवश्यक हो, तो आप कुछ फ़्रेमों की अवधि में एक लक्ष्य से अगले तक भी प्रक्षेपित कर सकते हैं ताकि गति की दिशा में अचानक परिवर्तन नहीं होता है।

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