मुझे क्लिपिंग वर्थ को कैसे संभालना चाहिए जो निकट क्लिप प्लेन की तुलना में आंख के करीब है?


13

मैं अपना स्वयं का 3D इंजन जावास्क्रिप्ट में रोल कर रहा हूं, और केवल कैनवास ड्राइंग का उपयोग कर रहा हूं, कोई WebGL नहीं। यह एक और Minecraft क्लोन है; मुझे बक्से से प्यार है, मुझे जज मत करो।

अब तक, एक चीज को छोड़कर, सब कुछ आश्चर्यजनक रूप से काम करता है: 3 डी में, जब कुछ कोने निकट की कतरन वाले विमान के पीछे जाते हैं, तो स्क्रीन पर उनका प्रक्षेपण अजीब हो जाता है (एक विमान का पता लगाने के लिए उपयोग किए जाने वाले अन्य कोने सामने हैं)।

मैंने इन बिंदुओं को क्लिप करने की कोशिश की, लेकिन फिर मैं उन सतहों को गर्त में देख सकता हूं जो इन कोने का उपयोग करते हैं। WebGL / OpenGL में ग्राफिक्स कार्ड इन बिंदुओं का ध्यान रखता है और विमान को सही तरीके से प्रस्तुत किया जाता है, लेकिन मेरे पास हार्डवेयर तक पहुंच नहीं है इसलिए मुझे इसे स्वयं कोड करना होगा।

मुझे यकीन नहीं है कि इसे क्या बनाना है, वर्तमान में जो आखिरी चीज दिमाग में आई है वह खिलाड़ी के पास क्लिपिंग प्लेन के पीछे के बिंदुओं के प्रक्षेपण को उल्टा करना है, जो तर्कसंगत लगता है क्योंकि मुझे एक स्क्रीन पर एक बिंदु को प्रोजेक्ट करना होगा जो सामने है शिखर के।

यहाँ मेरे विचार हैं:

यहाँ छवि विवरण दर्ज करें

यह देखने के लिए कि क्या होता है:

यहाँ छवि विवरण दर्ज करें

दूरी से ब्लू बॉक्स पूरी तरह से अच्छी तरह से प्रस्तुत करता है।

यहाँ छवि विवरण दर्ज करें

जब कुछ कोने खिलाड़ी के कतरन वाले विमान के पीछे जाते हैं तो मैं उल्टा प्रक्षेपण करता हूं, लेकिन यह सही नहीं लगता है:

focalLength *= -1;
2d.x = x*focalLength/z;
2d.y = y*focalLength/z;

ध्यान दें कि पीछे का ग्रे बॉक्स पूरी तरह से हटा दिया गया है क्योंकि इसके चेहरे को खींचने के लिए उपयोग किए गए सभी कोने खिलाड़ी के पीछे हैं।

यहाँ छवि विवरण दर्ज करें

ऊपर या नीचे देखने पर यही होता है।

मुझे नहीं पता कि इसके पीछे क्या गणित है, मैं उम्मीद कर रहा हूं कि किसी को पहले ही समस्या का सामना करना पड़ा हो और वह मेरी मदद कर सके।


1
यदि अंक पास क्लिप प्लेन की तुलना में आंख के करीब हैं, तो उन्हें क्लिप किया जाना चाहिए - और यह वास्तव में आपको ऑब्जेक्ट के माध्यम से "देखने" दे सकता है। यह विशिष्ट व्यवहार है; टक्कर सामान्य रूप से उस विशेष दृश्य विरूपण साक्ष्य को रोकता है। क्या आपके क्लिपिंग समाधान के साथ केवल एक चीज गलत थी?

@JoshPetrie: मैं समझता हूं कि अंकों को क्लिप किया जाना चाहिए, लेकिन अगर मैं ऐसा करूं तो पूरा वर्ग एक या दो चक्कर लगाकर गायब हो जाएगा, जिसके द्वारा ड्राइंग रूट पास करना होगा (2d में) गायब है और खिलाड़ी देख सकेगा उस वर्ग के माध्यम से। मैं उन्हें कैनवास के "बाहर" (प्रक्षेपण पर) होना चाहूंगा ताकि वर्ग अभी भी खींचा जा सके। मुझे यकीन नहीं है अगर मैं पर्याप्त स्पष्ट हूँ।
सोलनॉइड

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

