3 डी कैमरा रोटेशन


9

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

इस विषय ने जो सबसे अधिक भ्रमित किया है वह यह है कि हर कोई सम्मेलनों या नियमों के एक अलग सेट का उपयोग करता है, और उनके जवाब उनके स्वयं के सम्मेलनों पर आधारित होते हैं बिना यह परिभाषित किए कि वे क्या हैं।

तो यहां उन सम्मेलनों का सेट है जो मैंने इस आधार पर बनाए हैं कि यह सबसे आम और तार्किक है:

  1. अक्ष के लिए दाहिना हाथ नियम।
  2. पॉजिटिव Y ऊपर है, पॉजिटिव Z दर्शक की तरफ है, पॉजिटिव X दाईं ओर है।
  3. रो मेजर मैट्रिक्स, जब shaders को भेजा जाता है।
    • पिच: एक्स अक्ष के बारे में रोटेशन
    • Yaw: y अक्ष के बारे में रोटेशन
    • रोल: z अक्ष के बारे में रोटेशन
  4. रोटेशन का क्रम: रोल, पिच, यव (क्या यह सही है? क्या कोई इस पर मेरी जांच कर सकता है?)
  5. सकारात्मक रोटेशन मान, एक धुरी के सकारात्मक अंत से नीचे देख रहे हैं, दक्षिणावर्त रोटेशन का परिणाम है।
  6. सभी अक्ष पर 0 रोटेशन के लिए डिफ़ॉल्ट दिशा नकारात्मक वाई की ओर इशारा करते हुए एक वेक्टर है।

.. उन सम्मेलनों को दिया (हर तरह से मुझे सही करें अगर वे गलत हैं!), एक कैसे होता है:

  • एक LookAt फ़ंक्शन लिखें? (लुक (वेक्टर पोजिशन, वेक्टर आईफोकस, वेक्टर अप))
  • एक घूर्णन मैट्रिक्स की गणना करें। (रोटेशन (x, y, z))

मैंने कम से कम पिछले 3 सप्ताह में इन दोनों प्रश्नों के उत्तर देने की कोशिश की है, मैंने अपने LookAt & Rotation Matrix फ़ंक्शन को कम से कम 30 बार लिखा है, मैंने दर्जनों विधियों का परीक्षण किया है और उस सामग्री के माध्यम से पढ़ा है जिसे मैंने देखा है सैकड़ों वेबसाइटों और पढ़े गए कई सवालों के जवाब, अन्य लोगों के कोड की नकल की, और मैंने अब तक जो कुछ भी नहीं किया है, उसने काम किया है, सब कुछ गलत परिणाम उत्पन्न किया है। जिनमें से कुछ ने कुछ प्रफुल्लित करने वाले विचित्र उत्पादन किए हैं जो सही रोटेशन के करीब भी नहीं हैं।

मैं पिछली रात के अपवाद के साथ हर रात इस पर काम कर रहा था क्योंकि मैं बार-बार असफलता से इतना निराश हो रहा था कि मुझे रुकना पड़ा और ब्रेक लेना पड़ा।

कृपया, बस मुझे बताएं कि सही तरीका क्या है इसलिए मैं उससे पीछे की ओर काम कर सकता हूं और यह पता लगा सकता हूं कि यह कैसे काम करता है, मुझे सिर्फ सही उत्तर नहीं मिल रहा है और यह मुझे थोड़ा पागल बना रहा है!

मैं जावा में लिख रहा हूं, लेकिन मैं किसी भी भाषा में लिखा कोड ले लूंगा, मेरे 3 डी रेंडरिंग कोड में से अधिकांश वास्तव में काफी शानदार ढंग से काम कर रहा है, यह सिर्फ वह गणित है जिसे मैं समझ नहीं सकता।

अद्यतन: हल

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

मैंने फिर से पिच / yaw / roll variables के आधार पर एक घूमने वाला मैट्रिक्स बनाने की कोशिश की और यह फिर से विफल लगने लगा, लेकिन मैंने फ्रीलान्स कैमरे के लिए euler कोणों का उपयोग करने का प्रयास करने का निर्णय लिया है क्योंकि यह बीमार के लिए अनुकूल प्रतीत होता है भूमिका, इसके बजाय मैं एक चतुष्कोणीय वर्ग बनाने जा रहा हूं, हो सकता है कि उस रास्ते से नीचे जाने में बेहतर भाग्य हो, अन्यथा मैं गोलाकार निर्देशांक के रूप में पिच / यॉ का उपयोग करने का सहारा लूंगा और रोटेशन के लिए नए कामकाजी लुकएट फ़ंक्शन पर भरोसा करूंगा।

