2012-07-03 15 views
9

मेरे पास मेरे गेम में एक घर का मॉडल है, और मेरे पास घर ज्यामिति के लिए कुछ सामग्री है। घर की दीवार के लिए एक सामग्री है, और मेरे पास ईंटों को दिखाने के लिए एक बनावट-नक्शा-छवि है।GL_REPEAT जैसे बनावट मानचित्र को दोहराना कैसे करें?

var mat = new THREE.MeshPhongMaterial({ 
    ambient: 0x969696, 
    map: THREE.ImageUtils.loadTexture('textures/G/G0.jpg'), 
    overdraw: true,combine: THREE.MultiplyOperation 
}); 

ऊपर इस तरह, बनावट नक्शा दिखाई देते GL_CLAMP जैसे मैं इसे GL_REPEAT की तरह दिखाना चाहते हैं।

मुझे क्या करना चाहिए?

यदि आप छवियों को नहीं देख पा रहे हैं this

उत्तर

4

इसे THREE.RepeatWrapping कहा जाता है। loadTextureTHREE.ClampToEdgeWrapping पर डिफ़ॉल्ट (पिछले लिंक से सीटीओआर फ़ंक्शन देखें)। पता नहीं है कि क्या आप callback का उपयोग कर सकते हैं (क्योंकि this जेएस में थोड़ा अजीब है (ऐसा लगता है कि यह Image बनाया गया है, न कि बनाए गए Texture)। हस्ताक्षर:

loadTexture: function (path, mapping, callback) { 

बेहतर तुम सिर्फ बनावट स्थानीय स्तर पर नाम और मैन्युअल रूप से चादर के मोड सेट:

var t = THREE.ImageUtils.loadTexture('textures/G/G0.jpg'); 
t.wrapS = t.wrapT = THREE.RepeatWrapping; 

ऐसा लगता है कि वास्तविक कोड को देखे बिना threejs साथ दूर नहीं जा रहे हैं ...

+0

मैंने इस तरह रैप और रैप सेट सेट करने का प्रयास किया है, लेकिन यह काम नहीं करता है। मुझे लगता है कि सामग्री गलत है, अब मैं मेशफोंगमटेरियल का उपयोग करता हूं, क्या मुझे इसके बजाय शेडरमटेरियल का उपयोग करना चाहिए? – user1497753

+0

पता नहीं, मैं हालांकि यह काम करने की कोशिश करता हूं। बनावट एक शक्ति का होना चाहिए, देखें [WebGLRenderer, एल। 5721] (https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLRenderer.js)। –

+0

मुझे एक ही समस्या थी, मैंने एक घन स्केल किया और बनावट फैली हुई थी। इसे रोकने के लिए आपको 'cnder()' में नया क्यूब आकार सेट करने की आवश्यकता है: 'texture.repeat.set (2 * cwidth, 2 * cHeight); '(तब बनावट एक unscaled पैटर्न की तरह व्यवहार करता है)। उम्मीद है की वो मदद करदे। –

13

मैं एक पूर्ण काम कर उदाहरण पोस्ट किया है: http://stemkoski.github.com/Three.js/Texture-Repeat.html

कोड उदाहरण के प्रासंगिक हिस्सा है:

// for example, texture repeated twice in each direction 
var lavaTexture = THREE.ImageUtils.loadTexture('images/lava.jpg'); 
lavaTexture.wrapS = lavaTexture.wrapT = THREE.RepeatWrapping; 
lavaTexture.repeat.set(2, 2); 
var lavaMaterial = new THREE.MeshBasicMaterial({ map: lavaTexture }); 
var lavaBall = new THREE.Mesh(THREE.GeometryUtils.clone(sphereGeom), lavaMaterial); 
scene.add(lavaBall);  
+0

बहुत बहुत धन्यवाद! मुझे पता है कि घन और क्षेत्र पर बनावट को दोहराना कैसे है। लेकिन मुझे एक और सवाल आया कि ज्यामिति की सामग्री पर बनावट को दोहराना कैसे है? मेरे पास मेरे गेम में कुछ लोड मॉडल है, मॉडल की ज्यामिति में कुछ है सामग्रियों में से प्रत्येक में अलग-अलग बनावट-छवि होती है, तो क्या आप मुझे कुछ सुझाव या उदाहरण दे सकते हैं? धन्यवाद! – user1497753

+1

मुझे मिल गया है। यह वही तरीका है! जिस छवि का मैं उपयोग कर रहा था वह 120 * 120 के आकार में है, मैं इसे 128 * 128 में बदलता हूं, इसलिए समस्या हल हो गई है! शायद छवि का आकार 128 * 128 या 256 * 256 या कुछ ऐसा होना चाहिए यदि आप 'दोहराना' – user1497753

+4

हां, छवि आयामों को दोहराने के लिए दोहराने वाली सुविधाओं के क्रम में 2 की शक्ति होना चाहिए। –

3

छवि 8x8, 16x16, 32x32, 128x128, 256x256, 512x512 आदि और यह सब काम किया जाना चाहिए। =)

+1

रैपिंग के लिए छवियों की शक्ति-दो-दो (पीओटी) की आवश्यकता होती है, लेकिन उन्हें वर्ग नहीं होना चाहिए। – WestLangley

+0

@WestLangley का मतलब है कि एक 8x512 भी काम करेगा? – fuchs777

+1

@ fuchs777 यह सही है। – WestLangley