untiy c#贝塞尔曲线

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

    }
}

最后的效果是这样的,以人脚下为起点,金币所在的位置为终点,

代码测试是可以用的。

代码不复杂,也是简单的逻辑,有啥不合适的地方,后期再改,第一版记录。

贝塞尔曲线演示图