ThreeJs实现发光描边

        在很多数字孪生场景中会有交互操作,比如选中一个物体,但是为了很好的凸显选中的物体一般会有几种效果,比如将选中的物体向上移动一定的距离,或者是改变选中模型对象的颜色,这两种实现方式都是通过改变模型的属性,一个是改变position的值,另一个是改变material的color属性,今天这里要说的是第三种方式,给物体添加发光描边,也是很多数字孪生场景经常用到的一种方式。发光描边的实现需要引入几个组件,分别是EffectComposer,RenderPass和OutlinePass。

        EffectComposer是Threejs的一个工具,它允许在场景渲染完毕后再增加一些特效,如让场景在某些情况下变得更加模糊或者更加鲜艳,增加滤镜或者闪烁效果,使扫描线添加老旧电视屏幕上的效果等。EffectComposer可以向其添加多个Pass对象,处理通道以产生最终的视觉效果。每个Pass可以是一些后期处理效果,如添加晕影,模糊,应用绽放,应用胶片颗粒,调整色调,饱和度,对比度等。

        RenderPass是ThreeJs的一个通道,他会在当前场景和摄像机的基础上渲染出一个新场景,这个通道只会渲染场景,但不会把结果输出到场景上。

        OutlinePass是ThreeJs的一个后处理效果,它用于在渲染的场景中添加轮廓线,这种效果通常用于突出显示场景中的特定对象或区域,OutlinePass可以设置轮廓线的颜色,样式,宽度等。

        使用前先引入三个组件,

import {RenderPass} from 'three/examples/jsm/postprocessing/RenderPass';
import {OutlinePass} from 'three/examples/jsm/postprocessing/OutlinePass';
import {EffectComposer} from 'three/examples/jsm/postprocessing/EffectComposer';

为了更好的展示效果,我们现在场景中添加一个正方体,然后在正方体的轮廓上添加发光描边效果:

 // 立方体
    initCube() {
      const geometry = new THREE.BoxGeometry(2, 2, 2);
      const material = new THREE.MeshBasicMaterial({color: 0x00ffff});
      this.cube = new THREE.Mesh(geometry, material);
      this.scene.add(this.cube);
      this.camera.position.z = 5;
    },
//给正方体添加描边效果
initOutlinePass() {
      let renderScene = new RenderPass(this.scene, this.camera);
      let outlinePass = new OutlinePass(
          new THREE.Vector2(window.innerWidth, window.innerHeight),
          this.scene,
          this.camera,
          [this.cube]
      );
      // 将此通道结果渲染到屏幕
      outlinePass.renderToScreen = true
      outlinePass.edgeGlow = 1 // 发光强度
      outlinePass.usePatternTexture = false // 是否使用纹理图案
      outlinePass.edgeThickness = 10 // 边缘浓度
      outlinePass.edgeStrength = 10 // 边缘的强度,值越高边框范围越大
      outlinePass.pulsePeriod = 2// 闪烁频率,值越大频率越低
      outlinePass.visibleEdgeColor.set('#ffff00') // 呼吸显示的颜色
      outlinePass.hiddenEdgeColor.set('#ff0000') // 不可见边缘的颜色
      // 将通道加入组合器
      this.composer = new EffectComposer(this.renderer);
      this.composer.addPass(renderScene);
      this.composer.addPass(outlinePass);
    },
    //在渲染中添加渲染
    requestAnimationFrame() {
      this.composer.render();
      requestAnimationFrame(this.requestAnimationFrame);
    },

效果如下:

模型发光描边效果

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

baker_zhuang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值