FlyLine.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import * as THREE from 'three';
  2. import gsap from 'gsap';
  3. export const flyLine = (lineArray, imgUrl, lineWidth = 0.2) => {
  4. // 创建纹理加载器
  5. const textureLoader = new THREE.TextureLoader();
  6. const texture = textureLoader.load(imgUrl);
  7. // 调整纹理为单面的宽度
  8. texture.repeat = new THREE.Vector2(1, 2);
  9. // console.log(texture);
  10. texture.wrapS = THREE.RepeatWrapping;
  11. // 设置纹理为镜像重复
  12. // texture.wrapT = THREE.RepeatWrapping;
  13. texture.wrapT = THREE.MirroredRepeatWrapping;
  14. // 创建管道几何体
  15. // 1-创建曲线几何体
  16. const lineCurve = new THREE.CatmullRomCurve3(lineArray);
  17. // 2-根据曲线获取曲线上的点
  18. // const linePoints = lineCurve.getPoints(100);
  19. // 3-根据点生成几何体
  20. const geometry = new THREE.TubeBufferGeometry(lineCurve, 100, lineWidth, 2, false);
  21. // 飞线材质设置
  22. const material = new THREE.MeshBasicMaterial({
  23. // color: 0xfff000,
  24. map: texture,
  25. transparent: true,
  26. side: THREE.DoubleSide,
  27. depthWrite: false,
  28. blending: THREE.AdditiveBlending,
  29. });
  30. const mesh = new THREE.Mesh(geometry, material);
  31. gsap.to(texture.offset, {
  32. x: -0.8,
  33. duration: 1,
  34. repeat: -1,
  35. ease: 'none',
  36. });
  37. return mesh;
  38. };