88 lines
3.2 KiB
C#
88 lines
3.2 KiB
C#
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
|
||
public class BezierUtils
|
||
{
|
||
/// <summary>
|
||
/// 二次贝塞尔曲线:根据T值,计算贝塞尔曲线上面相对应的点
|
||
/// </summary>
|
||
/// <param name="t"></param>T值
|
||
/// <param name="pStartV"></param>起始点
|
||
/// <param name="pControlV"></param>控制点
|
||
/// <param name="pEndV"></param>目标点
|
||
/// <returns></returns>根据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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 二次贝塞尔曲线:获取存储贝塞尔曲线点的数组
|
||
/// </summary>
|
||
/// <param name="pStartV"></param>起始点
|
||
/// <param name="pControlV"></param>控制点
|
||
/// <param name="pEndV"></param>目标点
|
||
/// <param name="pSegment"></param>采样点的数量
|
||
/// <returns></returns>存储贝塞尔曲线点的数组
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 二次贝塞尔曲线:根据T值,计算贝塞尔曲线上面相对应的点
|
||
/// </summary>
|
||
/// <param name="t"></param>T值
|
||
/// <param name="pStartV"></param>起始点
|
||
/// <param name="pControlV1"></param>控制点1
|
||
/// <param name="pControlV2"></param>控制点2
|
||
/// <param name="pEndV"></param>目标点
|
||
/// <returns></returns>根据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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 三次贝塞尔曲线:获取存储贝塞尔曲线点的数组
|
||
/// </summary>
|
||
/// <param name="pStartV"></param>起始点
|
||
/// <param name="pControlV1"></param>控制点1
|
||
/// <param name="pControlV2"></param>控制点2
|
||
/// <param name="pEndV"></param>目标点
|
||
/// <param name="pSegment"></param>采样点的数量
|
||
/// <returns></returns>存储贝塞尔曲线点的数组
|
||
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;
|
||
}
|
||
} |