2013-04-25 9 views
20
में वस्तु, दुनिया, कैमरा और प्रक्षेपण रिक्त स्थान

मैं ओपन में रिक्त स्थान बनाने को समझने के लिए कोशिश कर रहा हूँ:ओपन

  1. वस्तु अंतरिक्ष

  2. विश्व अंतरिक्ष

  3. कैमरा अंतरिक्ष

  4. प्रोजेक्शन स्पेस


क्या इन चरणों की मेरी समझ सही है?

  1. "घन" कार्तीय निर्देशांक प्रणाली के केंद्र में कोने निर्देशांक टाइप करके बनाया जा रहा है, सीधे कार्यक्रम के अंदर।

  2. निर्देशांक "दुनिया" के अंदर निर्देशांक में परिवर्तित हो जाते हैं, जिसका अर्थ है कि इसे स्क्रीन पर किसी भी स्थान पर ले जाना।

अच्छा, वास्तव में मैं चाहता हूं कि आप उन दो शर्तों की मेरी समझ जांचें।


अब, मैं ब्लैक स्क्रीन पर एक त्रिकोण बना रहा हूं। ओपनजीएल कोड इन रिक्त स्थानों पर कैसे फिट बैठता है?

यह डिफ़ॉल्ट रूप से GL_MODELVIEW ध्वज पर काम करता है, लेकिन यह दूसरा चरण - विश्व स्थान है। क्या इसका मतलब है कि glVertex3f() ऑब्जेक्ट स्पेस में त्रिकोण बनाता है?

विश्व अंतरिक्ष हिस्सा कहां है?


इसके अलावा, मैंने पढ़ा है कि अंतिम दो रिक्त स्थान ओपनजीएल पाइपलाइन (या जिसे भी कहा जाता है) का हिस्सा नहीं हैं। हालांकि, ओपन ऐसे GL_PROJECTION के रूप में झंडे, उदाहरण के लिए शामिल हैं:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glViewport(0, 0, w, h); // w - width, h - height 
gluPerspective(45, ratio, 1, 100); // radio = w/h 
glMatrixMode(GL_MODELVIEW); 

इस कोड क्या करता है? यह परिप्रेक्ष्य सेट करता है। क्या यह जेड अक्ष बनाता है? लेकिन क्या यह पहले से ही ऑब्जेक्ट स्पेस हिस्सा नहीं है?

+2

मुझे आशा है कि आप वास्तव में ऑब्जेक्ट ज्यामिति में टाइप नहीं करेंगे (बहुत सरल लोगों को छोड़कर)। आपको उन्हें एक फाइल से लोड करना चाहिए। – datenwolf

उत्तर

35

1) ऑब्जेक्ट स्पेस ऑब्जेक्ट के मूल के सापेक्ष ऑब्जेक्ट के शिखर है। एक 1x1x1 घन के मामले में, अपने कोने होगा: जहां किसी चीज़ अपनी दुनिया में है

(0.5, 0.5, 0.5) 
(-0.5, 0.5, 0.5) 
(0.5, -0.5, 0.5) 
(-0.5, -0.5, 0.5) 

आदि

2) विश्व जगह नहीं है। यदि आप यह क्यूब (15, 10) पर होना चाहते हैं, तो आप एक अनुवाद मैट्रिक्स बनायेंगे, जब प्रत्येक चरम के साथ गुणा किया जाता है, तो (15, 10) के आसपास आपके शिखर को केंद्रित करेगा। उदाहरण के लिए, पहला चरम (15.5, 10.5, 0.5) बन जाएगा। वस्तु से विश्व अंतरिक्ष में जाने के लिए मैट्रिक्स को "मॉडल" मैट्रिक्स कहा जाता है।

