mergemilitary/Assets/Scripts/Utils/BezierUtils.cs

88 lines
3.2 KiB
C#
Raw Normal View History

2022-05-24 15:07:04 +00:00
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;
}
}