क्या वास्तव में एक सतह दूसरे को ओवरलैप करने का कारण बनती है?


10

मैं वास्तव में यह पता नहीं लगा सकता कि किस कारण से एक सतह दूसरे को ओवरलैप करती है। मेरे द्वारा बनाए जा रहे 3D इंजन में, मेरी तकनीक धार के मामलों में विफल हो रही है।

मेरी विधि सतहों को छठी से सबसे नजदीक तक चित्रित करने के लिए छाँट रही है। निकटता निर्धारित करने के लिए, मैं औसत z मानों की तुलना कर रहा हूं। कभी कभी, तथापि, एक ओवरलैपिंग सतह एक है उच्च एक यह अतिव्यापी है की तुलना में औसत z मूल्य। इस प्रकार, दूर की सतह को करीब से चित्रित किया गया है - जिसके परिणामस्वरूप विचित्र प्रतिपादन इस प्रकार है:

पक्ष पर लाल के एक वर्ग के साथ बड़े बैंगनी वर्ग

जो देखने के लिए होता है वह केवल घन की बैंगनी सामने की सतह है, जबकि लाल पक्ष सतह को बैंगनी रंग के ऊपर चित्रित किया गया है। बैंगनी सतह का औसत z मान अधिक है, और इसलिए 'आगे दूर' है। इसलिए मुझे कुछ संदेह हो रहा है कि क्या यह तकनीक सही है।

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

इसलिए, मूल की ओर सतहों की निकटता के क्रम को निर्धारित करने का एक विश्वसनीय तरीका क्या है?

जवाबों:


11

आप चित्रकारों एल्गोरिथ्म को लागू करने की कोशिश कर रहे हैं । मैं अनुमान लगा रहा हूँ कि आप एक लर्निंग एक्सरसाइज के रूप में स्क्रैच से रैस्टराइज़र लिखने की कोशिश कर रहे हैं, क्योंकि अधिकांश आधुनिक 3 डी हार्डवेयर बार्ट (ज़ेड / डेप्थ बफर) का उल्लेख करते हैं। सभी मामलों में काम करने के लिए चित्रकारों के एल्गोरिथ्म के लिए, आपको सतहों को वश में करने के लिए तैयार रहना होगा क्योंकि वे संभावित परिदृश्यों को हल करने के लिए प्रस्तुत किए जाते हैं (जैसे कि विकिपीडिया पृष्ठ पर दिखाई गई अतिव्यापी बहुभुज समस्या)।

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

यहां तक ​​कि सबसे आधुनिक त्वरण हार्डवेयर के साथ आपको अभी भी किसी भी अर्ध-पारदर्शी बहुभुज के सामने से छांटना और प्रस्तुत करना होगा, यह केवल एक बार सभी अपारदर्शी बहुभुज प्रदान किए जाने के बाद।


आप यह कहने में सही हैं कि मैं एक साधारण रेंडरर बना रहा हूं। मुद्दा यह है कि मैं किसी भी 3 डी पुस्तकालयों का उपयोग नहीं कर रहा हूं। मैं सभी प्रोजेक्शन गणना खुद कर रहा हूं और फिर 2 डी ड्राइंग लाइब्रेरी का उपयोग करके लाइनें खींचता हूं। यह वहाँ सबसे तेज़ नहीं है और मैं प्रति पिक्सेल के आधार पर कुछ भी नहीं कर रहा हूँ। मेरे पास प्रत्येक सतह के 4 बिंदु हैं और एक रंग के साथ आयताकार आकार भरें। चूंकि मैं एक समय में एक पूरी सतह खींच रहा हूं, क्या मैं यह कहने में सही हूं कि मुझे वापस सामने खींचना है?
pimvdb

बहुत मज़ा और सीखने का एक शानदार तरीका लगता है। बैक टू फ्रंट आपका एकमात्र तरीका है यदि आप किसी भी प्रकार की गहराई बफर के बिना ऐसा कर रहे हैं। मुझे लगता है कि आपको अपने बहुभुजों के सभी स्क्रीन को-ऑर्डिनेट्स पर काम करना होगा और फिर किसी भी ओवरलैप के लिए जांचना होगा। जहां वे गहराई से ओवरलैप करते हैं आप संभवतः रेंडर करने के लिए बहुभुज को काटते हैं, इसलिए आप वास्तव में छंटाई को सही ढंग से हल कर सकते हैं। आप पॉलीगन्स को हटाने के तरीके के रूप में बैक फेस कलिंग में भी देखना चाह सकते हैं जो कि दिखाई नहीं देनी चाहिए
रोजर पर्किंस

रोजर पर्किन्स सही है। आप उस तरह से सही z- छंटाई नहीं कर पाएंगे (जब तक कि आपके पास हमेशा कुछ किनारे-मामले नहीं होंगे), जब तक आप पॉलीफोन को काट नहीं लेते। हालांकि यह धीमा हो सकता है।
बुमज़ैक

मैं इसे काम कर रहा हूँ! मैंने जो किया था, वह बैकलेस कुलिंग और सॉर्टिंग का एक संयोजन था: एक ठोस घन में, कुछ चेहरे दिखाई नहीं दे रहे हैं जबकि अन्य 3 (अधिकतम 3) हैं। इसलिए मैंने गैर-दृश्य भागों को पहले चित्रित किया, और उन पर दिखाई देने वाले भागों को। यह एक आकर्षण की तरह काम करता है, अगर मैं एक या एक से अधिक पक्षों को हटा देता हूं, तो वे अतिव्यापी होते हैं लेकिन फिर भी सही क्रम में खींचे जाते हैं। धन्यवाद!
pimvdb

