Three飞线动画(运动轨迹)

效果图

1.初始化场景

onMounted(() => {
  line()
})

let index = 0; //取索引值的点的位置
let num = 20; //从曲线上获取的数量
let points1, newLine1, bufferGeometry1;
let points2, newLine2, bufferGeometry2;



function line() {

}

2.场景中加入一条三维曲线

function line(){
  //创建一条平滑的三维曲线 给三个点  起始 中间  结尾
  const drawPointList1 = new THREE.CatmullRomCurve3([
    new THREE.Vector3(0, 20, -110),
    new THREE.Vector3(30, 35, -75),
    new THREE.Vector3(60, 20, 0)
  ])

  //平分为100段,分的越多曲线越丝滑
  points1 = drawPointList1.getPoints(101)

  //   创建曲线 设置材质
  let line1 = new THREE.Line(new THREE.BufferGeometry().setFromPoints(points1), new THREE.LineBasicMaterial({ color: "#fff" })); // 构建三维曲线

  //   加入场景
  scene.add(line1);

}

3.截取曲线片段并渲染材质

  newLine1 = new THREE.CatmullRomCurve3(points1.slice(index, index + num));//使用截取的片段点作为参数重新生成一条曲线
  newLine1.getSpacedPoints(1000); //细分成100个点
  var percentArr = [];
  for (var i = 0; i < newLine1.length; i++) {
    percentArr.push(i / newLine1.length);
  }
  var percentAttribue = new THREE.BufferAttribute(
    new Float32Array(percentArr),
    1
  );
  var colorArr = [];
  for (var i = 0; i < 101; i++) {
    var color1 = new THREE.Color(0xffffff);
    var color2 = new THREE.Color(0x59BE3E);
    var color = color1.lerp(color2, i / 101);
    colorArr.push(color.r, color.g, color.b);
  }
  bufferGeometry1 = new THREE.BufferGeometry().setFromPoints(newLine1);//创建用于管理几何体的顶点数据,并设置点队列
  bufferGeometry1.attributes.percent = percentAttribue;
  bufferGeometry1.attributes.color = new THREE.BufferAttribute(new Float32Array(colorArr), 3);
  const PointsMaterial = new THREE.PointsMaterial({  //创建点材质
    size: 1.0, //点大小
    vertexColors: true, //使用顶点颜色渲染
  });
  
  //加入场景
  scene.add(new THREE.Points(bufferGeometry1, PointsMaterial));

4.循环执行,使线动起来

function animate() {
  requestAnimationFrame(animate);
  renderer.render(scene, camera);
  moveOnCurve()
}

function moveOnCurve() {
  if (index <= 99) {
    index += 1
    bufferGeometry1.setFromPoints(new THREE.CatmullRomCurve3(points1.slice(index, index + num)).getSpacedPoints(100));
  } else {
    index = 0
  }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
想要实现完整的飞线动画,可以通过以下步骤: 1. 创建一个空的 GameObject,命名为 "FlightPath",作为整个飞线动画的父物体。 2. 在 FlightPath 下创建两个子物体,分别为 "StartPoint" 和 "EndPoint",用于标记起点和终点位置。 3. 在 StartPoint 上添加一个 LineRenderer 组件,设置其材质颜色、线宽、起点位置等属性。 4. 编写脚本,在 Update 函数中使用 Mathf.Lerp 方法,根据时间变化计算当前位置,将 LineRenderer 的终点位置设置为当前位置。 5. 当当前位置接近终点位置时,将 LineRenderer 的终点位置设置为终点位置,并停止更新。 以下是示例代码: ```c# using UnityEngine; public class FlightPathController : MonoBehaviour { public Transform startPoint; public Transform endPoint; public float duration = 3f; public float lineWidth = 0.1f; public Material material; private LineRenderer lineRenderer; private float elapsedTime = 0f; private void Start() { lineRenderer = gameObject.AddComponent<LineRenderer>(); lineRenderer.material = material; lineRenderer.startWidth = lineWidth; lineRenderer.endWidth = lineWidth; lineRenderer.positionCount = 2; lineRenderer.SetPosition(0, startPoint.position); lineRenderer.SetPosition(1, startPoint.position); } private void Update() { elapsedTime += Time.deltaTime; float t = Mathf.Clamp01(elapsedTime / duration); Vector3 currentPosition = Vector3.Lerp(startPoint.position, endPoint.position, t); lineRenderer.SetPosition(1, currentPosition); if (t >= 1f) { lineRenderer.SetPosition(1, endPoint.position); enabled = false; } } } ``` 在实际使用时,可以将该脚本挂载到 FlightPath 父物体上,指定起点和终点位置,调整 duration、lineWidth、material 等属性即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值