实现思路:
首先要说一下曲线的路径,我这里所用的方法是通过一段段连接的贝塞尔曲线拼接而成,紧接着就要获取曲线上的点了,直接套用二阶贝塞尔曲线公式求得,这里贴一下曲线的原理和公式(具体细节请各位自行谷歌),如下:
二阶曲线由两个数据点(P0 和 P2),一个控制点(P1)来描述曲线状态,从而计算动点B:
这里为了实现匀速运动,需要一个求t的公式算法来达到匀速的目的,这里需要使用牛顿切线法求出近似解,同时通过牛顿切线法得到某一个点的导数,比如我的球在沿着曲线运动时,可以正常的旋转一定的角度。
关于t的推导公式,我这里借鉴了一位大神的帖子,迭代算法公式为:
L(t)函数的推导公式如下:
这样,当贝塞尔曲线的长度间距无限小时,得出的t值,也是相对于比较精确的。
来源链接:https://blog.csdn.net/linuxheik/article/details/79454663399
(大神已经贴了完整的代码,可以直接参考)
有了这个,就好办了,拿到点以后,看似复杂的曲线,现在就可以看成是一条“直线”了,在直线上实现一个物体的加速度、减速度、匀速等运动,应该算很easy了。
注意:连接之后,每个连接点处,会重复一个额外的点,在代码上,需要考虑删去一个多余的重复点,简单点说,就是:去重。否则球运动到此时会多顿一下。
路径的生成,
我还特地做了一个贝塞尔曲线工具编辑器,如图:
请点击,传送门:
https://forum.cocos.com/t/topic/73416
来源于
实现思路:
首先要说一下曲线的路径,我这里所用的方法是通过一段段连接的贝塞尔曲线拼接而成,紧接着就要获取曲线上的点了,直接套用二阶贝塞尔曲线公式求得,这里贴一下曲线的原理和公式(具体细节请各位自行谷歌),如下:
二阶曲线由两个数据点(P0 和 P2),一个控制点(P1)来描述曲线状态,从而计算动点B:
这里为了实现匀速运动,需要一个求t的公式算法来达到匀速的目的,这里需要使用牛顿切线法求出近似解,同时通过牛顿切线法得到某一个点的导数,比如我的球在沿着曲线运动时,可以正常的旋转一定的角度。
关于t的推导公式,我这里借鉴了一位大神的帖子,迭代算法公式为:
L(t)函数的推导公式如下:
这样,当贝塞尔曲线的长度间距无限小时,得出的t值,也是相对于比较精确的。
来源链接:https://blog.csdn.net/linuxheik/article/details/79454663399
(大神已经贴了完整的代码,可以直接参考)
有了这个,就好办了,拿到点以后,看似复杂的曲线,现在就可以看成是一条“直线”了,在直线上实现一个物体的加速度、减速度、匀速等运动,应该算很easy了。
注意:连接之后,每个连接点处,会重复一个额外的点,在代码上,需要考虑删去一个多余的重复点,简单点说,就是:去重。否则球运动到此时会多顿一下。
路径的生成,
我还特地做了一个贝塞尔曲线工具编辑器,如图: