using System.Collections; using System.Collections.Generic; using UnityEngine; public class BezierUtils { /// /// 二次贝塞尔曲线:根据T值,计算贝塞尔曲线上面相对应的点 /// /// T值 /// 起始点 /// 控制点 /// 目标点 /// 根据T值计算出来的贝赛尔曲线点 public static Vector3 CalculateBezierPointN2(float t, Vector3 pStartV, Vector3 pControlV, Vector3 pEndV) { float u = 1 - t; Vector3 tPos = u * u * pStartV; tPos += 2 * u * t * pControlV; tPos += t * t * pEndV; return tPos; } /// /// 二次贝塞尔曲线:获取存储贝塞尔曲线点的数组 /// /// 起始点 /// 控制点 /// 目标点 /// 采样点的数量 /// 存储贝塞尔曲线点的数组 public static Vector3[] GetBezierListN2(Vector3 pStartV, Vector3 pControlV, Vector3 pEndV, int pSegment) { Vector3[] tPath = new Vector3[pSegment + 1]; for (int i = 0; i <= pSegment; i++) { float t = i / (float)pSegment; Vector3 pixel = CalculateBezierPointN2(t, pStartV, pControlV, pEndV); tPath[i] = pixel; } return tPath; } /// /// 二次贝塞尔曲线:根据T值,计算贝塞尔曲线上面相对应的点 /// /// T值 /// 起始点 /// 控制点1 /// 控制点2 /// 目标点 /// 根据T值计算出来的贝赛尔曲线点 public static Vector3 CalculateBezierPointN3(float t, Vector3 pStartV, Vector3 pControlV1, Vector3 pControlV2, Vector3 pEndV) { float u = 1 - t; Vector3 tPos = Vector3.zero; tPos = u * u * u * pStartV; tPos += 3 * u * u * t * pControlV1; tPos += 3 * u * t * t * pControlV2; tPos += t * t * t * pEndV; return tPos; } /// /// 三次贝塞尔曲线:获取存储贝塞尔曲线点的数组 /// /// 起始点 /// 控制点1 /// 控制点2 /// 目标点 /// 采样点的数量 /// 存储贝塞尔曲线点的数组 public static Vector3[] GetBezierListN3(Vector3 pStartV, Vector3 pControlV1, Vector3 pControlV2, Vector3 pEndV, int pSegment) { Vector3[] tPath = new Vector3[pSegment + 1]; for (int i = 0; i <= pSegment; i++) { float t = i / (float)pSegment; Vector3 pixel = CalculateBezierPointN3(t, pStartV, pControlV1, pControlV2, pEndV); tPath[i] = pixel; } return tPath; } }