2012-12-13 22 views
13

मैं एक ओपनजीएल ईएस 2.0 ऐप लिख रहा हूं जो एक 3 डी द्वीप प्रस्तुत करता है। मेरे पास पहले से ही द्वीप के चारों ओर एक आकाश गुंबद उत्पन्न करने के लिए कोड है। यह एक गोलार्ध है जिसमें त्रिभुज होते हैं जो द्वीप को ज़ेड पॉइंट ऊपर के साथ रखते हैं।मैं एक दृढ़ स्काईडोम कैसे प्रस्तुत करूं?

गुंबद में कुछ बहुत ही बुनियादी चलने वाले बादल हैं जो एक पेर्लिन शोर बनावट का उपयोग करके स्वयं को ओवरलैड करते हैं और विभिन्न गति को आगे बढ़ाते हैं।

लेकिन अंतत मैं गुंबद की जरूरत भी प्रस्तुत करना:

  • सूर्य (जो आसमान में पटरियों) चंद्रमा (चरण सहित)
  • सितारे (रात में)
  • एक स्थिर बनावट के रूप में दूर भूमि
  • विभिन्न रंग रात, सुबह, शाम, दिन अनुकरण

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

मेरे पास पहले से ही गुंबद उत्पन्न करने के लिए कोड है, और एक तिथि और समय के खिलाफ सूर्य को साजिश करने के लिए कोड है। इसलिए ज्यादातर इसकी जरूरत वाले शेडर्स और उन्हें क्या आपूर्ति की जाती है।

क्या कोई ऐसा उदाहरण है जो इन चीजों को प्रदर्शित करता है? मुझे बहुत कुछ मिला है जो मूल घन मानचित्र, या सीमित सामान करते हैं, लेकिन मुझे परिष्कार के स्तर के लिए कुछ भी नहीं चाहिए। जाहिर है क्योंकि यह ओपनजीएल ईएस 2.0 है, इसे शेडर्स में किया जाना है।

मेरे मौजूदा आकाश गुंबद के लिए शेडर बादलों को अनुकरण करने के लिए पर्लिन शोर की 2 परतें प्रस्तुत करता है। बनावट लगातार लपेटती है ताकि मैं गुंबद के कशेरुक के कोण पर एक्सई प्लेन (एक्स और वाई को एटान में खिलाकर) और गुंबद के वर्टेक्स जेड का उपयोग करके वी ऑफसेट में यू ऑफसेट की गणना कर सकूं।

शिखर शेडर दर्शाता है कि कैसे मैं यह कर:

#ifdef GL_ES 
precision mediump float; 
precision mediump int; 
#endif 

attribute vec4 aVertex; 

uniform mat4 uPMVMatrix; 
uniform float uTime; 
uniform float uSkyDomeRadius; 

const float PI = 3.1415926535897932384626433832795; 

varying vec2 texCoord0, texCoord1; 

void main() 
{ 
    vec2 centre = vec2(600., 600.); 

    gl_Position = uPMVMatrix * aVertex; 

    float slow_time = uTime/100.; 

    vec2 dome_point = aVertex.xy - centre; 
    float tex_u = atan(dome_point.x, dome_point.y);///(.25 * PI); 
    float tex_v = aVertex.z/(uSkyDomeRadius * .5); 

    texCoord0 = vec2(tex_u/2.0 + slow_time, tex_v/2.0); 
    texCoord1 = vec2(tex_u + slow_time/2.0, tex_v); 
} 

मैं भी एक समय का उपयोग यू थोड़ा प्रत्येक फ्रेम की भरपाई के लिए तो बादलों चलते हैं। यह ठीक काम करता है कि एटान -पीआई से पीआई तक जाता है और अचानक texCoord0 और texCoord1 मानों को खंडित शेडर इंटरपोलेट्स को एक बड़ी दूरी से अलग किया जाता है जो इंटरपोलेशन को खो देता है।

