GLTFLoader不允许替换其默认材料

时间:2019-12-01 17:09:59

标签: javascript three.js gltf

我有以下场景。

AmbientLight颜色:浅蓝色

PointLight颜色:粉红色

已加载的带有纹理的gltf对象

我使用GLTFLoader加载了带有纹理贴图的gltf对象,默认情况下在图片1中使用MeshStandardMaterial正确地加载了模型的模型,现在我想将所有MeshStandardMaterial更改为MeshPhongMaterial,我这样做的方法是循环遍历所有网格,然后更新材质,例如:

// find gltf scene
var gltfScene = scene.children.find(ele => ele.type === 'Scene');    
var meshes = gltfScene.children;
for (var i = 0; i < meshes.length; i++) {
  // for each mesh, change to MeshPhongMaterial
  meshes[i].material = new THREE.MeshPhongMaterial()
}

但是,这样做之后,所有的网格颜色都变成了我的AmbientLight颜色的纯色,并且它们确实不再对光产生反应了(SpotLight,{ {1}})在图片2中,您可以看到PointLight中的粉红色消失了。

任何人都可以帮助我,为什么我可以用PointLight代替。

这是代码笔https://codepen.io/chen-xu/pen/XWJWbwj,如果您单击MeshPhongMaterial,就会出现问题,您会看到粉红灯消失了。

default loaded object with MeshStandardMaterial

I change the material to MeshPhongMaterial

2 个答案:

答案 0 :(得分:0)

看来您没有正确遍历glTF场景。看起来应该像这样:

gltf.scene.traverse( ( child ) => { 

    if ( child.isMesh ) {

        child.material = new THREE.MeshPhongMaterial();

    }

} );

three.js R111

答案 1 :(得分:0)

感谢@ Mugen87,这个答案也是您在Github上获得的,我们需要添加{flatShading: true}

gltf.scene.traverse( ( child ) => { 

    if ( child.isMesh ) {

        child.material = new THREE.MeshPhongMaterial({flatShading: true});

    }

} );