2017-03-29 255 views
0

我有一個在攪拌器中創建UV映射的3D模型。我應用UV貼圖的方式是紋理僅應用於模型的一側。我輸出的模型爲objmtl。當我在three.js上導入此模型時,它會按預期工作,並且加載程序會自動將mtl文件中定義的圖像用作紋理。在three.js中更改obj模型材質

現在我想以編程方式在three.js中更改此紋理。該模型有多種材質(我認爲這是因爲多面)。我如何重新應用維護UV貼圖的材質並更改所應用的紋理?我想申請mapenvMap到模型。

     var m = new THREE.MeshPhongMaterial({ 
          envMap: cubemap, 
          reflectivity: 0.9 
         }); 
         var m2 = new THREE.MeshPhongMaterial({ 
          envMap: cubemap, 
          color: parseInt(material.color, 16), 
          reflectivity: 0.9, 
          map: THREE.ImageUtils.loadTexture('/textures/uv_checker large.png') 
         }); 

         loadedMesh.material = [m,m,m,m,m,m2,m2,m2,m]; 

隨着一些試驗和錯誤後應用mm2位置。紋理是應用的,但它不會像原始的一樣。 II有一些小的空白空間,甚至在我的UV貼圖上不應該有紋理的地方使用紋理。

我該如何解決這個問題?

+0

我從來沒有使用OBJMTLLoader,因爲我以前有問題,我會用OBJLoader加載模型,然後單獨創建材質。 – 2pha

回答

0

好的,我找到了一種方法。我不知道這是否適用於所有型號,但我用另一種紋理替換了帶有我自定義材質的所有材質,並用另一種不同材質替換了所有其他材質。它工作完美,紫外線地圖仍然存在。

var m1 = new THREE.MeshPhongMaterial({map: texture, ...}); 
var m2 = new THREE.MeshPhongMaterial({...}); 
for(var n = 0; n < model.material.length; ++n) { 
    if(model.material[n].map) model.material[n] = m1; 
    else model.material[n] = m2; 
}