问题如题,有大佬知道么,求指教。
我想问下是因为t是从哪里来的参数,可能我不太懂unity相关的语言代码,看的有点懵逼
t是进度,0-1区间。0的时候是起点,1的时候是终点。
比如下图TS版本的二阶贝塞尔,v1就是下面效果图里的起点P0,v2为控制点P1,v3为终点P2。


1赞
那t我只传0应该是可以的吧
贝赛尔曲线运动 还有个问题 不是匀速的
只传0是返回起点,如果需要输出一段路径肯定不止一个点吧,根据需求来。
直接用 好使的很兄弟
/**
* 一个简单的贝塞尔曲线的运动
*/
public static easyBezierRun(startPos: Vec3, endPos: Vec3, controlPos1: Vec3, controlPos2: Vec3, runNode: Node, runTime: number, updateCallF: Function, onCompleteCallF: Function) {
// 三维空间的缓动
const bezierCurve = (t: number, p1: Vec3, cp1: Vec3, cp2: Vec3, p2: Vec3, out: Vec3) => {
out.x = bezier(p1.x, cp1.x, cp2.x, p2.x, t);
out.y = bezier(p1.y, cp1.y, cp2.y, p2.y, t);
out.z = bezier(p1.z, cp1.z, cp2.z, p2.z, t);
}
const tempVec3 = v3();
tween(runNode)
.to(runTime, { position: endPos }, { //其实这里是在onUpdate里面去重新设置了节点的坐标
onUpdate: (target, ratio) => {
bezierCurve(ratio, startPos, controlPos1, controlPos2, endPos, tempVec3);
runNode.setPosition(tempVec3)
updateCallF(tempVec3, ratio, target)
},
onStart(target) {
},
onComplete(target) {
onCompleteCallF(target)
},
})
.start();
}
2赞
我只有一个controlPos1 ,不需要controlPos2的话,代码里用到controlPos2的地方改成controlPos1也不影响效果吧
可以的 c2也用c1
好的我试试,我想问能做匀速么
感谢大佬,实现了
想实现匀速化运动,要有如下步骤
1.对整段贝塞尔曲线进行积分,获取总长度。
2.根据移动速度以及当前移动时间,求得当前移动的长度。
3.根据实际移动长度,反推出当前移动的进度t。
4.根据进度t,计算出当前所处的点的位置,以及方向等。
这其中,以第一步和第三步最重要,基本都是用数值化的方法来求解的。
这个也很强
好家伙,你怎么知道我会黑屏 
sprite设置平铺,太多的话会报错 
头像好可爱啊,啊哈哈哈
