Bezier类
public class Bezier {
// 线性
public static Vector3 Line_Bezier(Vector3 p0, Vector3 p1, float t) {
return (1 - t) * p0 + t * p1;
}
// 二阶曲线
public static Vector3 Second_Order_Bezier(Vector3 p0, Vector3 p1, Vector3 p2, float t) {
Vector3 p0p1 = (1 - t) * p0 + t * p1;
Vector3 p1p2 = (1 - t) * p1 + t * p2;
Vector3 result = (1 - t) * p0p1 + t * p1p2;
return result;
}
// 三阶曲线
public static Vector3 Three_Order_Bezier(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t) {
Vector3 result;
Vector3 p0p1 = (1 - t) * p0 + t * p1;
Vector3 p1p2 = (1 - t) * p1 + t * p2;
Vector3 p2p3 = (1 - t) * p2 + t * p3;
Vector3 p0p1p2 = (1 - t) * p0p1 + t * p1p2;
Vector3 p1p2p3 = (1 - t) * p1p2 + t * p2p3;
result = (1 - t) * p0p1p2 + t * p1p2p3;
return result;
}
// n阶曲线,递归实现
public static Vector3 N_Order_Bezier_Recursion(float t, List<Vector3> p) {
if (p.Count < 2)
return p[0];
List<Vector3> newp = new List<Vector3>();
for (int i = 0; i < p.Count - 1; i++) {
Debug.DrawLine(p[i], p[i + 1]);
Vector3 p0p1 = (1 - t) * p[i] + t * p[i + 1];
newp.Add(p0p1);
}
return N_Order_Bezier_Recursion(t, newp);
}
// transform转换为vector3,在调用参数为List<Vector3>的Bezier函数
public static Vector3 N_Order_Bezier_Transform(float t, List<Transform> p) {
if (p.Count < 2)
return p[0].position;
List<Vector3> newp = new List<Vector3>();
for (int i = 0; i < p.Count; i++) {
newp.Add(p[i].position);
}
return N_Order_Bezier_Recursion(t, newp);
}
/// <summary>
/// 获取存储二阶贝塞尔曲线点的数组
/// </summary>
/// <param name="startPoint"></param>起始点
/// <param name="controlPoint"></param>控制点
/// <param name="endPoint"></param>目标点
/// <param name="segmentNum"></param>采样点的数量
/// <returns></returns>存储贝塞尔曲线点的数组
public static Vector3[] GetSecondBeizerList(Vector3 startPoint, Vector3 controlPoint, Vector3 endPoint, int segmentNum) {
Vector3[] path = new Vector3[segmentNum];
for (int i = 1; i <= segmentNum; i++) {
float t = i / (float)segmentNum;
Vector3 pixel = Second_Order_Bezier(startPoint,
controlPoint, endPoint,t);
path[i - 1] = pixel;
Debug.Log(path[i - 1]);
}
return path;
}
/// <summary>
/// 获取存储三阶贝塞尔曲线点的数组
/// </summary>
/// <param name="startPoint"></param>起始点
/// <param name="controlPoint1"></param>控制点
/// <param name="controlPoint2"></param>控制点
/// <param name="endPoint"></param>目标点
/// <param name="segmentNum"></param>采样点的数量
/// <returns></returns>存储贝塞尔曲线点的数组
public static Vector3[] GetThreeBeizerList(Vector3 startPoint, Vector3 controlPoint1, Vector3 controlPoint2, Vector3 endPoint, int segmentNum) {
Vector3[] path = new Vector3[segmentNum];
for (int i = 1; i <= segmentNum; i++) {
float t = i / (float)segmentNum;
Vector3 pixel = Three_Order_Bezier(startPoint,
controlPoint1, controlPoint2, endPoint, t);
path[i - 1] = pixel;
Debug.Log(path[i - 1]);
}
return path;
}
/// <summary>
/// 获取存储N阶贝塞尔曲线点的数组
/// </summary>
/// <param name="p">对象数组</param>
/// <param name="segmentNum">采样点的数量</param>
/// <returns></returns>
public static Vector3[] GetN_Order_TransformBeizerList(List<Transform> p, int segmentNum) {
Vector3[] path = new Vector3[segmentNum];
for (int i = 1; i <= segmentNum; i++) {
float t = i / (float)segmentNum;
Vector3 pixel = N_Order_Bezier_Transform(t,p);
path[i - 1] = pixel;
Debug.Log(path[i - 1]);
}
return path;
}
/// <summary>
/// 获取存储N阶贝塞尔曲线点的数组
/// </summary>
/// <param name="p">Vector3数组</param>
/// <param name="segmentNum">采样点的数量</param>
/// <returns></returns>
public static Vector3[] GetN_Order_VectorBeizerList(List<Vector3> p, int segmentNum) {
Vector3[] path = new Vector3[segmentNum];
for (int i = 1; i <= segmentNum; i++) {
float t = i / (float)segmentNum;
Vector3 pixel = N_Order_Bezier_Recursion(t, p);
path[i - 1] = pixel;
Debug.Log(path[i - 1]);
}
return path;
}
}
test类
public List<Transform> points;
public Transform point1;
public Transform point2;
public Transform point3;
public Transform point4;
void Start () {
Vector3[] list = Bezier.GetN_Order_TransformBeizerList(points ,50);
for (int i = 0; i < list.Length; i++) {
Instantiate(point1.gameObject, list[i], Quaternion.identity);
}
}
结果:
参考: