问题:当我选中其中某个网格模型并设置color的时候,相同种类的颜色都被改变,但是打印我选中的网格模型数据其实只有一个。
导致问题的原因:
加载Blender模型修改材质颜色
Blender创建一个模型对象,设置颜色,然后通过快捷键Shift + D
复制模型对象时候,导出测试。
先通过模型name
获取模型节点,然后修改颜色,这时候你发现,所有模型mesh的颜色都更改了,其实原因很简单,Blender创建模型时候共享了材质。
Blender取消材质共享
Blender通过快捷键Shift + D
复制模型对象时候,材质是默认共享的。
如果你想取消材质共享,可以新建一个材质覆盖原来的。
gltf.scene.traverse(function(obj){if(obj.isMesh){// 材质对象执行克隆方法clone()会返回一个新的材质对象obj.material = obj.material.clone();}
})
// 这种情况下,你修改任何一栋楼材质颜色,其他楼材质颜色不受影响
const mesh = gltf.scene.getObjectByName('立方体')
mesh.material.color.set(0x00ffff)
const model = new THREE.Group();loader.load("./modelZH.glb", (gltf) => {var group = gltf.scene.getObjectByName("粮仓");group.traverse((obj) => {if (obj.type === "Mesh") {obj.material = obj.material.clone(); //克隆材质,避免后面改变颜色相同材质一起变meshList.push(obj); //把所有可被选择的模型放进数组里const label = tag(obj.name);var pos = new THREE.Vector3();obj.getWorldPosition(pos); //获取obj世界坐标、if (obj.parent.name == "立筒仓") {pos.y += 36; //加上粮仓顶部高度} else if (obj.parent.name == "浅圆仓") {pos.y += 20;} else if (obj.parent.name == "平房仓") {pos.y += 17;}label.position.copy(pos);model.add(label);}});model.add(gltf.scene);scene.add(model);});