| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | using UnityEngine;namespace Core.Utility{    public class QuinticBezierCurve: MonoBehaviour    {        // 5个控制点        public Vector3 p0; // 起点        public Vector3 p1; // 控制点1        public Vector3 p2; // 控制点2        public Vector3 p3; // 控制点3        public Vector3 p4; // 终点        // 计算四阶贝塞尔曲线上的点        // t: 参数,范围 [0, 1]        public Vector3 CalculatePoint(float t)        {            // 确保 t 在 0-1 范围内            t = Mathf.Clamp01(t);            // 四阶贝塞尔曲线公式            // B(t) = (1-t)^4 * P0 + 4(1-t)^3 * t * P1 + 6(1-t)^2 * t^2 * P2 + 4(1-t) * t^3 * P3 + t^4 * P4            float u = 1 - t;            float t2 = t * t;            float t3 = t2 * t;            float t4 = t3 * t;            float u2 = u * u;            float u3 = u2 * u;            float u4 = u3 * u;            Vector3 point = (u4 * p0) +                            (4 * u3 * t * p1) +                            (6 * u2 * t2 * p2) +                            (4 * u * t3 * p3) +                            (t4 * p4);            return point;        }        // 示例:在场景中绘制曲线        void OnDrawGizmos()        {            Gizmos.color = Color.yellow;                    // 绘制控制点            Gizmos.DrawSphere(p0, 0.1f);            Gizmos.DrawSphere(p1, 0.1f);            Gizmos.DrawSphere(p2, 0.1f);            Gizmos.DrawSphere(p3, 0.1f);            Gizmos.DrawSphere(p4, 0.1f);            // 绘制曲线            Vector3 previousPoint = p0;            int segments = 50;                    for (int i = 1; i <= segments; i++)            {                float t = i / (float)segments;                Vector3 currentPoint = CalculatePoint(t);                Gizmos.DrawLine(previousPoint, currentPoint);                previousPoint = currentPoint;            }        }        // 获取曲线的切线(导数)        public Vector3 GetTangent(float t)        {            t = Mathf.Clamp01(t);            float u = 1 - t;                    // 四阶贝塞尔曲线的导数            Vector3 tangent = 4 * (u * u * u * (p1 - p0) +                                   3 * u * u * t * (p2 - p1) +                                   3 * u * t * t * (p3 - p2) +                                   t * t * t * (p4 - p3));                    return tangent.normalized;        }    }}
 |