求帮助,两点节点之间做贝赛尔曲线运动

问题如题,有大佬知道么,求指教。

写过一篇关于贝塞尔曲线的博客。问AI也行,套公式就好了,一般常用的就二阶贝塞尔。
https://blog.csdn.net/qq_39162826/article/details/119806754?ops_request_misc=%7B%22request%5Fid%22%3A%22172344081716800178532041%22%2C%22scm%22%3A%2220140713.130102334.pc%5Fblog.%22%7D&request_id=172344081716800178532041&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-119806754-null-null.nonecase&utm_term=贝塞尔&spm=1018.2226.3001.4450

我想问下是因为t是从哪里来的参数,可能我不太懂unity相关的语言代码,看的有点懵逼

t是进度,0-1区间。0的时候是起点,1的时候是终点。
比如下图TS版本的二阶贝塞尔,v1就是下面效果图里的起点P0,v2为控制点P1,v3为终点P2。
image
image

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,计算出当前所处的点的位置,以及方向等。

这其中,以第一步和第三步最重要,基本都是用数值化的方法来求解的。

:rofl: :rofl: :rofl:
另外给大家安利一下我写的一个的匀速化的实现
贝塞尔曲线编辑器

1赞

编辑器(黑屏把窗口拖小点)

2赞

这个也很强

好家伙,你怎么知道我会黑屏 :rofl:

sprite设置平铺,太多的话会报错 :rofl:

头像好可爱啊,啊哈哈哈