using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//贝塞尔曲线 https://www.jianshu.com/p/0c9b4b681724
public class BezierHelper {
///
//2次贝塞尔曲线 B(t) = P0 + t(P - P0) => B(t) = (1 - t) P0 + t P1.
//实际上是Lerp函数
public static Vector3 GetPoint2 (Vector3 p0, Vector3 p1, float t) {
return (1 - t) * p0 + t * p1;
}
/
//这实际上是一条线性曲线,P0和P1被两条新的线性曲线代替了
//3次贝塞尔曲线 B(t) = (1 - t) ((1 - t) P0 + t P1) + t ((1 - t) P1 + t P2) =>B(t) = (1 - t)2 P0 + 2 (1 - t) t P1 + t2 P2
//导数 B'(t) = 2 (1 - t) (P1 - P0) + 2 t (P2 - P1)
public static Vector3 GetPoint3 (Vector3 p0, Vector3 p1, Vector3 p2, float t) {
t = Mathf.Clamp01 (t);
float oneMinusT = 1f - t;
return
oneMinusT * oneMinusT * p0 +
2f * oneMinusT * t * p1 +
t * t * p2;
}
public static Vector3 GetFirstDerivative3 (Vector3 p0, Vector3 p1, Vector3 p2, float t) {
return
2f * (1f - t) * (p1 - p0) +
2f * t * (p2 - p1);
}
///
//4次 B(t) = (1 - t)3 P0 + 3 (1 - t)2 t P1 + 3 (1 - t) t2 P2 + t3 P3
//导数 B'(t) = 3 (1 - t)2 (P1 - P0) + 6 (1 - t) t (P2 - P1) + 3 t2 (P3 - P2).
public static Vector3 GetPoint4 (Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t) {
t = Mathf.Clamp01 (t);
float oneMinusT = 1f - t;
return
oneMinusT * oneMinusT * oneMinusT * p0 +
3f * oneMinusT * oneMinusT * t * p1 +
3f * oneMinusT * t * t * p2 +
t * t * t * p3;
}
public static Vector3 GetFirstDerivative4 (Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t) {
t = Mathf.Clamp01 (t);
float oneMinusT = 1f - t;
return
3f * oneMinusT * oneMinusT * (p1 - p0) +
6f * oneMinusT * t * (p2 - p1) +
3f * t * t * (p3 - p2);
}
}