2013-05-13 10 views
6

मैं meshes के लिए मैं OBJLoader से निम्नलिखित आवरण समारोह के माध्यम से में लोड एक सामग्री परिभाषित करने के लिए कोशिश कर रहा हूँ कारण बनता है:तीन जे एस मानचित्र सामग्री WebGL चेतावनी

function applyTexture(src){ 
    var texture = new THREE.Texture(); 
    var loader = new THREE.ImageLoader(); 
    loader.addEventListener('load', function (event) { 
     texture.image = event.content; 
     texture.needsUpdate = true; 

     // find the meshes from the loaded OBJ and apply the texture to it. 
     object.traverse(function (child) { 
      if (child instanceof THREE.Mesh) { 
       if(child.name.indexOf("Lens") < 0){ 
        child.dynamic = true; 

        child.material = new THREE.MeshLambertMaterial({ color: 0xdddddd, shading: THREE.FlatShading, map : texture }); 
        // also tried: 
        //child.material = new THREE.MeshPhongMaterial({ color: 0x000000, specular: 0x666666, emissive: 0x000000, ambient: 0x000000, shininess: 10, shading: THREE.SmoothShading, map : texture}); 
        // and: 
        //child.material = new THREE.MeshBasicMaterial({map : texture}); 
        child.material.map = texture; // won't throw the WebGL Warning, but won't show the texture either; 
       } else { 
        // works just fine. 
        child.material = new THREE.MeshPhongMaterial({ color: 0x000000, specular: 0x666666, emissive: 0x000011, ambient: 0x000000, shininess: 10, shading: THREE.SmoothShading, opacity: 0.6, transparent: true }); 
       } 
      } 
     }); 
    }); 
    loader.load(src); 
} 

बनावट लोड है और यह सामग्री लागू करने के लिए समय आ गया है जब जाल के लिए, मुझे कंसोल पर निम्नलिखित चेतावनी मिलना शुरू हो गया:

.WebGLRenderingContext: GL ERROR :GL_INVALID_OPERATION : glDrawElements: attempt to access out of range vertices in attribute 0 

और जाल स्वयं गायब हो जाता है।

मैं यहाँ क्या गलत कर रहा हूं?

अद्यतन

@WestLangley के रूप में टिप्पणी पर बताया: कभी के बाद चीजों को प्रस्तुत किए गए हों बनावट/सामग्री लागू करने के लिए प्रयास करें। दृश्य करने के लिए वस्तु प्रतिपादन से पहले सामग्री बनाने और उसके बाद का उपयोग कर उन्हें बदलने के लिए:

obj.material.map = texture 
+0

क्या यह काम करता है यदि आप शुरुआत से सामग्री में बनावट जोड़ते हैं, तो जाल के पहले प्रतिपादन में बनावट शामिल है? – WestLangley

+0

@WestLangley जाल लोड होने पर और दृश्य में जोड़े जाने से पहले एक बनावट लागू होती है और जब यह विफल हो जाती है। जब मैंने "child.material.map = बनावट" का उपयोग करने का प्रयास किया तो मुझे वेबजीएल चेतावनी नहीं मिली, लेकिन बनावट लागू नहीं हुई थी। किसी भी कारण से, "child.material = new THREE.MeshLambertMaterial ({रंग: 0xdddddd, छायांकन: तीन। फ्लैटशैडिंग, मानचित्र: बनावट});" WebGL से कैनवास में रेंडरर को बदलते समय बनावट को लागू करता है। यहां पूरा कोड: https://gist.github.com/jrmoretti/81047c9d6821e4bbaac5 – JayMoretti

+0

WebGLRenderer में, आप इस तथ्य के बाद एक बनावट नहीं जोड़ सकते हैं। हालांकि, आप केवल बनावट बदल सकते हैं। एक साधारण सफेद बनावट वाली सामग्री के साथ एक काम शुरू करना है। – WestLangley

उत्तर

11
WebGLRenderer साथ

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

एक साधारण सफेद बनावट वाली सामग्री के साथ एक कार्य-आसपास शुरू होना है।

अद्यतन: वैकल्पिक रूप से, आप एक textureless सामग्री के साथ शुरू कर सकते हैं, और फिर निम्न निशानी नहीं लगाई है जब एक बनावट जोड़ा जाता है:

material.needsUpdate = true; 
geometry.buffersNeedUpdate = true; 
geometry.uvsNeedUpdate = true; 

Three.js r.58

+0

धन्यवाद। यह चाल अच्छी तरह से काम करता है। – magirtopcu

2

मैं भी मिल गया ब्लेंडर से एक दृश्य लोड करते समय यह त्रुटि। मेरे लिए समस्या तब तय की गई जब प्रत्येक जाल के लिए यूवी को खोलना मैं बनावट चाहता हूं।

+0

हां, यह बनावट बनाते समय बस बनावट बनाते समय बनावट बनाते हैं। या तो उन्हें अपने कोड में या अपने मॉडलर में उत्पन्न करें। r69 – StackHola

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