threejs根据接口状态更换物体颜色
问题
需求是根据接口返回的状态来修改物体A的颜色,但在实际操作中,发现物体A颜色成功修改,但物体B的颜色也变了,代码如下
let model = XXX; // 导入的物体 object.scene
const changePumpColor = () => {
const nameNode = model.getObjectByName('xxx');
setObject3DColor(nameNode, 0xad191f)
}
const setObject3DColor = (object, newColor) => {
if (object.isMesh) {
// 直接赋值会导致使用相同材质的物体颜色跟着改变
object.material.color = newColor;
}
for (let i = 0; i < object.children.length; i++) {
setObject3DColor(object.children[i], newColor);
}
}
threejs中的网格物体对材质的是引用传递,不是值传递,如果material1 被 mesh1和mesh2用到了,改变 mesh1.material.color,则mesh2的材质颜色也改了。
结论很明显就是在解析obj模型的时候,所有的储位模型都用了同一个material,所以我们需要给要修改的物体重新赋一个材质,修改代码如下即可:
let model = XXX; // 导入的物体 object.scene
const changePumpColor = () => {
const nameNode = model.getObjectByName('xxx');
setObject3DColor(nameNode, 0xad191f)
}
const setObject3DColor = (object, newColor) => {
if (object.isMesh) {
object.material = new THREE.MeshLambertMaterial({
color: new THREE.Color(newColor),
});
}
for (let i = 0; i < object.children.length; i++) {
setObject3DColor(object.children[i], newColor);
}
}

浙公网安备 33010602011771号