2011-09-11 10 views
22

मैं ओपनजीएल/सी ++ में 2 डी मूल गेम इंजन लिख रहा हूं और साथ ही साथ सबकुछ सीख रहा हूं। मैं अभी भी शिखर और उनकी "स्थिति" को परिभाषित करने के बारे में उलझन में हूं। यही है, मैं अभी भी ओपनजीएल के कशेरुक-से-पिक्सल रूपांतरण तंत्र को समझने की कोशिश कर रहा हूं। क्या इसे संक्षिप्त रूप से समझाया जा सकता है या कोई व्यक्ति किसी लेख या कुछ को इंगित कर सकता है जो इसे समझाएगा। धन्यवाद!ओपनजीएल पिक्सेल में वर्टेक्स स्थिति को परिभाषित करता है

+1

एफवाईआई वर्टिसेस 'वर्टेक्स' का बहुवचन है। ओपनजीएल में, वर्टेक्स निर्देशांक को अंतिम स्क्रीन एक्स, वाई समन्वय पर पहुंचने के लिए मैट्रिस की एक श्रृंखला द्वारा गुणा किया जाता है। –

+1

हालांकि मुझे आपके प्रश्न का उत्तर पता है, मैं भी ओपनजीएल में नौसिखिया हूं, इसलिए मैं जवाब नहीं दूंगा कि मुझे कुछ तकनीकी रूप से सही नहीं कहना चाहिए। मैं आपको ओपनजीएल सुपरबेल पढ़ने की सलाह देता हूं। यह आपके लिए चीजों को साफ़ करेगा। यदि आप कुछ गणित से डरते नहीं हैं, तो मैं [इस ऑनलाइन पुस्तक] (http://www.arcsynthesis.org/gltut/) की सिफारिश करता हूं। –

+0

यह उत्तर देने का प्रयास नहीं है, लेकिन शायद स्पष्टीकरण में मदद करेगा। वेरटेक्स पदों में पिक्सेल पदों के साथ कुछ भी नहीं है जब तक कि आपके पास अपना व्यूपोर्ट/ट्रांसफॉर्म सेट अप * बस * सही न हो। वर्टिसिस अपनी इकाई इकाई में रहते हैं। जैसे यदि आपका कागज़ का टुकड़ा 10x10 है, तो यह कितना बड़ा है? रुको - 10x10 इंच, सेंटीमीटर, फीट, मील ...? –

उत्तर

26

यह मूलभूत ज्ञान है कि आपके पसंदीदा ओपनजीएल सीखने के संसाधन को आपको पहली चीजों में से एक के रूप में पढ़ाना चाहिए। लेकिन वैसे भी मानक ओपन पाइप लाइन इस प्रकार है:

  1. शीर्ष स्थान (कुछ वैश्विक समन्वय प्रणाली के संबंध में) वस्तु अंतरिक्ष (किसी वस्तु के लिए स्थानीय) विश्व अंतरिक्ष में से तब्दील हो जाता है। यह परिवर्तन बताता है कि आपकी ऑब्जेक्ट (जिस पर शिखर सम्बन्ध संबंधित है) दुनिया में स्थित है

  2. अब विश्व-स्थान की स्थिति कैमरा/दृश्य-स्थान में परिवर्तित हो गई है। यह परिवर्तन आभासी कैमरे की स्थिति और अभिविन्यास द्वारा निर्धारित किया जाता है जिसके द्वारा आप दृश्य देखते हैं। ओपनजीएल में इन दो परिवर्तनों को वास्तव में एक में जोड़ा जाता है, मॉडलव्यू मैट्रिक्स, जो सीधे आपके शिखर को ऑब्जेक्ट-स्पेस से देखने-स्थान में बदल देता है।

  3. अगला प्रक्षेपण परिवर्तन लागू किया गया है। जबकि मॉडलव्यू परिवर्तन में केवल एफ़िन ट्रांसफॉर्मेशन (रोटेशन, अनुवाद, स्केलिंग) शामिल होना चाहिए, प्रक्षेपण परिवर्तन एक परिप्रेक्ष्य हो सकता है, जो मूल रूप से वास्तविक परिप्रेक्ष्य दृश्य को महसूस करने के लिए वस्तुओं को विकृत करता है (दूर दूर वस्तुओं को छोटे से)। लेकिन 2 डी व्यू के मामले में यह शायद एक ऑर्थोग्राफिक प्रक्षेपण होगा, जो अनुवाद और स्केलिंग से ज्यादा कुछ नहीं करता है। प्रक्षेपण मैट्रिक्स द्वारा ओपनजीएल में यह परिवर्तन दर्शाया गया है।

  4. इन 3 (या 2) परिवर्तनों के बाद (और फिर डब्ल्यू घटक द्वारा परिप्रेक्ष्य विभाजन का पालन करने के बाद, जो वास्तव में परिप्रेक्ष्य विरूपण को समझता है, यदि कोई हो) तो आपके पास सामान्यीकृत डिवाइस निर्देशांक होते हैं। इसका मतलब है कि इन परिवर्तनों के बाद दृश्यमान वस्तुओं के निर्देशांक [-1,1] श्रेणी में होना चाहिए। इस सीमा के बाहर सबकुछ दूर हो गया है।

  5. एक अंतिम चरण में व्यूपोर्ट परिवर्तन [0,w]x[0,h]x[0,1] घन है, जो शिखर 'अपनी पिक्सेल निर्देशांक फ्रेमबफर में अंतिम स्थितियों और इसलिए कर रहे हैं (एक glViewport(0, w, 0, h) कॉल कल्पना करते हुए) में लागू किया जाता है और [-1,1] सीमा से निर्देशांक तब्दील कर रहे हैं।

एक शीर्ष शेडर का उपयोग कर, कदम 1 से 3 वास्तव में शेडर में किया जाता है और इसलिए आप की तरह किसी भी तरह से किया जा सकता है, लेकिन आम तौर पर एक इस मानक modelview के अनुरूप है - भी> प्रक्षेपण पाइपलाइन।

ध्यान में रखना मुख्य बात यह है कि मॉडलव्यू और प्रक्षेपण के बाद [-1,1] सीमा के बाहर निर्देशांक के साथ हर चरम को बदल दिया जाएगा। तो [-1,1] -box इन दो परिवर्तनों के बाद आपका दृश्य दृश्य निर्धारित करता है।

तो आपके प्रश्न से मुझे लगता है कि आप अपने वर्टेक्स निर्देशांक और परिवर्तनों के लिए पिक्सल की इकाइयों के साथ एक 2 डी समन्वय प्रणाली का उपयोग करना चाहते हैं? इस मामले में glOrtho(0.0, w, 0.0, h, -1.0, 1.0)w और h के साथ अपने व्यूपोर्ट के आयामों का उपयोग करके यह सबसे अच्छा किया जाता है। यह मूल रूप से व्यूपोर्ट रूपांतरण को काउंटर करता है और इसलिए [0,w]x[0,h]x[-1,1] -box से [-1,1] -box में अपने चरम को बदलता है, जो व्यूपोर्ट रूपांतरण तब [0,w]x[0,h]x[0,1] -box पर बदल जाता है।

ये उल्लेख किए बिना काफी सामान्य स्पष्टीकरण हैं कि वास्तविक परिवर्तन मैट्रिक्स-वेक्टर-गुणाओं द्वारा किए गए हैं और समरूप समन्वय के बारे में बात किए बिना, लेकिन उन्हें आवश्यक समझा जाना चाहिए था। यह documentation of gluProject आपको कुछ अंतर्दृष्टि भी दे सकता है, क्योंकि यह वास्तव में एक कशेरुक के लिए रूपांतरण पाइपलाइन मॉडल करता है। लेकिन इस प्रलेखन में वे वास्तव में v' = P x M x v चरण के बाद डब्ल्यू घटक (v" = v'/v'(3)) द्वारा विभाजन का उल्लेख करना भूल गए।

संपादित करें: epatel का जवाब है, जो परिवर्तन पाइप लाइन में थोड़ा और अधिक व्यावहारिक और विस्तृत बताते में first link को देखने के लिए मत भूलना।

-3

Google "opengl rendering पाइपलाइन" के लिए Google। पहले पांच लेख सभी अच्छे प्रदर्शन प्रदान करते हैं।

शिखर से पिक्सेल (वास्तव में, टुकड़े, लेकिन यदि आप सोचते हैं कि "पिक्सेल") रास्टराइजेशन चरण में है, तो आप बहुत दूर नहीं होंगे, जो सभी शीर्षकों को विश्व-निर्देशांक से बदल दिया गया है समन्वय स्क्रीन और क्लिप करने के लिए।

+5

कोई जवाब नहीं ... –

+0

@ आर्मेन: "क्या इसे संक्षिप्त रूप से समझाया जा सकता है या कोई व्यक्ति किसी लेख या कुछ को इंगित कर सकता है जो इसे समझाएगा।" क्या मैंने यह नहीं किया? –

+1

आपका मूल उत्तर जिसमें मेरी टिप्पणी का संदर्भ है, केवल आपके द्वारा संपादित किए गए उत्तर की पहली पंक्ति है। यह एक जवाब नहीं था। यह Google का उपयोग करने के लिए एक निर्देश था। –

11

इसे रूपांतरण कहा जाता है।

वर्टिसेस 3 डी निर्देशांक में सेट हैं जो व्यूपोर्ट निर्देशांक (आपकी विंडो दृश्य में) में परिवर्तित हो जाते हैं। यह परिवर्तन विभिन्न तरीकों से स्थापित किया जा सकता है। रूढ़िवादी परिवर्तन स्टार्टर के रूप में समझने के लिए सबसे आसान हो सकता है।

http://www.songho.ca/opengl/gl_transform.html

http://www.opengl.org/wiki/Vertex_Transformation

http://www.falloutsoftware.com/tutorials/gl/gl5.htm

+0

+1 पहले लिंक के लिए, यह मेरी व्याख्याओं की तुलना में अधिक विस्तृत और सटीक है। –

3

सबसे पहले यह जान लें कि ओपन नहीं मानक पिक्सेल निर्देशांक का उपयोग करता हो। मेरा मतलब है कि विशेष संकल्प के लिए, यानी। 800x600 आपके पास 0-79 9 या 1-800 रेंज में क्षैतिज निर्देशांक नहीं हैं। इसके बजाय आप -1 से 1 तक के निर्देशांक हैं, बाद में ग्राफिक कार्ड रास्टराइजिंग यूनिट को भेजें और उसके बाद विशेष रिज़ॉल्यूशन से मेल खाते हैं।

मैंने यहां एक कदम बढ़ाया - इससे पहले कि आपके पास मॉडलव्यूप्रोजेक्शन मैट्रिक्स (या कुछ साधारण मामलों में व्यूप्रोजेक्शन मैट्रिक्स) है, जो पहले से ही एक प्रोजेक्शन प्लेन का उपयोग करने वाले निर्देशांक डालेगा। इसका डिफ़ॉल्ट उपयोग एक कैमरा को कार्यान्वित करना है जो दुनिया के 3 डी स्पेस को परिवर्तित करता है (कैमरे को सही स्थिति में रखने और स्क्रीन प्लेन में 3 डी निर्देशांक कास्टिंग करने के लिए प्रक्षेपण के लिए देखें। मॉडलव्यूप्रोजेक्शन में यह एक मॉडल को दुनिया में सही स्थान पर रखने का भी कदम है)।

एक और मामला (और आप जो भी चाहते हैं उसे प्राप्त करने के लिए प्रोजेक्शन मैट्रिक्स का उपयोग कर सकते हैं) इन मैट्रिक्स का उपयोग किसी संकल्प को दूसरे में बदलने के लिए करना है।

और एक चाल है जिसकी आपको आवश्यकता होगी। यदि आप गंभीर जाना चाहते हैं तो आपको ओपनजीएल में मॉडल व्यूप्रोजेक्शन मैट्रिक्स और कैमरा के बारे में पढ़ना चाहिए। लेकिन अभी के लिए मैं आपको बता दूंगा कि उचित मैट्रिक्स के साथ आप स्टैंड -कृत -1: 1 रेंज के लिए अपनी समन्वय प्रणाली (यानी उपयोग 0-79 9 क्षैतिज और 0-59 9 वर्टिकल) का उपयोग कर सकते हैं। इस तरह आप नहीं देखेंगे कि अंतर्निहित ओपनजीएल एपीआई अपने -1 से 1 सिस्टम का उपयोग करता है।

इसे प्राप्त करने का सबसे आसान तरीका glOrtho फ़ंक्शन है। ; glMatrixMode (GL_PROJECTION) glLoadIdentity(): http://www.opengl.org/sdk/docs/man/xhtml/glOrtho.xml

यह उचित उपयोग के उदाहरण है: यहाँ प्रलेखन के लिए लिंक है glOrtho (0, 800, 600, 0, 0, 1) glMatrixMode (GL_MODELVIEW)

अब आप खुद modelView मैट्रिक्स यानी उपयोग कर सकते हैं। अनुवाद (चलती) वस्तुओं के लिए लेकिन अपने प्रक्षेपण उदाहरण को स्पर्श न करें। यह कोड किसी ड्राइंग कमांड से पहले निष्पादित किया जाना चाहिए। (यदि आप 3 डी ग्राफिक्स का उपयोग नहीं करेंगे तो वास्तव में ओपनएल शुरू करने के बाद हो सकता है)।

और यहाँ उदाहरण काम कर रहा है: http://nehe.gamedev.net/tutorial/2d_texture_font/18002/

बस के बजाय पाठ ड्राइंग के अपने आंकड़े आकर्षित। और एक और चीज है - choosen मैट्रिक्स के लिए glPushMatrix और glPopMatrix (इस उदाहरण प्रक्षेपण मैट्रिक्स में) - जब तक आप 2 डी प्रतिपादन के साथ 3 डी संयोजन नहीं करते हैं तब तक आप इसका उपयोग नहीं करेंगे।

और आप अभी भी मॉडल मैट्रिक्स (यानी दुनिया में कहीं भी टाइल रखने के लिए) का उपयोग कर सकते हैं और मैट्रिक्स (उदाहरण के लिए ज़ूमिंग देखने या दुनिया के माध्यम से स्क्रॉल करने के लिए) - इस मामले में आपकी दुनिया संकल्प से बड़ी हो सकती है और आप फसल कर सकते हैं सरल अनुवादों द्वारा देखें)

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

1

एमएसडीएन का एक अच्छा explanation है। यह डायरेक्टएक्स के मामले में हो सकता है लेकिन ओपनजीएल उतना ही कम है।

+1

लेकिन यह निश्चित रूप से ओपनजीएल के मैट्रिक्स-वेक्टर-उत्पादों के विपरीत अपने अजीब वेक्टर-मैट्रिक्स-उत्पादों के साथ शुरुआती भ्रमित करता है। –

+0

अच्छी तरह से वास्तव में निर्भर करता है .. यदि आप मैट्रिक्स और वेक्टर कक्षाओं को स्वयं लागू करते हैं तो वे दोनों समान हैं;) – Goz

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