2016-12-05 51 views
0

我需要得到UV貼圖將在three.js所正確地呈現UV幫助質感。我在Blender中創建了一個重複貼圖紋理的模型。瓷磚紋理用UV貼圖應用,它看起來像這樣,如果被正確渲染它: Render image using Blender 。然而,當使用JSONLoader由three.js所加載,瓷磚只是拉伸以填充每個多邊形,給人怪異結果如下:Screenshot of render using three.js 。我試着在我的代碼設置THREE.RepeatWrapping但什麼都沒有改變:three.js所使用的重複JSONLoader

bodyLoader = new THREE.JSONLoader(); 
bodyLoader.load('./starofthesea_threejs.json', function(geometry, materials) { 
    mainBodyMaterials = new THREE.MeshFaceMaterial(materials); 
    console.log(materials); 
    mainBodyMaterials.wrapS = THREE.RepeatWrapping; 
    mainBodyMaterials.wrapT = THREE.RepeatWrapping; 
    mainBodyMaterials.needsUpdate = true; 
    mainBody = new THREE.Mesh(geometry, mainBodyMaterials); 
    mainBody.traverse (function (child) { 
    if (child instanceof THREE.Mesh) { 
     child.castShadow = true; 
     child.receiveShadow = true; 
    } 
    }); 
    mainBody.scale.x = mainBody.scale.y = mainBody.scale.z = 1; 
    geometry.computeBoundingBox(); 
    geometry.computeFaceNormals(); 
    geometry.computeFlatVertexNormals(); 
    scene.add(mainBody); 

}); 

這有什麼錯在我的代碼,或變通方法來得到它正確呈現?所有的幫助深表謝意。

+0

只是一個想法,你需要設置mainBodyMaterials.repeat.set(10,10);並做紋理需要是2寬度高度的權力?在材料 – Sentinel

+0

設置重複只是拋出一個「未定義」的錯誤,和紋理的所有維度都設置爲2的冪已經 – kychung

回答

0

最後我通過我自己,其中兩個Blender的模型和JS配置錯誤想通了這個問題。 RepeatWrapping應該是應用於紋理但不重要。我需要研究THREE.MeshFaceMaterial的結構來查找底層紋理的句柄。我需要通過材料來遍歷,以找出圖像紋理的所有材料:

mainBodyMaterials = new THREE.MeshFaceMaterial(materials); 
for(prop in mainBodyMaterials.materials) { 
    if(mainBodyMaterials.materials[prop].map != null) { 
    mainBodyMaterials.materials[prop].map.wrapS = THREE.RepeatWrapping; 
    mainBodyMaterials.materials[prop].map.wrapT = THREE.RepeatWrapping; 
    tex.push(mainBodyMaterials.materials[prop].map.clone()); 
    tex[tex_sequence].needsUpdate = true; 
    tex_sequence++; 
    } 
} 

正確運用包裝,纏住到紋理的瓷磚材料之一得到正確渲染之後,但「紋理標記爲更新,但圖像未定義「的錯誤不斷拋出。我需要克隆紋理擺脫錯誤的,根據另一個問題:Three.js r72 - Texture marked for update but image is undefined? 由於有幾種材料與重複的瓷磚,我需要建立在JS程序開始一個全局數組,並推動修改紋理一個當通過材料循環時:

var tex = new Array(); 
var tex_sequence = 0; 

固定JS調用後,其中一個紋理仍然無法正常工作。我忘了只有一個紫外線插槽是允許three.js。我需要在Blender的相同UV槽下再次打開UV。一切都像魅力一樣,我希望我的痛苦經歷可以幫助那些因類似問題而生氣的人。