3) आई स्पेस (कभी-कभी कैमरा स्पेस कहा जाता है) दर्शक के स्थान से संबंधित दुनिया है।चूंकि यह एक मैट्रिक्स होना चाहिए क्योंकि प्रत्येक चरम सीमा से गुणा किया जाता है, यह तकनीकी रूप से कैमरे के अभिविन्यास के विपरीत है। यही है, अगर आप (0, 0, -10) पर कैमरा चाहते हैं, तो आपका "व्यू" मैट्रिक्स (0, 0, 10) का अनुवाद होना चाहिए। इस तरह दुनिया में सभी वस्तुओं को आगे 10 इकाइयां हैं, ऐसा लगता है कि आप पिछली 10 इकाइयां हैं।

4) प्रक्षेपण स्थान यह है कि हम एक दृश्य के लिए एक सही परिप्रेक्ष्य कैसे लागू करते हैं (माना जाता है कि आप एक ऑर्थोग्राफिक प्रक्षेपण का उपयोग नहीं कर रहे हैं)। यह लगभग हमेशा एक निराशा द्वारा प्रतिनिधित्व किया जाता है, और this article बता सकता है कि मैं इससे बेहतर कर सकता हूं। अनिवार्य रूप से आप एक और skewed अंतरिक्ष पर 3 डी अंतरिक्ष मैपिंग कर रहे हैं।

ओपनजीएल तब क्लिप स्पेस और स्क्रीन स्पेस को संभालता है।


यह डिफ़ॉल्ट रूप से GL_MODELVIEW झंडे पर काम करता है, लेकिन यह है कि दूसरे चरण है - दुनिया अंतरिक्ष। क्या इसका मतलब है कि glVertex3f() ऑब्जेक्ट स्पेस में त्रिकोण बनाता है?

आप वस्तु अंतरिक्ष हमेशा में glVertex3f() साथ कोने की स्थापना की। (यह वास्तव में यह करने के लिए एक बहुत पुरानी और धीमी गति से रास्ता है, लेकिन वास्तव में इस सवाल की बात नहीं है)

जब आप GL_MODELVIEW निर्धारित करते हैं, यह केवल मॉडल मैट्रिक्स (जो glLoadMatrix साथ हेरफेर किया जा सकता बदल रहा है, glTranslate, glRotate , glScale, आदि)।


लाइन लाइन द्वारा आपके कोड का टुकड़ा निम्नलिखित कार्य कर रही:

  1. सभी परिवर्तनों अब प्रक्षेपण मैट्रिक्स को प्रभावित करने दिया जाएगा।
  2. पुराने प्रक्षेपण मैट्रिक्स को साफ़ करें और पहचान मैट्रिक्स के साथ इसे प्रतिस्थापित करें।
  3. संपूर्ण स्क्रीन को व्यूपोर्ट के रूप में उपयोग करें।
  4. डब्ल्यू/एच के एक पहलू अनुपात के साथ 45 डिग्री ऊर्ध्वाधर क्षेत्र दृश्य के साथ प्रक्षेपण मैट्रिक्स को सेट करें, निकट-क्लिप विमान 1 इकाई दूर, और दूर-दराज के विमान 100 इकाइयां दूर करें।
  5. सभी परिवर्तन अब मॉडलव्यू मैट्रिक्स को फिर से प्रभावित कर रहे हैं।

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


इसके अलावा एक साइड नोट, आप वास्तव में पुराने ओपनजीएल (1 99 2 पुराने) का उपयोग कर रहे हैं। GlTranslate, आदि बहुत समय पहले बहिष्कृत थे और अब एपीआई से हटा दिए गए हैं। एकमात्र कारण आप अभी भी उनका उपयोग कर सकते हैं क्योंकि ड्राइवर उन्हें संगतता के लिए वहां रखते हैं। मैं आपको आधुनिक (3.0+) ओपनजीएल का उपयोग करने की सलाह दूंगा। आधुनिक ग्राफिक्स पाइपलाइन तत्काल मोड (ग्लोबिन, ग्लवटेक्स, ग्लेंड) की तुलना में तीव्रता के कई आदेश हैं।