अगर किसी और को भी इसी तरह की समस्या का सामना करना पड़ रहा है और मुझसे कोई सवाल पूछना चाहता है, तो बेझिझक।

कम से कम मैं अब और नहीं फँसा हूँ, मदद के लिए धन्यवाद!


क्या आपने अपनी समस्या का समाधान किया, मुझे भी इसी तरह की समस्या का सामना करना पड़ा, क्या आप कृपया पूछ सकते हैं कि इसे कैसे हल किया जाए? धन्यवाद!
xiao xiao

जवाबों:


15

आप जो खोज रहे हैं वह इस बहुत अच्छे स्पष्टीकरण में पाया जा सकता है: http://www.songho.ca/opengl/gl_transform.html

लेकिन जब से मैंने इसे बिना हाथ पकड़े भ्रमित करने का प्रयास किया, मैं इसे यहाँ समझाने की कोशिश करूँगा।

इस बिंदु पर आपको 5 समन्वय प्रणालियों पर विचार करने की आवश्यकता है और वे एक दूसरे से कैसे संबंधित हैं। ये विंडो निर्देशांक हैं, सामान्यीकृत डिवाइस निर्देशांक, आंख निर्देशांक, विश्व निर्देशांक और ऑब्जेक्ट निर्देशांक हैं।

खिड़की के निर्देशांक को आपकी स्क्रीन पर "भौतिक" पिक्सेल के रूप में देखा जा सकता है। वे निर्देशांक हैं जो विंडोिंग सिस्टम को संदर्भित करता है और यदि आप अपने मॉनिटर के मूल रिज़ॉल्यूशन में काम करते हैं, तो ये वास्तव में व्यक्तिगत पिक्सेल हैं। विंडो समन्वय प्रणाली 2D पूर्णांक हैं और आपकी विंडो के सापेक्ष हैं। यहाँ x + को बाएँ और y + को बाएँ बाएँ कोने पर मूल के साथ नीचे रखा गया है। जब आप उदाहरण के लिए कॉल करते हैं तो आपका इनसे सामना होता है glViewport

दूसरा सेट सामान्यीकृत डिवाइस निर्देशांक हैं। ये सक्रिय दृश्य पोर्ट द्वारा अंतरिक्ष सेटअप को संदर्भित करते हैं। दृश्य पोर्ट का दृश्य क्षेत्र -1 से +1 तक जाता है और इस तरह केंद्र में उत्पत्ति होती है। X + शेष है और y + ऊपर है। आपके पास सीन का z + "आउट" है। यह आप 1 में वर्णित है।

आपके पास कोई नियंत्रण नहीं है कि आप सामान्यीकृत डिवाइस से खिड़की के निर्देशांक से कैसे समन्वयित करते हैं, यह आपके लिए अंतर्निहित रूप से किया जाता है। एकमात्र नियंत्रण आपके पास glViewportया इसी तरह का है।

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

अगली आँख समन्वय है। यह दुनिया है जैसा कि कैमरे से देखा जाता है। नतीजतन मूल कैमरे में है और डिवाइस के निर्देशांक के समान धुरी के उपद्रव लागू होते हैं।

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

अंत में आपके पास विश्व समन्वय प्रणाली है। यह समन्वय प्रणाली है जिसमें आपकी दुनिया को परिभाषित किया गया है और आपका कैमरा इस दुनिया का हिस्सा है। यहां यह ध्यान रखना महत्वपूर्ण है कि अक्ष अभिविन्यास वैसे ही है जैसे आप उन्हें परिभाषित करते हैं । यदि आप z + को ऊपर से पसंद करते हैं, तो यह पूरी तरह से ठीक है।

दुनिया के निर्देशांक से आंखों के समन्वय के लिए आप व्यू मैट्रिक्स को परिभाषित करते हैं। ऐसा कुछ के साथ किया जा सकता है lookAt। यह मैट्रिक्स जो करता है वह दुनिया को "स्थानांतरित" करता है ताकि कैमरा मूल पर हो और z- अक्ष नीचे देख रहा हो।

