threeJs 实现路径移动/飞线效果/拖尾效果

在threejs实现路径移动很简单,也是类似飞线效果,拖尾效果
先来看看效果

路径移动

首先我们先生成路径

// 先生成起始点和终止点
// 起始点
    const source = new THREE.Vector3(
      options.source.x,
      options.source.y,
      options.source.z,
    )
    // 终止点
    const target = new THREE.Vector3(
      options.target.x,
      options.target.y,
      options.target.z,
    )

然后添加曲线设置

    const curve = new THREE.QuadraticBezierCurve3(
      source, center, target
    )

计算点的个数

const len = parseInt(source.distanceTo(target));
const points = curve.getPoints(len);
const positions = []
const aPositions = []
points.forEach((item, index) => {
      positions.push(item.x, item.y, item.z)
      aPositions.push(index)
    })

接下来重点,着色器材质的编写(拖尾效果)

// 顶点着色器
attribute float a_position;
        
        uniform float u_time;
        uniform float u_size;
        uniform float u_range;
        uniform float u_total;
      
        varying float v_opacity;
        
        void main() {
           float size = u_size;
           float total_number = u_total * mod(u_time, 1.0);
           
           if (total_number > a_position && total_number < a_position + u_range) {
           
             // 拖尾效果
             float index = (a_position + u_range - total_number) / u_range;
             size *= index;
             
             
             v_opacity = 1.0;
           } else {
             v_opacity = 0.0;
           }
           
           gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
           gl_PointSize = size / 10.0;
        }
// 片元着色器
uniform vec3 u_color;
        varying float v_opacity;
        
        void main() {
          gl_FragColor = vec4(u_color, v_opacity);
        }

然后就可以大功告成了

这是完整代码,有需要的同学自行下载吧

完整代码下载地址

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现这个效果,可以使用 Three.js 中的 `Raycaster` 和 `Points` 对象。 首先,创建一个 `Points` 对象,将其作为光点的容器。然后,创建一个 `Raycaster` 对象,用于检测鼠标是否滑过了某根飞线。当检测到鼠标滑过时,将光点的位置设置为飞线的终点位置,并将光点添加到 `Points` 对象中。 以下是示例代码: ```javascript const raycaster = new THREE.Raycaster(); const mouse = new THREE.Vector2(); const pointsGeometry = new THREE.Geometry(); const pointsMaterial = new THREE.PointsMaterial({ color: 0xffffff, size: 10 }); const points = new THREE.Points(pointsGeometry, pointsMaterial); // 创建飞线 const line = new THREE.Line(geometry, material); scene.add(line); // 监听鼠标移动事件 window.addEventListener('mousemove', onMouseMove, false); function onMouseMove(event) { // 计算鼠标在屏幕上的位置 mouse.x = (event.clientX / window.innerWidth) * 2 - 1; mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; // 使用 Raycaster 进行鼠标检测 raycaster.setFromCamera(mouse, camera); const intersects = raycaster.intersectObject(line); if (intersects.length > 0) { // 获取飞线的终点位置 const endPosition = intersects[0].point; // 将光点的位置设置为飞线的终点位置 pointsGeometry.vertices.push(endPosition); pointsGeometry.verticesNeedUpdate = true; // 将光点添加到场景中 scene.add(points); } } ``` 需要注意的是,这个效果可以消耗大量的性能,因为每次鼠标移动都会重新计算光点的位置。如果需要优化性能,可以考虑限制检测的频率,或者使用其他更高效的方法实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ifHappyEveryDay@

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

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

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

打赏作者

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

抵扣说明:

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

余额充值