2012-05-17 5 views
13

इस The LookAt target location doesn't matter if it is z = 0 or z = 1000 or -1000?ओपनजीएल के लुकएट फ़ंक्शन में यूपी वेक्टर वास्तव में क्या है?

से संबंधित है मैं

gluLookAt(512, 384, 2000, 
       512, 384, 0, 
       0.0f, 1.0f, 0.0f); 

की कोशिश की और सब कुछ ठीक काम करते हैं, और अब मैं 0.8 को 3 पंक्ति (उत्तर प्रदेश वेक्टर), पिछले नंबर बदलने:

gluLookAt(512, 384, 2000, 
       512, 384, 0, 
       0.0f, 1.0f, 0.8f); 

और यह बिल्कुल वही है ... अगले मैंने तीसरी पंक्ति को आजमाया और संशोधित किया, 0.8:

gluLookAt(512, 384, 2000, 
       512, 384, 0, 
       0.8f, 1.0f, 0.8f); 

अब दृश्य यह है कि यह 45 डिग्री बाईं ओर घूमता है। यह यूपी वेक्टर कैसे काम करता है?

उत्तर

27

ऊपर वेक्टर आंख और केंद्र वेक्टर gluLookAt को आपूर्ति के बीच एक क्रॉस उत्पाद बनाने के लिए प्रयोग किया जाता है।

iOS पर GLKit हेडर से, आप के रूप में कार्यान्वयन देख सकते हैं:

static __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ) 
{ 
    GLKVector3 ev = { eyeX, eyeY, eyeZ }; 
    GLKVector3 cv = { centerX, centerY, centerZ }; 
    GLKVector3 uv = { upX, upY, upZ }; 
    GLKVector3 n = GLKVector3Normalize(GLKVector3Add(ev, GLKVector3Negate(cv))); 
    GLKVector3 u = GLKVector3Normalize(GLKVector3CrossProduct(uv, n)); 
    GLKVector3 v = GLKVector3CrossProduct(n, u); 

    GLKMatrix4 m = { u.v[0], v.v[0], n.v[0], 0.0f, 
     u.v[1], v.v[1], n.v[1], 0.0f, 
     u.v[2], v.v[2], n.v[2], 0.0f, 
     GLKVector3DotProduct(GLKVector3Negate(u), ev), 
     GLKVector3DotProduct(GLKVector3Negate(v), ev), 
     GLKVector3DotProduct(GLKVector3Negate(n), ev), 
     1.0f }; 

    return m; 
} 

स्वीकार किए जाते हैं जवाब इस सवाल How do I use gluLookAt properly? में क्या हो रहा वेक्टर वास्तव में प्रभावों का अच्छा वर्णन प्रदान करता है।

(gluLookAt में "अप" वेक्टर के पीछे अंतर्ज्ञान सरल है: कुछ भी देखो। अब अपने सिर को 90 डिग्री झुकाएं। जहां आप नहीं बदले हैं, आप जिस दिशा को देख रहे हैं वह बदल नहीं है, लेकिन आपकी रेटिना में छवि स्पष्ट रूप से है। क्या अंतर है? जहां आपके सिर का शीर्ष इंगित कर रहा है। यह ऊपर वेक्टर है।)
15

ऊपर वेक्टर निर्धारित करता है कि कौन सी दिशा "ऊपर" है। इसके बारे में एक वीडियो कैमरा की तरह सोचें ... यदि आप कैमरा को "ठीक से" रखते हैं, तो कैमरे के केंद्र से कैमरे के केंद्र से ऊपर की ओर एक काल्पनिक रेखा एक वेक्टर (0,1,0) द्वारा प्रदर्शित की जा सकती है। । यदि आप दाईं ओर कैमरे को 45 डिग्री झुकाते हैं, तो कैमरा के केंद्र से कैमरे के केंद्र में जाने वाली काल्पनिक रेखा अब एक नए वेक्टर (1,1,0) द्वारा प्रदर्शित की जाएगी। यदि आप कैमरे को "बैक" थोड़ा सा झुकाते हैं, तो आपका "अप" वेक्टर अब (1,1,1) [या (1,1, -1) बन जाता है ... मुझे हमेशा जेड-अक्ष की ध्रुवीयता मिलती है उलट]।

तो, संक्षेप में, यूपी वेक्टर कैमरे के रोलिंग का वर्णन करता है कि कैमरे के अभिविन्यास में कौन सा बिंदु "ऊपर" है।

उम्मीद है कि मदद करता है। :) (टिप्पणी के अनुसार सारांश सही करने के लिए संपादित करें)

+0

_ "तो, संक्षेप में, यूपी वेक्टर कैमरा के पिच, यॉ और रोल का वर्णन करता है कि कैमरे के अभिविन्यास में कौन सा बिंदु" ऊपर "है।" _ गलत। ऊपर सिर्फ रोल है (कैमरे को देख रहे बिंदु से यौगिक और पिच को बाधित किया जा रहा है)। – Stan

