unity 贝塞尔曲线

前段时间研究贝塞尔曲线,做曲线路径动画

其实原理还是简单的做差值算法

unity 贝塞尔曲线

unity 贝塞尔曲线

        private void InstBezier(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
        {
            if (p0 == null || p1 == null || p2 == null || p3 == null)
            {
                isInsted = false;
                return;
            }
            for (int i = 0; i < pointNum; i++)
            {
                float ratio = i / (float)pointNum;
                Vector3 p0_1 = Vector3.Lerp(p0, p1, ratio);
                Vector3 p1_2 = Vector3.Lerp(p1, p2, ratio);
                Vector3 p2_3 = Vector3.Lerp(p2, p3, ratio);
                Vector3 p0_1_1_2 = Vector3.Lerp(p0_1, p1_2, ratio);
                Vector3 P1_2_2_3 = Vector3.Lerp(p1_2, p2_3, ratio);
                Vector3 p0_1_1_2_1_2_2_3 = Vector3.Lerp(p0_1_1_2, P1_2_2_3, ratio);
                pointList.Add(p0_1_1_2_1_2_2_3);
            }
            isInsted = true;
        }

 

再帖一段物体追踪曲线轨迹的代码

        private Vector3 Vector3ListLerp(float t)
        {
            if (t > 1)
            {
                t = 1;
            }
            float disRatio = bezierPath.totalDis * t;//已经跑了的距离

            float pointsDis = 0;
            float ratio = 0;

            for (int i = 0; i < bezierPath.pointList.Count - 1; i++)
            {
                float pointDis = Vector3.Distance(bezierPath.pointList[i], bezierPath.pointList[i + 1]);

                pointsDis += pointDis;

                if (pointsDis >= disRatio)
                {
                    currentPoint = bezierPath.pointList[i];
                    nextPoint = bezierPath.pointList[i + 1];
                    ratio = (disRatio - (pointsDis - pointDis)) / pointDis;
                    break;
                }
            }
            return Vector3.Lerp(currentPoint, nextPoint, ratio);
        }

unity 贝塞尔曲线

代码解释。。就是一张图。。