2011-03-24 38 views
9

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

  1. modelview और प्रक्षेपण matrixes का उपयोग कर कोने को बदलने, और क्लिप निर्देशांक में बदलना: एक त्रिकोण मैं निम्न कार्य rasterise करने के लिए। (डब्ल्यू गहराई का समन्वय है:

  2. प्रत्येक त्रिकोण में प्रत्येक पिक्सेल के लिए

    , गुण (रंग, बनावट निर्देशांक, Normals आदि)

  3. परिप्रेक्ष्य के लिए सही करने के लिए मैं परिप्रेक्ष्य सही प्रक्षेप का उपयोग अंतर्वेशन को barycentric निर्देशांक की गणना शिखर, सी बनावट शिखर का समन्वय है, ख एक शीर्ष की barycentric वजन) है

1/w = b0*(1/w0) + b1*(1/w1) + b2*(1/w2) 
c/w = b0*(c0/w0) + b1*(c1/w1) + b2*(c2/w2) 
c = (c/w)/(1/w) 

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

इस छवि में देखें विकर्ण के साथ स्पष्ट बनावट बनावट में त्रुटि, परिणामस्वरूप गहराई निर्देशांक द्वारा विभाजन किया गया है।

image showing incorrect perspective correction

इसके अलावा, यह आम तौर पर बनावट के लिए किया जाता है निर्देशांक ... यह अन्य संपत्तियों (जैसे normals आदि) के रूप में अच्छी तरह से करने के लिए आवश्यक है?

+1

स्क्रीनशॉट उपयोगी हो सकता है। – genpfault

+0

मैं स्क्रीनशॉट नहीं जोड़ सकता जब तक कि मेरी रेटिंग 10 :( –

+1

आपके पास अब रेटिंग है: D – Bahbar

उत्तर

1

हाँ, यह आपके पारंपरिक टूटे-परिप्रेक्ष्य वाले दांत की तरह दिखता है। आपका एल्गोरिदम सही दिखता है, इसलिए मुझे सच में यकीन नहीं है कि क्या गलत हो सकता है। मैं जांचता हूं कि जब आप इसे प्रस्तुत करते हैं तो आप वास्तव में नए गणना मूल्य का उपयोग कर रहे हैं? यह वास्तव में ऐसा लगता है कि आप परिप्रेक्ष्य-सही मूल्य की गणना करने की परेशानी में गए, और फिर प्रतिपादन के लिए मूल गैर-सही मूल्य का उपयोग किया।

+0

बस संख्याओं को देखते हुए, सही और uncorrected tex coords के बीच का अंतर है 1.0e-4 का क्रम (श्रेणी में tex coords [0.0,1.0])। शायद स्केलिंग समस्या है? क्या मैं स्केलिंग के लिए क्लिप गहराई समन्वय का उपयोग करने का अधिकार रखता हूं? –

2

आप ओपन सूचित करना है कि आप के साथ

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST) 

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

+0

यह एक सॉफ्टवेयर रेंडरर है, ओपनगल नहीं है (लगता है कि एक टैग जोड़ा गया टैग) ... लेकिन मैं सभी परिवर्तनों के लिए ओपनग्ल गणित का उपयोग कर रहा हूं। –

+0

क्षमा करें ... मैंने ओपनजीएल टैग देखा और इसलिए माना कि आप OpenGL का उपयोग कर रहे थे (यदि हार्डवेयर है तो सॉफ़्टवेयर प्रतिपादन पर स्विच करना चाहिए एक सुविधा प्रदान करने में सक्षम नहीं है)। वैसे भी जो आप देख रहे हैं वह तथाकथित "रैखिक परिप्रेक्ष्य प्रक्षेपण" समस्या है और तब होता है जब आप चरम के लिए सही यूवी मानों की गणना करते हैं लेकिन पॉलीफिलर रैखिक रूप से मैं एक बहुभुज rendering जब उन्हें nterpolate। – 6502

2

यूवी समन्वय से एक 3 डी विमान में एकमात्र सही परिवर्तन एक भौगोलिक परिवर्तन है।

http://en.wikipedia.org/wiki/Homography

आप अपने संगणना में कुछ बिंदु पर यह होना आवश्यक है।

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

2

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

ओपनजीएल स्वचालित रूप से आपके द्वारा प्रस्तुत किए जा रहे बनावट में परिप्रेक्ष्य सुधार लागू करता है। आपको बस इतना करना है कि विमान के प्रत्येक कोने के जेड घटक (XYZ स्थिति वेक्टर की विश्व अंतरिक्ष गहराई) द्वारा अपने बनावट निर्देशांक (यूवी - 0.0 एफ-1.0 एफ) को गुणा करें और यह ओपनजीएल के परिप्रेक्ष्य सुधार को "फेंक देगा" ।

मैंने हाल ही में इस समस्या को हल और हल किया।

texture mapping a trapezoid with a square texture in OpenGL

कागज मैंने पढ़ा है कि इस समस्या का समाधान हो जाता है, "Navigating Static Environments Using Image-Space Simplification and Morphing" - page 9 appendix A.

आशा इस मदद करता है: इस लिंक एक शॉट दे दो!

सीटी