如何在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
相关产品推荐
相关产品推荐

