mergemilitary/Assets/Scripts/Utils/BezierUtils.cs

88 lines
3.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}