देखने के मैट्रिक्स की गणना आश्चर्यजनक रूप से सरल है, आपको कैमरे के परिवर्तन की आवश्यकता है। आपको मूल रूप से निम्नलिखित मैट्रिक्स तैयार करने की आवश्यकता है:

M=x[1]y[1]z[1]p[1]x[2]y[2]z[2]p[2]x[3]y[3]z[3]p[3]0001

X, y और z वैक्टर सीधे कैमरे से लिए जा सकते हैं। देखने के मामले में आप उन्हें लक्ष्य, आंख (केंद्र) और मूल्यों से प्राप्त करेंगे। इस तरह:

z=nआरएलमैंz(y-टीआरजीटी)एक्स=nआरएलमैंz(यूपी×z)y=zएक्स

लेकिन अगर आप इन मूल्यों को सिर्फ अपने चारों ओर झूठ बोल रहे हैं तो वे उन्हें ले जा सकते हैं।

पी मिलना थोड़ा और मुश्किल है। यह दुनिया के निर्देशांक में स्थिति नहीं है, लेकिन कैमरा निर्देशांक में स्थिति है। यहां एक सरल समाधान दो मैट्रिक्स को शुरू करना है, एक केवल x, y और z के साथ और दूसरा एक -eye के साथ और उन्हें एक साथ गुणा करें। परिणाम दृश्य मैट्रिक्स है।

यह कोड में कैसे दिख सकता है:

mat4 lookat(vec3 eye, vec3 target, vec3 up)
{
    vec3 zaxis = normalize(eye - target);    
    vec3 xaxis = normalize(cross(up, zaxis));
    vec3 yaxis = cross(zaxis, xaxis);     

    mat4 orientation(
       xaxis[0], yaxis[0], zaxis[0], 0,
       xaxis[1], yaxis[1], zaxis[1], 0,
       xaxis[2], yaxis[2], zaxis[2], 0,
         0,       0,       0,     1);

    mat4 translation(
              1,       0,       0, 0,
              0,       1,       0, 0, 
              0,       0,       1, 0,
        -eye[0], -eye[1], -eye[2], 1);

    return orientation * translation;
}

पूरा कोड

और अंत में पूर्णता के लिए, आपके पास ऑब्जेक्ट कोऑर्डिनेट सिस्टम भी है। यह समन्वय प्रणाली है जिसमें मेषों को संग्रहीत किया जाता है। मॉडल मैट्रिक्स की सहायता से मेष निर्देशांक को विश्व समन्वय प्रणाली में परिवर्तित किया जाता है। व्यवहार में मॉडल और दृश्य मैट्रिक्स तथाकथित मॉडल-व्यू मैट्रिक्स में संयुक्त होते हैं।


1
अगर मैं इस उत्तर को सौ बार वोट कर सका तो मैं करूंगा। एक पूरी तरह से और पूर्ण उत्तर के लिए धन्यवाद, सब कुछ जिसे मैं उलझन में था और कोड और लिंक की आपूर्ति कर रहा था! मैंने सारा दिन इस विषय पर गणित की किताबें पढ़ने और अपने उत्तर और उदाहरण कोड और लिंक किए गए पेज के साथ बिताया है, अगर यह मेरे लिए यह पता लगाने के लिए पर्याप्त नहीं है तो मुझे अब छोड़ देना चाहिए। अगर मैं कोड के उस अंतिम नमूने में सिर्फ एक स्पष्टीकरण के लिए कह सकता हूं, तो क्या मैं यह कहने में सही होगा कि वे कॉलम कॉलम प्रमुख क्रम में हैं और ऊपर वाला पंक्ति में प्रमुख है?
ग्रैडी

यह थोड़ा भ्रमित है, मैट्रिक्स स्तंभ प्रमुख हैं, लेकिन स्तंभ पंक्ति में है। इसलिए वास्तविक गणित को उस कोड को मैप करने के लिए जिसे आपको मैट्रिक्स को ट्रांसपोज़ करना है। देखें github.com/rioki/glm/blob/master/src/matrix.h#l72 यह नक्शे वास्तव में ओपन करने के लिए हैं और यह कैसे उपयोग करने पर होगा float[16]
रीओकी

आह, मैंने ऐसा सोचा था लेकिन सिर्फ यकीन करना चाहता था, फिर से धन्यवाद! आप एक बड़ी मदद रहे हैं, मैं वास्तव में इसकी सराहना करता हूं।
ग्रैडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.