unity 基于c#的n阶贝塞尔曲线记录
1.感觉很像是插值运算,通过多个坐标点算出来一个坐标.
2.先创建一个贝塞尔曲线的类:BeiSaiErBezier,在里面写贝塞尔曲线的运算逻辑,便于其他脚本调用。通过调用GetBezier()方法,得到一个v3坐标的数组,然后用这个数组去划线,或者去做其他的操作.返回的数组就是百色人曲线运算出来的最终数据。
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 贝塞尔曲线类
/// 等同于线性插值,在两点间求一个点,
/// </summary>
public class BeiSaiErBezier
{
private static Vector3[] poisition;
/// <summary>
/// 获取贝塞尔曲线的的坐标数组,
/// </summary>
/// <param name="pointNum"></param> 表示要取得路径点数量,值越大,取得的路径点越多,曲线最后越平滑
/// <param name="v3List"></param> 画贝塞尔曲线的坐标点,第一个为起始坐标,中间的为中间坐标,最后一个为终点坐标
/// <returns></returns>
public static void GetBezier(ref Vector3[] refV3, int pointNum, List<Vector3> v3List)
{
refV3 = new Vector3[pointNum + 1];
//给贝塞尔曲线添加起始坐标,也可以不用
refV3[0] = v3List[0];
for (int i = 0; i < pointNum; i++)
{
float t = (i + 1) / (float)pointNum;//归化到0~1范围,t相当于获取的坐标相对于总路径数的百分比,或者说是比例
refV3[i + 1] = Bezier(t, v3List);
}
}
// n阶曲线,递归实现,返回一个贝塞尔曲线的点
public static Vector3 Bezier(float t, List<Vector3> p)
{
if (p.Count < 2)
return p[0];
List<Vector3> newp = new List<Vector3>();
for (int i = 0; i < p.Count - 1; i++)
{
Vector3 p0p1 = (1 - t) * p[i] + t * p[i + 1];
newp.Add(p0p1);
}
return Bezier(t, newp);
}
}
3.调用案例
在这里使用LineRender组件进行一个画线,也可以使用其他的画线方式。
using System.Collections.Generic;
using UnityEngine;
public class BeiSaiErQuXian : MonoBehaviour
{
public Transform startPoion, endPoion;
public LineRenderer line2;
private Vector3[] _path2;
//运算出来的路径点数,点数越大,效果越好,对应的运算也会变大
public int resolution = 20;
Vector3 startV3;
// Start is called before the first frame update
void Start()
{
BeiSaiErXian();
}
void BeiSaiErXian()
{
startV3 = startPoion.position;
Vector3 centerPoion = (startV3 + endPoion.position) * 0.5f + new Vector3(0, 1.8f, 0);
//画贝塞尔曲线的坐标点,第一个为起始坐标,中间的为中间坐标,最后一个为终点坐标
List<Vector3> v3List = new List<Vector3>() { startV3, centerPoion, endPoion.position };
BeiSaiErBezier.GetBezier(ref _path2, resolution, v3List);
//给LineRenderer组件,设置画线的坐标个数,设置坐标位置,方法参数是一个数组
line2.positionCount = _path2.Length;
line2.SetPositions(_path2);
}
}
最后的效果是这样的,以人脚下为起点,金币所在的位置为终点,
代码测试是可以用的。
代码不复杂,也是简单的逻辑,有啥不合适的地方,后期再改,第一版记录。