इसका वर्णन करने का सबसे अच्छा तरीका यह है कि यदि मेरे पास मेरे आधार पर 16 त्रिकोण हैं तो 0/16 से 1/16 कार्यों में इंटरपोलेशन, 1/16 से 2/16 काम करता है और इसी तरह। लेकिन जब मैं 15/16 से 0/16 तक जाता हूं तो इंटरपोलेटर पीछे की तरफ जाता है और बड़ी भिन्नता से टुकड़े टुकड़े करने के कारण एक छोटी सी जगह में बनावट को दोहराया जाता है।

Interpolation goes haywire as angle goes into reverse

मैं एक सहज 360 अंश दृश्य मुझे लगता है कि एक ही रास्ता मैं इसे ठीक कर देंगे अगर मैं पूरे गुंबद बारी बारी से इतना सीवन कैमरे के पीछे हमेशा होता है है के लिए किसी भी तरह से नहीं देख सकते हैं लेकिन यह अभी भी हो सकता है दिखाएं कि कैमरा सीधे गुंबद के शीर्ष तक इंगित करता है या नहीं।

स्रोत के साथ एक कामकाजी उदाहरण बहुत अच्छा होगा, खासकर यदि यह इस तरह के मुद्दों को संबोधित करता है।

+0

बेवकूफ सवाल लेकिन tex_x होना> पीआई या <-PI – BevynQ

+0

tex_x हमेशा पीआई और -पीआई के बीच होगा क्योंकि एटान उन मानों को वापस कर देता है। मेरे पास गुंबद के आधार पर 16 त्रिकोण हैं, इसलिए प्रत्येक त्रिभुज आधार 2 पीआई/16 या पीआई/8 की चाप निर्धारित करता है। इसलिए v0 3/16 वें स्थान और v1 4/16th हो सकता है और इसलिए tex_x ठीक से इंटरपोलेट करता है। मुद्दा तब आता है जब v0 15/16 थे और v1 0/16 थे और इंटरपोलेशन पूरी तरह से खराब हो गया था। मैं इसे ठीक से ठीक करने के किसी भी तरीके से नहीं सोच सकता, इसलिए मैं अनुमान लगा रहा हूं कि मुझे गुंबद को घूमना होगा ताकि सीम हमेशा कैमरे के पीछे हो और जो कुछ भी मैं बराबर राशि से प्रस्तुत करता हूं उसे ऑफ़सेट कर दूं। – locka

+0

मैंने इसे स्पष्ट करने के लिए प्रश्न को अद्यतन किया और tex_x और tex_y को tex_u और tex_v – locka

उत्तर

3

समस्या यह है कि आप 0 डिग्री और 360 डिग्री के कोण पर एक ही शिखर का उपयोग करते हैं। तो अब आपके पास एक त्रिकोण है जहां पहले चरम पर 15/16, 0 का बनावट समन्वय होता है और दूसरे के पास 1,0 के बजाय 0, 0 होता है।इसे ठीक करने के लिए, आपको गोलाकार खोलना होगा ताकि आपके पास समान स्थानिक स्थितियों में एक जोड़ी हो, एक 0 डिग्री के लिए और एक 360 डिग्री के लिए। इस तरह दो शिखरों में अलग बनावट निर्देशांक हो सकते हैं और कोई परेशान बनावट नहीं होगी।

उन्हें घुमाने के लिए आपको रैपिंग मोड का उपयोग करना होगा, सुनिश्चित करें कि बनावट रैपिंग दोहराने के लिए सेट है। यदि आपने इसे नहीं बदला है, तो इसे सही तरीके से स्थापित किया जाना चाहिए, लेकिन इसे फ़ंक्शन glTexParameter के साथ सेट किया जा सकता है, पैरामीटर GL_TEXTURE_WRAP_S और GL_TEXTURE_WRAP_T हैं और मान GL_REPEAT होना चाहिए। फिर यदि एक बनावट मान है> 1 यह चारों ओर लपेट नहीं करेगा लेकिन बनावट दोहराएगा। अब आपको केवल अंत में (360 डिग्री सेल्सियस के लिए) के क्षेत्र में गोलाकार (0 डिग्री सेल्सियस पर) के लिए शिखर को बताने में सक्षम होना चाहिए ताकि आप tex_u को सही कर सकें, तो आपको शायद इसके लिए एक अतिरिक्त विशेषता चाहिए ।

+0

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