2012-01-25 15 views
10

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

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

enter image description here

आप देख सकते हैं बनावट भारी विकृत किया जा रहा है। जैसा कि मैंने शुरू में ट्यूबों को केवल 2 अंगूठियों के साथ बनाया था, मैंने सोचा था कि अंगूठियों की मात्रा बढ़ाने से विकृति ठीक हो जाएगी लेकिन कोई खुशी नहीं होगी। ग्लिंट भी इस विशिष्ट समस्या को प्रभावित नहीं कर रहा है।

बनावट निर्देशांक ठीक प्रतीत होते हैं। इसके अलावा, चेकर पैटर्न सही ढंग से प्रस्तुत करना प्रतीत होता है, लेकिन मुझे लगता है कि विरूपण उस विशिष्ट पैटर्न में दिखाई नहीं दे रहा है।

कृपया पार लाइनों को अनदेखा करें क्योंकि इनमें से एक अस्तित्वहीन किनारा है; मैंने GL_LINE_LOOP के माध्यम से वायरफ़्रेम प्रदान किया।

+0

ऐसा इसलिए हो सकता है क्योंकि आप ऑर्थोग्राफिक प्रक्षेपण का उपयोग कर रहे हैं? – geofftnz

उत्तर

2

यह विशेष प्रभाव एक त्रिकोण में बनावट बनाम को अलग करने के तरीके के कारण होता है। क्या होता है, कि एक दिशा प्रमुख घटक बन जाती है, जबकि दूसरा तिरछा होता है। आपका नमूना बहुत प्रवण होता है। यह फर्श या दीवारों पर परिप्रेक्ष्य अनुमानों और बनावटों के साथ एक समस्या भी होती है। आपको जो चाहिए वह "परिप्रेक्ष्य सही बनावट" पीसीटी कहा जाता है। इसके लिए glHint है लेकिन मुझे लगता है कि आपने पहले ही कोशिश की है।

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

यदि आप अपने ज्यामिति डेटा को छूटे रखना चाहते हैं तो आप टुकड़े टुकड़े में पीसीटी को कार्यान्वित कर सकते हैं।

+0

जबकि मैंने और अधिक छल्ले जोड़ने की कोशिश की, मैंने प्रति अंगूठी को और अधिक ऊर्ध्वाधर जोड़ने की कोशिश नहीं की, जिसने समस्या हल की। तो वास्तव में, उपविभाज जाने का रास्ता था। धन्यवाद! –

0

कुछ उपखंड का प्रयास करें:

template< typename Vec > 
void glVec2d(const Vec& vec) 
{ 
    glVertex2f(static_cast<float>(vec.x()) , static_cast<float>(vec.y())); 
} 

template< typename Vec > 
void glTex2d(const Vec& vec) 
{ 
    glTexCoord2f(static_cast<float>(vec.x()) , static_cast<float>(vec.y())); 
} 

template< typename Vec > 
void glQuad 
    (
    const Vec& A, 
    const Vec& B, 
    const Vec& C, 
    const Vec& D, 
    unsigned int divs = 2, 
    const Vec& At = Vec(0,0), 
    const Vec& Bt = Vec(1,0), 
    const Vec& Ct = Vec(1,1), 
    const Vec& Dt = Vec(0,1) 
    ) 
{ 
    // base case 
    if(divs == 0) 
    { 
     glTex2d(At); 
     glVec2d(A); 

     glTex2d(Bt); 
     glVec2d(B); 

     glTex2d(Ct); 
     glVec2d(C); 

     glTex2d(Dt); 
     glVec2d(D); 

     return; 
    } 

    Vec AB = (A+B) * 0.5; 
    Vec BC = (B+C) * 0.5; 
    Vec CD = (C+D) * 0.5; 
    Vec AD = (A+D) * 0.5; 
    Vec ABCD = (AB+CD) * 0.5; 

    Vec ABt = (At+Bt) * 0.5; 
    Vec BCt = (Bt+Ct) * 0.5; 
    Vec CDt = (Ct+Dt) * 0.5; 
    Vec ADt = (At+Dt) * 0.5; 
    Vec ABCDt = (ABt+CDt) * 0.5; 

    // subdivided point layout 
    // D CD C 
    // 
    // AD ABCD BC 
    // 
    // A AB B 

    // subdivide 
    glQuad2d(A, AB, ABCD, AD, divs - 1, At, ABt, ABCDt, ADt); 
    glQuad2d(AB, B, BC, ABCD, divs - 1, ABt, Bt, BCt, ABCDt); 
    glQuad2d(ABCD, BC, C, CD, divs - 1, ABCDt, BCt, Ct, CDt); 
    glQuad2d(AD, ABCD, CD, D, divs - 1, ADt, ABCDt, CDt, Dt); 
} 

मैं आमतौर पर Vec के लिए Eigen::Vector2f का उपयोग करें।

0

आप इसके लिए ऑर्थोग्राफिक प्रक्षेपण का उपयोग क्यों कर रहे हैं? यदि आप परिप्रेक्ष्य प्रक्षेपण का उपयोग कर रहे थे, तो ओपनजीएल आपके लिए बनावट मैपिंग को सही करेगा।

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