+3

यह पुराना हो सकता है, लेकिन इसके लिए धन्यवाद, यह अब तक की पहली व्याख्या है जो मुझे समझ में आया है! –

2

यह ठीक तरह से काम करता है जैसे यह काम करता है।

कल्पना कीजिए कि आप अंतरिक्ष में किसी बिंदु पर हैं। और वे कल्पना करते हैं कि आप सीधे से -जेड दिशा में कुछ बिंदु 2000 इकाइयों को देख रहे हैं।

इन विशेषताओं के साथ संभावित कैमरों की एक अनंत संख्या है, लेकिन वे अलग-अलग "अप" दिशा होने पर पूरी तरह अलग हैं। तो अलग-अलग "ऊपर" दिशानिर्देश दृश्य की दिशा के चारों ओर एक अलग अभिविन्यास होने के अनुरूप हैं।

ऊपर वेक्टर वेक्टर दिशा है जो "अप" दिशा के साथ गठबंधन है जिसे आप कैमरे चाहते हैं। यही है, अगर आप अपने कैमरे के बिंदु से ऊपर वेक्टर खींचना चाहते थे, तो आप सीधे सीधी रेखा रेखा को इंगित करेंगे।

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

जब आप ऊपर की दिशा को गैर-शून्य जेड समन्वय देते हैं, तो यह अब आंशिक रूप से दृश्य दिशा (यानी: जेड अक्ष) में इंगित करता है। वह हिस्सा अंततः आपके द्वारा प्राप्त दिशा के लिए अप्रासंगिक है, इसलिए इसे अनदेखा किया जाता है। जब आप ऊपर की दिशा को एक गैर-शून्य एक्स समन्वय देते हैं, तो दृश्य दिशा में नहीं है, इसलिए यह महत्वपूर्ण है।

इसका मुद्दा यह है कि यदि आप व्यू लुक-ऑन या कैमरा मूल बिंदु बदलते हैं, तो आपको ऊपर की दिशा भी बदलनी नहीं है। जब तक आप ऊपर धुरी के साथ सीधे नहीं देख रहे हैं, तो आप ठीक हैं।

+0

अगर मैं सीधे एक कुर्सी पर बैठा हूं, तो मेरी आंखों के सामने एक आईपैड दाहिने हाथ रखो, तो मेरे सिर का मेरा ऊपर आकाश को इंगित कर रहा है, इसलिए '(0, 1, 0)' ... के बारे में अगर मैं इसे '(0, 0.00001, 1)' में बदलता हूं, तो इसका मतलब है कि मैं लगभग झूठ बोल रहा हूं, अब मेरे चेहरे और आंखें आसमान का सामना कर रही हैं ... तो अगर मैं ' 0, 1, 0) '? –

+2

@ जेरेमीएल: क्योंकि यदि आप अपने चेहरे और आंखों के साथ झूठ बोल रहे हैं, तो आप अब अपने आईपैड को नहीं देख पाएंगे। समस्या देखें? फ़ंक्शन को यह पता लगाना होगा कि कौन सी सबसे महत्वपूर्ण बाधाएं हैं। कैमरा स्थिति और लुक-ऑन स्थिति * जहां * आप देख रहे हैं, निर्णय लेने के मामले में ऊपर की दिशा को ट्रम्प करें। ऊपर की दिशा का उपयोग ओरिएंटेशन के लिए कड़ाई से किया जाता है * यह तय करने के बाद कि आप कहां देख रहे हैं। ऊपर की दिशा बदलने से आप कभी भी बदल नहीं पाएंगे, केवल * कैसे * आप उस दिशा में देख रहे हैं। –

+0

जो मैं कह रहा हूं वह है, यदि आप लगभग झूठ बोल रहे हैं, तो परिणाम बिल्कुल ठीक है, कुर्सी पर बैठे हुए सीधे –

4

gluLookAt के पहले दो पैरामीटर कैमरा स्थिति और कैमरा लक्ष्य हैं। केवल उन दोनों के साथ कैमरा पूरी तरह से बाध्य नहीं है। कहीं कैमरे को पकड़ने की कल्पना करो। आप लैंडस्केप चित्र लेने के लिए क्षैतिज रूप से कैमरे को पकड़ सकते हैं, या आप पोर्ट्रेट चित्र लेने के लिए कैमरे को लंबवत पकड़ सकते हैं। दोनों मामलों में, कैमरे की स्थिति और तस्वीर के विषय की स्थिति समान है। आप कैमरे को किसी भी कोण पर घुमा सकते हैं और उन दो मानों में बदलाव नहीं होता है। तीसरा पैरामीटर, अप वेक्टर, कैमरे के अभिविन्यास का चयन करता है।

संबंधित मुद्दे