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);
  }
}
posted @ 2024-11-21 15:18  ZerlinM  阅读(194)  评论(0)    收藏  举报