1
यह केवल साधारण उत्तल आकृतियों के लिए काम करेगा, जैसे क्यूब्स। मुझे खुशी है कि यह वर्तमान में आपके लिए काम कर रहा है, लेकिन यह एक सामान्य समाधान नहीं है।
रिचर्ड फैबियन

3

आपके पास दृश्यता समस्या है । एक समाधान एक z- बफर का उपयोग कर रहा है ।


धन्यवाद, लेकिन अगर मैं गलत नहीं हूँ, तो z- बफरिंग को प्रति-पिक्सेल रेंडरिंग की आवश्यकता होती है। मैं ऐसा नहीं कर रहा हूं - मैं क्यूब के अनुमानित बिंदुओं के बीच सीधी रेखा खींच रहा हूं। क्या z- बफरिंग अभी भी संभव है?
pimvdb

भले ही आप स्क्रीन पर (या बिटमैप फ़ाइल) छवि में आने से पहले किसी बिंदु पर सीधी रेखाएँ खींच रहे हों, यह पिक्सेल प्रारूप में होगा।
बार्ट वैन ह्युकेलोम

यह सही है लेकिन मेरी ड्राइंग लाइब्रेरी 20fps के साथ पिक्सेल रेंडरिंग करने के लिए बहुत धीमी है। हालांकि धन्यवाद।
pimvdb

2

चेहरों को उनके औसत z- मान के अनुसार क्रमबद्ध करने से काम नहीं चलता है, क्योंकि औसत z- मान वर्टिकल या यहां तक ​​कि सतह पिक्सेल के वास्तविक z- मूल्य पर कोई जानकारी प्रदान नहीं करता है।

उदाहरण (चेतावनी, ASCII कला आगे):

          /
         /
cam     /
-->    / 
      /
     /--       <--B
    /
    ^--A

कैमरे के दृष्टिकोण से दो चेहरे A और B हैं। A, B के सामने है, फिर भी B का औसत z- मान छोटा है। आइए अन्य Z- मानों को देखें:

  • A का न्यूनतम z- मान 4 है
  • A का अधिकतम z- मान 11 है
  • इसलिए A का औसत z- मान 7.5 है
  • B का न्यूनतम z- मान 6 है
  • B का अधिकतम z- मान 8 है
  • इसलिए B का औसत z- मान 7 है

आप उन्हें अपने न्यूनतम z- मानों के आधार पर छाँटने की कोशिश कर सकते हैं, लेकिन ऐसे मामले भी हैं जहाँ यह काम नहीं करेगा। सिर्फ एक z- मूल्य का उपयोग करके मनमाने ढंग से चेहरों को छांटने का कोई तरीका नहीं है।

नेवेल के एल्गोरिथ्म में http://en.wikipedia.org/wiki/Newell का s_algorithm जो आप करते हैं, वह z- मानों की न्यूनतम / अधिकतम-श्रेणियों को सॉर्ट करता है। यदि दो चेहरों की श्रेणियां ओवरलैप नहीं होती हैं, तो आप यह जान सकते हैं कि सामने वाला कौन है। यदि वे करते हैं, तो कभी-कभी आपको पूरी तरह से चेहरे को विभाजित करना पड़ता है। कभी-कभी यह रोड़ा या किसी अन्य तकनीक के लिए प्रत्येक शीर्ष को फिर से तैयार करने के लिए पर्याप्त होगा।


यह आरेख एक ओवरहेड दृश्य है जो मैं अनुमान लगाने जा रहा था कि उसके स्क्रीनशॉट में क्या चल रहा है।
जॉकिंग

1

यह अच्छा है कि आप किस करके प्रतिपादन के बारे में सीख रहे हैं। कुडोस। इस उदाहरण में, कोई "चित्रकार एल्गोरिथ्म" समाधान नहीं है, इसे छाँटकर ठीक करने की कोशिश करने के बजाय, PS1 पर हम बस एक ही आकार के आसपास बहुभुज रखने की कोशिश करते थे जब वे एक दूसरे के बगल में थे (जो आप के रूप में कर रहे हैं जहां तक ​​मैं बता सकता हूं), और बैकफुल कल (जो आप नहीं कर रहे हैं)

बैकफेस कुलिंग स्क्रीन स्पेस में सतह की सामान्य रूप से जांच कर रही है क्योंकि यह दिशा है (बस सामान्य रूप में परिवर्तित स्क्रीन स्पेस से गहराई तत्व का संकेत मिलता है (हमारे मामले में यह सामान्य का जेड था), या दो वैक्टर के क्रॉस उत्पाद त्रिभुज यानी क्रॉस (v1-v0, v2-v0))

यदि आप बैकलेस कुलिंग को लागू करते हैं, तो आप अपने द्वारा किए जा रहे रिस्तेरिंग की मात्रा को भी कम कर देते हैं .. दोहरी जीत।


आपके प्रतिक्रिया के लिए धन्येवाद। मैंने बैकलेस कुलिंग के बारे में पढ़ा, लेकिन बात यह है कि मैं एक पक्ष को हटाने में सक्षम होना चाहता हूं। एक ठोस घन के साथ यह बहुत अच्छा काम कर सकता है, लेकिन अगर मैं एक पक्ष को हटा देता हूं, तो ऐसा हो रहा है - इसलिए मुझे अभी भी उनकी तरह लगता है कि मुझे लगता है। वैसे भी, मैं एक सतह के मध्य बिंदु के माध्यम से मूल से किरण को आग लगाने के विचार के साथ आया था। यदि वह किरण बाद में दूसरी सतह को पार करती है, तो पहली सतह दूसरी को ओवरलैप कर रही है। क्या आप संभवतः मुझे बता सकते हैं कि क्या यह विचार सही है? धन्यवाद!
pvvdb

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