从别人那抄的 我要再发一遍
, 我用的是 3.6.2 引擎,官方把这个从2.x里移除了真是太不方便了, 所以翻了论坛, 别人那抄了一个,还行我自己发一遍,不然找不到了,也让大家学习学习(抄袭抄袭
),我们程序员最喜欢的,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);
}