जो आप कह रहे हैं वह समझ में आता है, पुनर्निर्माण में बहुत अधिक समय लगता है इसलिए यह समाधान नहीं है। मुझे उम्मीद थी कि 2 डी प्लेन पर उस वर्टिक्स को खींचने का एक तरीका था जो खिलाड़ी के पीछे था इसलिए lineTo(x,y)फ़ंक्शन को अभी भी बुलाया जा सकता है, केवल मुझे नहीं पता कि यह कैसे व्यवहार करता है ... यह एक विचित्र आयाम है, मैं सहमत हूं।
सोलेनोइड

इस ट्यूटोरियल पर एक नज़र डालें , यह बताता है कि अलग-अलग त्रिकोणों की कतरन की गणना कैसे की जाती है, और वस्तुओं को समग्र रूप से
ѕняѕ иιиgнι

जवाबों:


1

निकट कतरन विमान का उद्देश्य यह है कि यह एक कतरन विमान है । एक क्लिपिंग प्लेन के बाहर के त्रिकोणों को काट दिया जाता है : टुकड़ों में काट दिया जाता है ताकि जो भी टुकड़ा बचा है वह क्लिपिंग क्षेत्र के भीतर हो।

आप चाहें तो निकट क्लिप को अनदेखा करने का प्रयास कर सकते हैं। वास्तव में ओपनजीएल और डी 3 डी के पास पूरी तरह से विमान की कतरन के पास बंद होने के तरीके हैं (हालांकि गहराई बफर में अभी भी न्यूनतम निकट मूल्य है)। समस्या क्लिप के पास नहीं है।

समस्या कैमरे के पीछे होने वाले वर्टिकल के साथ है ।

आप उन त्रिकोणों को प्रस्तुत नहीं कर सकते जो कैमरे के पीछे हैं। एक परिप्रेक्ष्य प्रक्षेपण के साथ नहीं। इस तरह के त्रिकोण परिप्रेक्ष्य के पीछे गणित के तहत कोई मतलब नहीं है। इसके अलावा, वे फ्रुम से बाहर भी हैं।

कतरन के पास बंद होने से एक निराशा एक पिरामिड में बदल जाती है। पिरामिड बिंदु पर रुक जाता है क्योंकि पिरामिड के चारों ओर के सभी बिंदुओं के पीछे बिंदु होते हैं। तो कैमरे के पीछे कोई भी बिंदु (पिरामिड की नोक) ऊपर, नीचे, बाईं ओर और स्क्रीन के दृश्य क्षेत्र के दाईं ओर है। सभी एक ही समय पर।

जैसा कि मैंने कहा: कैमरे के पीछे एक परिप्रेक्ष्य प्रक्षेपण के तहत कोने मतलब नहीं है।

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

यह एक सरल प्रक्रिया नहीं है। इसमें गणित शामिल होगा जो केवल तभी समझ में आता है जब आपको समरूप समन्वय प्रणालियों की पूरी समझ हो। वैकल्पिक रूप से, आप किसी भी त्रिभुज को सीधा-सीधा खींच सकते हैं यदि इसके पीछे का कोई शीर्ष कैमरा के पीछे हो।


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

0

यदि समीप के विमान के पीछे त्रिकोण का हिस्सा हो सकता है तो आप प्रति-पिक्सेल जांच कर सकते हैं कि क्या क्लिपिंग विमान के पीछे पिक्सेल की स्थिति है?

आप किसी भी अन्य कतरन विमान की तरह पास के विमान का इलाज कर सकते हैं। उदाहरण के लिए कतरन विमानों का उपयोग जल विमानों (प्रतिबिंबों और अपवर्तन के लिए) जैसी चीजों के लिए किया जाता है। मुझे लगता है कि यह क्लिपिंग प्लेन बिलकुल पास वाले प्लेन की तरह काम करेगा, और प्रति-पिक्सेल आधार पर क्लिप करेगा।

मुझे पता है कि डायरेक्टएक्स के साथ एचएलएसएल में कतरन विमानों को कैसे संभालना है, लेकिन उनका कार्यान्वयन मालिकाना हो सकता है। यदि आप इसके लिए जानकारी की पकड़ प्राप्त कर सकते हैं तो यह सहायक हो सकता है।

इसके अतिरिक्त यहाँ एक लिंक है जो आपकी मदद कर सकता है: http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter42.html


जावास्क्रिप्ट की तरह एक व्याख्या की गई भाषा में प्रति पिक्सेल परीक्षण बहुत महंगा है, मुझे अब मुश्किल से स्वीकार्य एफपीएस मिल रहा है।
सोलनॉइड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.