2013-04-21 6 views
14

मैं वर्तमान में एक ओपनजीएल संचालित रेंडरर को 2 डी गेम इंजन में कार्यान्वित करने पर काम कर रहा हूं।2 डी दुनिया को स्क्रीन निर्देशांक में बदलने के लिए कैसे करें OpenGL

क्योंकि ओपनजीएल स्क्रीन समन्वय स्थान [-1,1] है, इसलिए मैं थोड़ा उलझन में हूं कि इसे सामान्य, कार्टेसियन 2 डी विश्व समन्वय प्रणाली के साथ कैसे इंटरफेस किया जाना चाहिए।

मान लें कि मेरी दुनिया में व्यूपोर्ट [-500, -500] [1200, 1200] है, जहां [0, 0] दुनिया की उत्पत्ति है। क्या मुझे केवल -1 और 1 के बीच समन्वय करने के लिए अनुवाद करने और स्केल करने की आवश्यकता है? या क्या रूपांतरण का कोई अन्य रूप है जिसे करने की आवश्यकता है?

आप कैसे गणना करते हैं कि स्क्रीन पर ऑब्जेक्ट्स कहां खींचना है जिसने आपके समन्वय प्रणाली में परिभाषित पदों को परिभाषित किया है?

मैं ग्लोथो के साथ और बिना किसी स्पष्टीकरण की सराहना करता हूं (इसलिए हम जेड अक्ष का भी परिप्रेक्ष्य प्रभावों के लिए उपयोग कर सकते हैं)।

उत्तर

13

सबसे पहले, ओपनजीएल एकाधिक समन्वय प्रणालियों का उपयोग करता है, इसलिए ओपनजीएल समन्वय प्रणाली नहीं है "। आप जो सामान्य संदर्भित कर रहे हैं वे सामान्यीकृत डिवाइस निर्देशांक (एनडीसी) हैं, जहां सभी तीन निर्देशांक सीमा [-1, 1] में हैं। विभिन्न समन्वय प्रणालियों और उनके नामों को here सेक्शन में बताया गया है, "9 .011 निर्देशांक कैसे परिवर्तित होते हैं? विभिन्न समन्वय रिक्त स्थान क्या हैं?"। 1)

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

आपने पूछा कि कैसे "स्क्रीन पर वस्तुओं को आकर्षित करने के लिए गणना करें"। आपको क्या करना है एक रूपांतरण (एक 4x4 मैट्रिक्स) परिभाषित करना है जो एक समन्वय प्रणाली से दूसरे में मानचित्र करता है। आपकी 2 डी दुनिया विश्व निर्देशांक में दी गई है, इसलिए आपको एक मैट्रिक्स को परिभाषित करने की आवश्यकता है जो विश्व समन्वयक को एनडीसी में बदलता है, यानी प्रक्षेपण मैट्रिक्स। अपने शेडर्स में आप बस अपने प्रक्षेपण मैट्रिक्स के साथ अपने चरम गुणा करें, और आपको एनडीसी मिलते हैं। glm::ortho/glOrtho ऐसे प्रोजेक्शन मैट्रिक्स की गणना करता है। परिप्रेक्ष्य प्रक्षेपण के लिए, यह स्पष्ट नहीं है कि आप क्या करना चाहते हैं, लेकिन आपको perspective और lookat ग्लैम में फ़ंक्शंस के साथ प्रयोग करना चाहिए।

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

यह भी ध्यान रखें कि आपने एक वर्ग निर्दिष्ट किया है, और आम तौर पर जो आप चाहते हैं वह नहीं है। मॉनीटर और अधिकांश खिड़कियां स्क्वायर नहीं हैं, इसलिए यदि आप उस स्क्वायर को एक सामान्य व्यूपोर्ट पर मैप करते हैं, तो आपको अपनी दुनिया का विकृत दृश्य मिल जाएगा। आपको व्यूपोर्ट के पहलू अनुपात (चौड़ाई: ऊंचाई) में कारक करने की आवश्यकता है। मैंने here को समझाने की कोशिश की है।


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

+0

यदि आप ऑर्थोग्राफिक प्रक्षेपण मैट्रिक्स का उपयोग करते हैं, तो दृश्य केवल 2 डी हो सकता है क्योंकि यह ज़ेड अक्ष को अनदेखा करता है, सही? ज्यादातर चीजों के लिए मैं यह ठीक कर रहा हूं, लेकिन मैं 2 डी दुनिया पर कम फ्लैट दृष्टिकोण बनाने के लिए जेड अक्ष का उपयोग करके प्रयोग करने में सक्षम होना चाहता हूं। तो आप ऑर्थो के बजाए परिप्रेक्ष्य के लिए रूपांतरण मैट्रिक्स को कैसे परिभाषित करते हैं? जीएल क्या काम करता है? – bgroenks

+0

1) नहीं, यह जेड अक्ष को अनदेखा नहीं करता है, यह सिर्फ उसी पिक्सेल पर एक ही एक्सई समन्वय के साथ सब कुछ प्रोजेक्ट करता है। लेकिन आप अभी भी गहराई से परीक्षण कर सकते हैं। 2) 'glm :: परिप्रेक्ष्य'। –

+0

आप glm :: परिप्रेक्ष्य का उपयोग कैसे करते हैं? यह 'gl_ModelViewProjectionMatrix' के साथ कैसे सहभागिता करता है? – bgroenks

1

प्रक्षेपण मैट्रिक्स पर glOrtho का उपयोग करें और फिर सामान्य रूप से ड्रा करें। आपके उदाहरण के लिए, मुझे लगता है कि आप glOrtho (0, 1000, 0, 3000, -1, 1) चाहते हैं जो आपको चौड़ाई में 1000 इकाइयों और ऊंचाई में 3000 इकाइयों को

0

अपने दृश्य को जो भी समन्वय प्रणाली में रखें चाहते हैं। मैं matrices आरंभ करने और गणित संचालन आदि करने के लिए glm (http://glm.g-truc.net/) का उपयोग करने की अनुशंसा करता हूं ताकि आपके पास शायद एक दृश्य ग्राफ इंजन हो, जहां आप अपनी 2 डी/3 डी दुनिया में सभी ऑब्जेक्ट्स प्रबंधित करते हैं। बस ग्लम में दृश्य और प्रक्षेपण सही स्थापित करें। दरअसल, आपको किसी भी ग्राफिक्स पाइपलाइन कार्यान्वयन के विवरण की आवश्यकता नहीं होनी चाहिए - इसलिए आपके गेम इंजन में एक खराब डिज़ाइन निर्णय हो सकता है।

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

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