《BezierMaster》二阶贝塞尔曲线终极移动控制方案——1行代码让任意元素跳出死板直线运动!

Cocos creator3.8 2D贝塞尔曲线移动控件

简介

  • Creator 版本:3.8.6

这次给大家带来的是 2D贝塞尔曲线移动控件,先展示效果 (也可以点击上面:point_up_2:demo链接自己试试)



以及我结合了贝塞尔曲线控件+残影控件的效果展示

v1-ezgif.com-video-to-gif-converter

Gif还是有些卡,也可以来这里看视频效果

背景

在制作游戏时,经常需要移动动画元素,直接移动过去是最简单的办法,但是比较呆板,效果不佳。看到很多成熟的游戏中,元素按照贝塞尔曲线移动会带来灵动而高级感。比如这个

于是便想做一个好用的控件,方便按照贝塞尔曲线移动元素。其实我的诉求非常简单,只需要

  1. 使用方便。只需指定终点,控件就可以按照起点和终点计算出一条二阶曲线(二阶已经足够了),并使绑定的元素node按照计算出的轨迹运动。
  2. 控件支持各种调参,可以通过调整控制点的一些属性,实现自定义曲线,并带有一定的随机性。

基于此两点目的,我开始了控件制作。

实现原理

说到二阶贝塞尔曲线,基本梦回高中了,上网又温习了一下贝塞尔曲线的特性。
20170723231043085

对于二阶贝塞尔曲线,最重要的就是控制点。如图,


P0,P2分别是起点和终点,P1作为控制点。Q0为 P0 到 P1 上的动点,Q1 是 P1 到 P2 上的动点。它们在 P0P1 和 P1P2 上是按比例移动的,当 Q0 移动到 P0P1 的中点时,Q1 也恰好移动到 P1P2 的中点, Q0 移动到 P1 时,Q1 也恰好移动到 P2 。而 B(t) 是 Q0 到 Q1 的动点。B(t) 的轨迹,就是以 P0 为起始点,以 P2 为终止点。(其实参考一下公式就好,太多相关资料了,我也是参考的)

于是,主体思路即是

  1. 当拿到目标坐标后,先按照控制点参数,计算出这次贝塞尔曲线的控制点
  2. 由于有了起点P0,控制点P1,终点P2,就可以算出P0P1+P1P2,粗略认为是总路程(其实肯定逼这个值小),通过路程/速度,就可以算轨迹运动时间了。 (速度也是控件的参数之一)
  3. 然后呢,在update的循环中,不断按照计算贝塞尔曲线当时点的位置(当然,还需要考虑旋转,这里需要计算切线,来调整角度;里面还要考虑角度是否平滑过渡等)

使用方法

虽然实现起来比较复杂,但最终使用起来却异常的简单。
二部极简操作

  • 一拖: 将BezierMove组件拖入目标节点
  • 二设: 调用BezierMove.moveTo方法,传入终点坐标即可
    • 同时可以设置其他参数,来实现自定义与随机性配置,例如:
      • 控制点偏移率
      • 控制点随机系数
      • 控制点方向
      • 缓动函数
      • 运动速度
      • 角度平滑系数

可以调整的参数也可详见

控件优势

  1. 智能路径生成引擎 :white_check_mark: 自动构建二阶贝塞尔曲线 :white_check_mark: 实时动态锚点修正 :white_check_mark: 支持2D节点运动 :white_check_mark: 完美适配Spine/DragonBone动画 只需设定终点坐标,自动生成符合物理直觉的优雅曲线

  2. 参数级操控系统

  • 40+预设缓动函数(弹性/回弹/脉冲等)
  • 智能速率适配(FixSpeed模式)
  • 轨迹曲线高度可控可随机(控制点偏移率,随机系数,方向)
  • 可视化曲线路径
  1. 即插即用架构 :heavy_check_mark: 组件化设计 :heavy_check_mark: 3.8全版本兼容 :heavy_check_mark: 源码级控制

  2. 包含了对应Demo以及源码效果,还有详细的视频教学,方便使用者快速上手

写在最后

希望这个控件能够帮助到有需要的朋友。

16赞

东西不错 现在是我的了

2赞

不错的控件,支持一波

感谢感谢!

不错不错!

写得不错,支持一下

mark一下

mark~

看视频不是匀速的,但是又支持 FixSpeed?

支持40多种缓动函数,如果想要匀速,可以选择linear,就可以完全匀速了,demo里只展示了其中4种

1赞

直接tween+贝塞尔公式 就行了,没有那么多绕绕

原理确实不难,实际实现的时候一些细节处理比较耗时,尤其是角度控制以及贝塞尔曲线的一些重要参数参数处理。这个控件只是将其封装了下,解决一些实现时的坑,并做成组件可复用,帮助那些开发者快速做出想要的效果。

贝塞尔要匀速的话计算还挺复杂的

应该是点到点匀速,实际曲线没有匀速吧

最近在做一个塔防游戏,刚想用贝塞尔曲线做一个怪物出生动画。碰巧看到,就买来参考下。
说下几个可以改进的点:
1、组件中所有逻辑耦合在一起不方便其它情况使用,应该有更底层的计算逻辑封装;
比如
1)bezier2 函数是二阶步进
2)bezier3 函数是三阶步进
3)BezierMoveAPI,封装曲线运动的接口 API,方便其它控制逻辑调用
4) BezierMoveComp 将 BezierMoveAPI 封装成组件来使用
5) BezierTween 将 BezierMoveAPI 封装成 Tween 动画来使用
6)BezierAct 将 BezierMoveAPI 封装成动作对象,方便驱动模块进行步进的方式调用
这样覆盖面就相对比较全了。

2、Easy 函数比较全,但应该剥离出去给其它模块使用。我是直接把 LayaAir3.2 源码中的 Ease.ts 文件拿来用了,感觉Laya 的一些 API 设计也还是可以的。

2赞

好建议,后续会考虑做进一步封装。这个控件一开始初衷是让使用者能快速让node按Bezier曲线动起来,没想弄太复杂,不过既然有需求,那就安排起来。:sunglasses:

1赞

很多好的工具和软件一开始都只是从一个看起来简单的小功能开始的,希望这个工具也能慢慢丰富完善,最后如果成为一个好用的曲线动画工具就太棒了.

搞笑的是,我还没买… 这就去买个.

拿到曲线上的n个点然后,每一段按照固定速度单独计算时间不就可以实现近似匀速了吗

你这n个点两点之间的链接曲线怎么保证是相等的, 曲线的长度是要求积分的。。。

简单取的话那只是近似, 而且误差很大,