2012-05-28 87 views
2

有沒有辦法在Three.js庫中通過Collada加載器導入的簡單3D模型中替換所有紋理?如何用Three.js中的ShaderMaterial替換Collada導入的紋理?

我想完成的是通過指定帶有模型材質名稱的新文件,但添加「-color」,「-normal」和「-spec」,通過ShaderMaterial將顏色,鏡面和法線貼圖應用於模型「措辭:

」brochureFrontCover「 - > 」brochureFrontCover-color.jpg「, 」brochureFrontCover-normal.jpg「, 」brochureFrontCover-spec.jpg「

如果有良好的靈魂能告訴我怎麼這麼函數應看,我會非常感激。

腳本: http://dev.printhouse.co.uk/uv-simulator/j/Brochure.js

COLLADA模型: http://dev.printhouse.co.uk/uv-simulator/m/Brochure.dae

回答

1

我想應該是這樣的:

THREE.SceneUtils.traverseHierarchy(dae, function (child) { 

    if (child.material) { 

     var shader = THREE.ShaderUtils.lib[ "normal" ]; 
     var uniforms = THREE.UniformsUtils.clone(shader.uniforms); 

     uniforms[ "tDiffuse" ].texture = THREE.ImageUtils.loadTexture(child.material.name + "-color.jpg"); 
     uniforms[ "tNormal" ].texture = THREE.ImageUtils.loadTexture(child.material.name + "-normal.jpg"); 
     uniforms[ "tSpecular" ].texture = THREE.ImageUtils.loadTexture(child.material.name + "-spec.jpg"); 

     uniforms[ "enableDiffuse" ].value = true; 
     uniforms[ "enableSpecular" ].value = true; 

     child.geometry.computeTangents(); 

     child.material = new THREE.ShaderMaterial({ 
      uniforms: uniforms, 
      vertexShader: shader.vertexShader, 
      fragmentShader: shader.fragmentShader, 
      lights: true 
     }); 

    } 

}); 

This example應該是一個很好的參考,如果您需要調整制服。

+0

謝謝mrdoob!我已經更新了腳本並獲得了'GL_INVALID_OPERATION:glDrawXXX:嘗試訪問超出範圍的頂點錯誤。 dae'參數是否應該調用模型層次結構中的任何特定級別(我將它設置爲'dae = collada.scene;')? – ALx

+0

哦,呃!那麼,開始做'child.material = new THREE.MeshBasicMaterial({wireframe:true});'看看是否至少有效...... – mrdoob

+0

是的,這表明一個不錯的線框模型。所以你怎麼看? – ALx

相關問題