You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Three.js中遍历材质并为指定名称材质分配新纹理?

解决Three.js中按材质名称查找并替换纹理的问题

要实现不依赖索引、通过名称匹配找到目标材质,核心是统一处理单材质/多材质的情况,然后遍历材质集合匹配名称:

修正后的代码

object.traverse(function(node) {
  if (node.isMesh) {
    // 将材质统一转为数组,兼容单材质(Material)和多材质(Material[])的情况
    const materials = Array.isArray(node.material) ? node.material : [node.material];
    
    // 遍历所有材质,找到名称为'COIN'的目标
    materials.forEach((mat, index) => {
      if (mat.name === 'COIN') {
        // 分两种情况处理:
        // 1. 如果是多材质数组,替换对应索引的材质
        if (Array.isArray(node.material)) {
          node.material[index] = textura;
        } 
        // 2. 如果是单材质,直接替换
        else {
          node.material = textura;
        }
        // 找到目标后跳出循环,避免不必要的遍历
        return;
      }
    });
  }
});

关键说明

  • Three.js中Mesh的material属性可能是单个Material对象或Material数组(多材质Mesh),所以第一步要统一转为数组,避免直接索引导致的报错。
  • 遍历材质数组时,通过mat.name === 'COIN'精准匹配目标材质,完全脱离固定索引的依赖。
  • 替换时要区分单/多材质场景:如果是多材质数组,不能直接覆盖整个node.material,否则会丢失其他材质,只需替换对应索引的元素即可。

内容的提问来源于stack exchange,提问作者Nicoli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:52:03