ThreeJs鼠标经过添加边框

ThreeJs鼠标经过添加边框

import {
  EdgesGeometry,
  Intersection,
  LineBasicMaterial,
  LineSegments,
  Object3D
} from 'three'

// 画布移动选中模型
const moveObject = ref()

// 定义了一个名为highlightMaterial的变量,它是一个LineBasicMaterial对象,用于给选中的模型添加红色边框。颜色为红色(0x1890ff),线宽为5。
const highlightMaterial = new LineBasicMaterial({ color: 0xffffff, linewidth: 5 })

/**
 * @description: 鼠标移动事件
 * @return {*}
 */
const handleMousemove = (_event: MouseEvent, intersect: Intersection): void => {
  const remove = () => {
    moveObject.value?.traverse((child: Object3D) => {
      if (!moveObject.value) return
      if (child instanceof LineSegments) {
        // 处理材质。材质的纹理不会被处理。需要通过Texture处理
        child.material.dispose()
        child.geometry.dispose()
        moveObject.value?.remove(child)
      }
    })
  }
  if (intersect) {
    // 删除模型边框
    remove()

    // 给模型添加边框
    moveObject.value = intersect.object
    const edges = new EdgesGeometry((intersect.object as Mesh).geometry)
    const line = new LineSegments(edges, highlightMaterial)
    intersect.object.add(line)
  } else {
    remove()
  }
}

### Three.js 中实现选中模型高亮并显示边框 为了在Three.js项目中实现当用户点击某个3D模型时该模型能够被高亮并且周围有明显边框的效果,可以通过整合`EffectComposer`与`OutlinePass`来达成这一目标。此过程涉及到了多个方面的设置和调整。 #### 创建 WebGL 渲染器以及 Effect Composer 首先需要初始化WebGL渲染环境,并开启一些必要的特性以便更好地展示效果: ```javascript // 初始化WebGLRenderer对象,配置抗锯齿等功能以提高视觉质量 let renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, logarithmicDepthBuffer: true // 解决某些情况下可能出现的模型闪烁问题 }); ``` 接着创建用于管理各种后处理特效的容器——`EffectComposer`实例[^3]: ```javascript // 使用之前定义好的renderer作为参数构建EffectComposer let composer = new EffectComposer(renderer); ``` #### 添加 Render Pass 和 Outline Pass 为了让场景正常绘制出来,在`composer`里加入基本的渲染通道(`RenderPass`)之后再添加专门负责生成轮廓线效果的`OutlinePass`: ```javascript import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'; import { OutlinePass } from 'three/examples/jsm/postprocessing/OutlinePass'; // 定义scene和camera供后续pass使用 const renderScene = new RenderPass(scene, camera); // 设置outline pass的相关选项,比如边缘宽度、颜色等 const outlineParams = { edgeStrength: 3.0, visibleEdgeColor: 0xffffff, hiddenEdgeColor: 0x00ff00 }; const effectOutline = new OutlinePass(new THREE.Vector2(window.innerWidth, window.innerHeight), scene, camera, outlineParams); // 将上述两个pass依次添加到composer当中去 composer.addPass(renderScene); composer.addPass(effectOutline); effectOutline.renderToScreen = true; ``` #### 处理鼠标事件选择物体 最后一步就是监听用户的交互行为(例如点击),找到对应的几何体并将它标记为当前选定的对象之一,从而触发高亮逻辑: ```javascript function onMouseClick(event){ event.preventDefault(); const mouse = new THREE.Vector2( (event.clientX / window.innerWidth) * 2 - 1, -(event.clientY / window.innerHeight) * 2 + 1 ); raycaster.setFromCamera(mouse, camera); var intersects = raycaster.intersectObjects(objects); if(intersects.length>0){ selectedObject = intersects[0].object; // 更新outlineObj中的selectedObjects列表 outlineObj([selectedObject]); // 调用composer进行最终的画面合成输出 animate(); } } ``` 以上代码片段展示了如何基于Three.js框架结合Vue3或React等前端技术栈快速搭建起具备良好用户体验特性的三维应用界面,其中包含了对特定元素实施突出强调的技术方案[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

细心细心细心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值