我有以下场景。
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
,就会出现问题,您会看到粉红灯消失了。
答案 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});
}
} );