Skip to content

递归遍历层级模型并修改材质

加载一个外部模型,比如 gltf 模型,如果你想批量修改每个 Mesh 的材质,一个一个设置比较麻烦,可以通过递归遍历方法.traverse()批量操作更加方便

递归遍历方法.traverse()

递归遍历 gltf 所有的模型节点

js
// 递归遍历所有模型节点批量修改材质
gltf.scene.traverse(function (obj) {
  if (obj.isMesh) {
    //判断是否是网格模型
    console.log('模型节点', obj);
    console.log('模型节点名字', obj.name);
  }
});

查看 gltf 默认的材质

.obj、.gltf、.fbx 等不同格式的模型,threejs 加载默认的材质可能不同,不过也不用刻意记忆,通过浏览器控制台 log 打印即可 console.log(obj.material)

threejs 解析 gltf 模型默认材质一般是 MeshStandardMaterial 或 MeshPhysicalMaterial,相比较其它网格材质,这两个材质属于 PBR 物理材质,可以提供更加真实的材质效果

js
// 递归遍历所有模型节点批量修改材质
gltf.scene.traverse(function (obj) {
  if (obj.isMesh) {
    console.log('gltf默认材质', obj.material);
  }
});

批量修改 gltf 所有 Mesh 的材质

js
gltf.scene.traverse(function (obj) {
  if (obj.isMesh) {
    // 重新设置材质
    obj.material = new THREE.MeshLambertMaterial({
      color: 0xffffff,
    });
  }
});

上次更新于: