57 lines
2.6 KiB
C#
57 lines
2.6 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public static class BezierFunctions
|
|
{
|
|
/// <summary>
|
|
/// 用于计算参考点的位置
|
|
/// 我们想像一个立方体,开始点与结束点分别位于这个立方体的两个对角,那么剩下的六个点即为各个参考点
|
|
/// </summary>
|
|
public static Vector3 GetReferencePoint(Vector3 startPoint, Vector3 endPoint, ReferencePointLocation location)
|
|
{
|
|
switch (location)
|
|
{
|
|
case ReferencePointLocation.Near: return new Vector3(endPoint.x, endPoint.y, startPoint.z);
|
|
case ReferencePointLocation.Far: return new Vector3(startPoint.x, startPoint.y, endPoint.z);
|
|
case ReferencePointLocation.RightTop: return new Vector3(endPoint.x, startPoint.y, startPoint.z);
|
|
case ReferencePointLocation.RightBottom: return new Vector3(endPoint.x, endPoint.y, startPoint.z);
|
|
case ReferencePointLocation.LeftTop: return new Vector3(startPoint.x, startPoint.y, endPoint.z);
|
|
case ReferencePointLocation.LeftBottom: return new Vector3(startPoint.x, endPoint.y, endPoint.z);
|
|
}
|
|
return new Vector3();
|
|
|
|
}
|
|
/// <summary>
|
|
/// 计算贝塞尔曲线上的点,任意参考点
|
|
/// </summary>
|
|
/// <param name="t">取值区间为0-1,它代表取值的位置</param>
|
|
/// <param name="startPoint">开始点</param>
|
|
/// <param name="endPoint">结束点</param>
|
|
/// <param name="vertice">控制点</param>
|
|
public static Vector3 GetBezierPoint(Vector3 startPoint, Vector3 endPoint, Vector3 vertice, float t)
|
|
{
|
|
//需要注意,当你的所谓的曲线是一条直线,即输入参数vertice为一个0向量,那么该方法会失效,你需要在计算参考点时解决这个问题
|
|
float u = 1 - t;
|
|
float tt = t * t;
|
|
float uu = u * u;
|
|
return uu * startPoint + 2 * u * t * endPoint + tt * vertice;
|
|
}
|
|
/// <summary>
|
|
/// 计算贝塞尔曲线上的点,特殊参考点
|
|
/// </summary>
|
|
/// <param name="t">取值区间为0-1,它代表取值的位置</param>
|
|
/// <param name="startPoint">开始点</param>
|
|
/// <param name="endPoint">结束点</param>
|
|
/// <param name="vertice">控制点</param>
|
|
/// <returns></returns>
|
|
public static Vector3 GetBezierPoint(Vector3 startPoint, Vector3 endPoint, ReferencePointLocation location, float t)
|
|
{
|
|
var vertice = GetReferencePoint(startPoint, endPoint, location);
|
|
float u = 1 - t;
|
|
float tt = t * t;
|
|
float uu = u * u;
|
|
return uu * startPoint + 2 * u * t * vertice + tt * endPoint;
|
|
}
|
|
}
|