JS——曲线轨迹动画

方法一、贝塞尔曲线算法,包含了3阶贝塞尔

/**
 * @desc 贝塞尔曲线算法,包含了3阶贝塞尔
 */
class Bezier {
    /**
     * @desc 获取点,这里可以设置点的个数
     * @param {number} num 点个数
     * @param {Array} p1 点坐标
     * @param {Array} p2 点坐标
     * @param {Array} p3 点坐标
     * @param {Array} p4 点坐标
     * 如果参数是 num, p1, p2 为一阶贝塞尔
     * 如果参数是 num, p1, c1, p2 为二阶贝塞尔
     * 如果参数是 num, p1, c1, c2, p2 为三阶贝塞尔
     */
    getBezierPoints(num = 100, p1, p2, p3, p4) {
        let func = null;
        const points = [];
        if (!p3 && !p4) {
            func = this.oneBezier;
        } else if (p3 && !p4) {
            func = this.twoBezier;
        } else if (p3 && p4) {
            func = this.threeBezier;
        }
        for (let i = 0; i < num; i++) {
            points.push(func(i / num, p1, p2, p3, p4));
        }
        if (p4) {
            points.push([...p4]);
        } else if (p3) {
            points.push([...p3]);
        }
        return points;
    }

    /**
     * @desc 一阶贝塞尔
     * @param {number} t 当前百分比
     * @param {Array} p1 起点坐标
     * @param {Array} p2 终点坐标
     */
    oneBezier(t, p1, p2) {
        const [x1, y1] = p1;
        const [x2, y2] = p2;
        let x = x1 + (x2 - x1) * t;
        let y = y1 + (y2 - y1) * t;
        return [x, y];
    }

    /**
     * @desc 二阶贝塞尔
     * @param {number} t 当前百分比
     * @param {Array} p1 起点坐标
     * @param {Array} p2 终点坐标
     * @param {Array} cp 控制点
     */
    twoBezier(t, p1, cp, p2) {
        const [x1, y1] = p1;
        const [cx, cy] = cp;
        const [x2, y2] = p2;
        let x = (1 - t) * (1 - t) * x1 + 2 * t * (1 - t) * cx + t * t * x2;
        let y = (1 - t) * (1 - t) * y1 + 2 * t * (1 - t) * cy + t * t * y2;
        return [x, y];
    }

    /**
     * @desc 三阶贝塞尔
     * @param {number} t 当前百分比
     * @param {Array} p1 起点坐标
     * @param {Array} p2 终点坐标
     * @param {Array} cp1 控制点1
     * @param {Array} cp2 控制点2
     */
    threeBezier(t, p1, cp1, cp2, p2) {
        const [x1, y1] = p1;
        const [x2, y2] = p2;
        const [cx1, cy1] = cp1;
        const [cx2, cy2] = cp2;
        let x =
            x1 * (1 - t) * (1 - t) * (1 - t) +
            3 * cx1 * t * (1 - t) * (1 - t) +
            3 * cx2 * t * t * (1 - t) +
            x2 * t * t * t;
        let y =
            y1 * (1 - t) * (1 - t) * (1 - t) +
            3 * cy1 * t * (1 - t) * (1 - t) +
            3 * cy2 * t * t * (1 - t) +
            y2 * t * t * t;
        return [x, y];
    }
}

export default new Bezier();

生成轨迹

bezier.getBezierPoints(dotNumber, p1, p2,p3)

1. 方法二、css3

贝塞尔取值工具

@keyframes top{
	0%{
		bottom: 0;
	}
	100%{
		bottom: 200px;
	}
}

@keyframes right{
	0%{
		right: 0;
	}
	100%{
		right: -200px;
	}
}

.anistyle{
	animation: top 1s linear,right 1s cubic-bezier(.69,.01,1,.41);
	animation-fill-mode: forwards;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Three.js 是一个用于在浏览器中创建 3D 图形的 JavaScript 库。Three.js 中可以使用 AnimationMixer 类来创建动画。为了创建轨迹动画,我们需要以下步骤: 1. 定义轨迹:创建一个路径,例如一个贝塞尔曲线或一组。 2. 定义动画:使用 Three.js 的 AnimationMixer 类创建一个动画对象。 3. 绑定轨迹动画:将轨迹绑定到动画对象上。 4. 播放动画:使用 AnimationMixer 的 update() 方法更新动画,并将结果渲染到布上。 以下是示例代码: ```javascript // 创建场景、渲染器、相机等 var scene = new THREE.Scene(); var renderer = new THREE.WebGLRenderer(); var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000); camera.position.z = 50; renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 定义轨迹 var curve = new THREE.CatmullRomCurve3([ new THREE.Vector3(-10, 0, 0), new THREE.Vector3(-5, 5, 5), new THREE.Vector3(0, 0, 10), new THREE.Vector3(5, -5, 5), new THREE.Vector3(10, 0, 0) ]); // 定义动画 var mixer = new THREE.AnimationMixer(scene); var animation = new THREE.AnimationClip('animation', -1, [ new THREE.VectorKeyframeTrack('.position', [0, 5], curve.getPoints(2).flat()) ]); var action = mixer.clipAction(animation); // 播放动画 animate(); function animate() { requestAnimationFrame(animate); mixer.update(0.01); renderer.render(scene, camera); } ``` 在上面的代码中,我们使用 CatmullRomCurve3 创建了一个路径,然后将其传递给 AnimationClip 的 VectorKeyframeTrack 类来定义动画。在 animate() 函数中,我们使用 AnimationMixer 的 update() 方法更新动画,并使用渲染器将场景渲染到布上。 你可以根据自己的需求修改轨迹动画的定义,以创建不同的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值