3.6 节点 贝塞尔曲线运动

从别人那抄的 我要再发一遍 :stuck_out_tongue_winking_eye:, 我用的是 3.6.2 引擎,官方把这个从2.x里移除了真是太不方便了, 所以翻了论坛, 别人那抄了一个,还行我自己发一遍,不然找不到了,也让大家学习学习(抄袭抄袭 :sweat_smile: :rofl:),我们程序员最喜欢的,ctrl c v 拿去把

使用: 放在哪,xxx就是哪,然后传各个参数.
调用xxx.bezierTo(node,time,p1,cp,p2,null).start();
返回的是一个tween 所以一定要start(),否则没有效果;
返回的是一个tween 所以一定要start(),否则没有效果;
返回的是一个tween 所以一定要start(),否则没有效果;

/**
     * @desc 三阶阶贝塞尔
     * @param {number} duration 归一量百分比
     * @param {Vec3} p1 起点坐标
     * @param {Vec3} cp 控制点
     * @param {Vec3} p2 终点坐标
     * @param {object} opts 
     * @returns {any}
     */
    public static bezierTo(target: any, duration: number, p1: Vec3, cp: Vec3, p2: Vec3, opts?: any): Tween<any> {
        opts = opts || Object.create(null);
        let twoBezier = (t: number, p1: Vec3, cp: Vec3, p2: Vec3) => {
            let x = (1 - t) * (1 - t) * p1.x + 2 * t * (1 - t) * cp.x + t * t * p2.x;
            let y = (1 - t) * (1 - t) * p1.y + 2 * t * (1 - t) * cp.y + t * t * p2.y;
            let z = (1 - t) * (1 - t) * p1.z + 2 * t * (1 - t) * cp.z + t * t * p2.z;
            return new Vec3(x, y, z);
        };
        opts.onUpdate = (_arg: Vec3, ratio: number) => {
            target.position = twoBezier(ratio, p1, cp, p2);
        };
        return tween(target).to(duration, {}, opts);
    }
7赞