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

Three.js Raycaster问题:如何仅让被射线触碰的盒子变为粉色

Three.js Raycaster射线检测异常修复方案

问题根源

你创建的三个盒子共用了同一个MeshStandardMaterial实例。Three.js中材质是可共享资源,修改任意一个盒子的material.color时,所有使用该材质的物体都会同步变化,这就是所有盒子颜色同步改变的原因。

修复方案

需要为每个盒子创建独立的材质实例,有两种实现方式:

方式1:直接创建独立材质

修改几何体与材质的创建代码,给每个盒子分配单独的材质:

//GEOMETRIES
const boxGeo=new THREE.BoxGeometry(2,2)
// 为每个盒子单独实例化材质
const boxMat1=new THREE.MeshStandardMaterial()
const boxMat2=new THREE.MeshStandardMaterial()
const boxMat3=new THREE.MeshStandardMaterial()
const box1=new THREE.Mesh(boxGeo,boxMat1)
const box2=new THREE.Mesh(boxGeo,boxMat2)
const box3=new THREE.Mesh(boxGeo,boxMat3)

方式2:克隆基础材质

如果需要基于同一套基础材质配置(比如统一设置金属度、粗糙度),可以使用clone()方法复制材质:

//GEOMETRIES
const boxGeo=new THREE.BoxGeometry(2,2)
const baseMat=new THREE.MeshStandardMaterial({
  // 可统一配置材质属性,如 metalness: 0.5
})
const box1=new THREE.Mesh(boxGeo, baseMat.clone())
const box2=new THREE.Mesh(boxGeo, baseMat.clone())
const box3=new THREE.Mesh(boxGeo, baseMat.clone())

效果验证

修复后,每次tick函数执行时:

  1. 先将所有盒子材质重置为蓝色
  2. 再将射线击中的盒子材质设为粉色
    此时只有被射线触碰的盒子会显示粉色,其余保持蓝色,初始状态也只会有射线击中的盒子(box2)显示粉色。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:45:34