报错修改
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public static class BezierCurve
|
||||
{
|
||||
// 新增路径生成方法
|
||||
public static Vector3[] GenerateBezierPath(Vector3[] controlPoints, int segments = 20)
|
||||
{
|
||||
Vector3[] path = new Vector3[segments + 1];
|
||||
|
||||
for (int i = 0; i <= segments; i++)
|
||||
{
|
||||
float t = i / (float)segments;
|
||||
switch (controlPoints.Length)
|
||||
{
|
||||
case 2:
|
||||
path[i] = LineBezier(controlPoints[0], controlPoints[1], t);
|
||||
break;
|
||||
case 3:
|
||||
path[i] = QuadraticBezier(controlPoints, t);
|
||||
break;
|
||||
case 4:
|
||||
path[i] = CubicBezier(controlPoints, t);
|
||||
break;
|
||||
default: // 处理n阶情况
|
||||
path[i] = BezierInterpolation(controlPoints, t);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
// 一阶贝塞尔(线性插值)
|
||||
public static Vector3 LineBezier(Vector3 p0, Vector3 p1, float t)
|
||||
{
|
||||
return Vector3.Lerp(p0, p1, t);
|
||||
}
|
||||
|
||||
// 二阶贝塞尔曲线
|
||||
public static Vector3 QuadraticBezier(Vector3[] points, float t)
|
||||
{
|
||||
if (points.Length != 3) Debug.LogError("需要3个控制点");
|
||||
|
||||
float u = 1 - t;
|
||||
return
|
||||
u * u * points[0] +
|
||||
2 * u * t * points[1] +
|
||||
t * t * points[2];
|
||||
}
|
||||
|
||||
// 三阶贝塞尔曲线
|
||||
public static Vector3 CubicBezier(Vector3[] points, float t)
|
||||
{
|
||||
if (points.Length != 4) Debug.LogError("需要4个控制点");
|
||||
|
||||
float u = 1 - t;
|
||||
return
|
||||
u * u * u * points[0] +
|
||||
3 * u * u * t * points[1] +
|
||||
3 * u * t * t * points[2] +
|
||||
t * t * t * points[3];
|
||||
}
|
||||
|
||||
// n阶贝塞尔曲线(通用实现)
|
||||
public static Vector3 BezierInterpolation(Vector3[] points, float t)
|
||||
{
|
||||
if (points.Length < 2)
|
||||
{
|
||||
Debug.LogError("至少需要2个控制点");
|
||||
return Vector3.zero;
|
||||
}
|
||||
|
||||
Vector3[] temp = new Vector3[points.Length];
|
||||
points.CopyTo(temp, 0);
|
||||
|
||||
// 德卡斯特里奥算法递推
|
||||
for (int k = 1; k < points.Length; k++)
|
||||
{
|
||||
for (int i = 0; i < points.Length - k; i++)
|
||||
{
|
||||
temp[i] = Vector3.Lerp(temp[i], temp[i + 1], t);
|
||||
}
|
||||
}
|
||||
return temp[0];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user