2012-08-14 23 views
10

मैं ओपन सीखने गया है, और एक विषय है कि मुझे भ्रमित करने के लिए जारी दूर कतरन विमान है। जबकि मैं निकट क्लिपिंग विमान के पीछे तर्क को समझ सकता हूं, और साइड क्लिपिंग विमान (जिसका कोई वास्तविक प्रभाव कभी नहीं होता है क्योंकि उनके बाहर की वस्तुओं को कभी भी प्रस्तुत नहीं किया जाएगा), दूर क्लिपिंग विमान केवल एक परेशानी प्रतीत होता है।ओपनजीएल के पास अब तक का क्लिपिंग विमान क्यों है, और इससे निपटने के लिए कौन सी मुहावरे का उपयोग किया जाता है?

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

उत्तर

19

एकमात्र कारण गहराई परिशुद्धता है। चूंकि आपके पास गहराई बफर में सीमित संख्या में बिट्स हैं, इसलिए आप इसके साथ गहराई से सीमित मात्रा का प्रतिनिधित्व भी कर सकते हैं।

हालांकि, आप हवाई जहाज सेट कर सकते हैं करने के लिए असीम दूर: this देखें। यह गहराई बफर के साथ बहुत अच्छी तरह से काम नहीं करेगा - यदि आप दूर भ्रम है तो आप बहुत सारी कलाकृतियों को देखेंगे।

इसलिए चूंकि यह गहराई बफर के चारों ओर घूमता है, इसलिए जब तक आप इसका उपयोग नहीं करते हैं, तब तक आपको आगे की सामग्री से निपटने में कोई समस्या नहीं होगी। उदाहरण के लिए, एक आम तकनीक "स्लैब" में दृश्य प्रस्तुत करना है कि प्रत्येक आंतरिक रूप से गहराई बफर का आंतरिक रूप से उपयोग करता है (सभी स्लैब में सभी चीजों के लिए) लेकिन चित्रकार के एल्गोरिदम के कुछ रूप बाहरी रूप से (स्लैब के लिए, तो आप सबसे दूर तक आकर्षित करते हैं पहले)

+0

यह ध्यान देने योग्य हो सकता है कि निकटतम क्लिपिंग विमान को शून्य के करीब सेट करने से वही प्रभाव पड़ेगा जो दूर क्लिपिंग विमान बहुत दूर है। Http://www.opengl.org/archives/resources/faq/technical/depthbuffer.htm के मुताबिक मोटे तौर पर खोई गई बिट्स की संख्या लॉग 2 (दूर/पास) है। –

9

क्यों ओपन एक दूर कतरन विमान है?

क्योंकि कंप्यूटर परिमित हैं।

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

एक विकल्प (यदि आप किसी निश्चित दूरी से परे वस्तुओं को सही तरीके से गहराई से परीक्षण करने में तैयार हैं) glEnable(GL_DEPTH_CLAMP) के साथ गहराई से क्लैंपिंग चालू करना है। यह निकट और दूर के विमानों के खिलाफ क्लिपिंग को रोक देगा; यह सिर्फ इतना है कि [1, 1] रेंज के बाहर सामान्यीकृत जेड निर्देशांक वाले किसी भी टुकड़े को उस सीमा तक क्लैंप किया जाएगा। जैसा कि पहले संकेत दिया गया था, यह क्लैंप किए जा रहे टुकड़ों के बीच गहराई से परीक्षण को खराब करता है, लेकिन आम तौर पर उन वस्तुओं को दूर कर दिया जाता है।

0

यह सिर्फ "तथ्य" कि ओपन गहराई परीक्षण (सामान्यीकृत डिवाइस में निर्देशांक [-1,1]^3। अतिरिक्त स्केलिंग glViewport और glDepthRange के साथ) विंडो अंतरिक्ष निर्देशांक में प्रदर्शन किया था।

तो मेरे दृष्टिकोण से यह ओपनजीएल लाइब्रेरी के डिजाइन बिंदु में से एक है।


दृष्टिकोण में से एक इस ओपन विस्तार/ओपन मुख्य कार्यक्षमता https://www.opengl.org/registry/specs/ARB/depth_clamp.txt खत्म करने के लिए अगर यह आपके ओपन संस्करण में उपलब्ध है।


मैं वर्णन करना चाहता हूं कि परिप्रेक्ष्य प्रक्षेपण में "दूर क्लिपिंग विमान" के बारे में कुछ भी नहीं है।

3.1 परिप्रेक्ष्य प्रक्षेपण के लिए आपको प्रक्षेपण और विमान के केंद्र के रूप में बिंदु \ vec {c} सेट करने की आवश्यकता है जिस पर प्रक्षेपण किया जाएगा। आइए इसे छवि प्लेन टी: (\ vec {r} - \ vec {r_0}, \ vec {n})

3.2 मान लीजिए कि अनुमानित विमान टी विभाजित मध्यस्थ बिंदु \ vec {r} और \ vec { सी} प्रक्षेपण के केंद्र। अन्य मामले में \ vec {r} और \ vec {c} एक हेफ़-स्पेस में हैं और बिंदु \ vec {r} को त्याग दिया जाना चाहिए।

3.4 प्रक्षेपण के विचार चौराहे को मिल रहा है \ vec {मैं} विमान टी के साथ \ vec {मैं} = (1-टी) \ vec {c} + t \ vec {r}

3.5 यह है (\ vec {मैं} - \ vec {r_0}, \ vec {n}) = 0

=>

((1-टी) \ vec {c} + t \ vec {r} - \ vec {r_0}, \ vec {n}) = 0

=>

(\ vec {c } + टी (\ vec {r} - \ vec {c}) - \ vec {r_0}, \ vec {n}) = 0

3.6। "3.5" व्युत्पन्न टी से "3.4" में विभाजित किया जा सकता है और आपको विमान टी

3.7 में प्रक्षेपण प्राप्त होगा। प्रक्षेपण के बाद आप विमान में झूठ बोलेंगे। लेकिन अगर मान लें कि छवि विमान ओएक्सवाई विमान के समानांतर है, तो मैं प्रक्षेपण के बाद बिंदु के लिए मूल "गहराई" का उपयोग करने का सुझाव दे सकता हूं।

इसलिए ज्यामिति बिंदु से यह संभव है कि दूरदराज के विमान का उपयोग न करें। साथ ही [-1,1]^3 मॉडल का बिल्कुल उपयोग नहीं करना है।

पेज। मुझे नहीं पता कि कैसे लेटेक्स सूत्रों को सही तरीके से टाइप करना है, s.t. वे प्रस्तुत किया जाएगा।