Skip to content
章节导航

模型点击高亮效果

js
let color = 0xff0000;
let prevObject;
export function clearhighlightColor() {
  if (prevObject?.originalMaterial) {
    prevObject.material = prevObject.originalMaterial;
    prevObject.clickToHighlight = false;
    delete prevObject.originalMaterial;
  }

  prevObject = '';
}

export function clickhighlightColor(clickObj) {
  clickObj.clickToHighlight = true; // clickToHighlight为true时 报警闪烁不执行
  if (clickObj.material instanceof Array) {
    clickObj.originalMaterial = clickObj.material; // 保存原始材质
    clickObj.material = clickObj.material.map((child) => child.clone()); // 防止修改到所有依赖这个material的模型
    clickObj.material.forEach((child) => {
      child.transparent = false; // 报警时点击模型 取消模型闪烁对点击模型的影响
      child.color.set(color);
    });
  } else {
    clickObj.originalMaterial = clickObj.material; // 保存原始材质
    clickObj.material = clickObj.material.clone(); // 防止修改到所有依赖这个material的模型
    clickObj.material.transparent = false; // 报警时点击模型 取消模型闪烁对点击模型的影响
    clickObj.material.color.set(color);
  }
  prevObject = clickObj;
}
      
// 在场景中添加点击事件 通过射线取到模型并对模型进行点击高亮的操作
document.addEventListener('click', onDocumentMouseDown, false);
function onDocumentMouseDown(event) {
  // event 点击事件的参数 (防止二维页面事件穿透)
  if (event.target.id !== 'north') {
    return;
  }

  mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
  raycaster.setFromCamera(mouse, camera);
  // TODO: concat 生成新数组 可能引起内存泄漏
  const intersects = raycaster.intersectObjects(intersectsObjs.concat([window.tipObj]), true);
  clearhighlightColor();
  if (intersects.length > 0) {
    // 可以在这个地方对需要点击高亮的模型做限制
    clickhighlightColor(intersects[0].object);
  } else {
  }
  window.renderer.render(window.scene, camera);
}