通过贝塞尔曲线编辑曲线

复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;


//[ExecuteInEditMode]
public class PathManager : MonoBehaviour
{
    public GameObject rootPoint;
    public Transform trans;
    public LineRenderer lineRenderer;
    private static PathManager Instance;
    // Use this for initialization
    public static PathManager GetInstance()
    {
        return Instance;
    }

    public BezierPathModel BezierPath;

    private void Awake()
    {
        Instance = this;
      
    }

    void Start()
    {
        if (!lineRenderer)
        {
            lineRenderer = gameObject.AddComponent<LineRenderer>();
        }
        else {
            lineRenderer = gameObject.GetComponent<LineRenderer>();
        }
        InitPath();
        DrawCurve(BezierPath.PathTrans);

        //trans.DOPath(BezierPath.PathTrans,10);
      //  trans.DOPath(BezierPath.PathTrans, 15, PathType.Linear, PathMode.Full3D);
       // rootPoint.DOPath(BezierPath.PathTrans, 15, PathType.Linear, PathMode.Full3D);
    }

    public void Update()
    {
       
    }

    void DrawCurve(List<Vector3> pos)
    {
        lineRenderer.positionCount = pos.Count;
        for (int i = 0; i < pos.Count; i++)
        {
            //   float t = i / (float)pos.Count;
            // int nodeIndex = 0;
           // Debug.Log("i"+i);
            Vector3 pixel = pos[i];
            //lineRenderer.positionCount = i;
            lineRenderer.SetPosition(i, pixel);
        }
    }

    public void InitPath()
    {
        BezierPath.PathTrans = calculate(BezierPath.ControlTrans, BezierPath.segmentNum);

    }

    public List<Vector3> calculate(List<Transform> poss, int precision)
    {

        //维度,坐标轴数(二维坐标,三维坐标...)
        int dimersion = 2;

        //贝塞尔曲线控制点数(阶数)
        int number = poss.Count;

        //控制点数不小于 2 ,至少为二维坐标系
        if (number < 2 || dimersion < 2)
            return null;

        List<Vector3> result = new List<Vector3>();

        //计算杨辉三角
        int[] mi = new int[number];
        mi[0] = mi[1] = 1;
        for (int i = 3; i <= number; i++)
        {

            int[] t = new int[i - 1];
            for (int j = 0; j < t.Length; j++)
            {
                t[j] = mi[j];
            }

            mi[0] = mi[i - 1] = 1;
            for (int j = 0; j < i - 2; j++)
            {
                mi[j + 1] = t[j] + t[j + 1];
            }
        }

        //计算坐标点
        for (int i = 0; i < precision; i++)
        {
            float t = (float)i / precision;
            Vector3 temp_ = new Vector3(0, 0, 0);
            for (int k = 0; k < number; k++)
            {
                temp_.x += Mathf.Pow(1 - t, number - k - 1) * poss[k].position.x * Mathf.Pow(t, k) * mi[k];
                temp_.y += Mathf.Pow(1 - t, number - k - 1) * poss[k].position.y * Mathf.Pow(t, k) * mi[k];
                temp_.z += Mathf.Pow(1 - t, number - k - 1) * poss[k].position.z * Mathf.Pow(t, k) * mi[k];
            }

            result.Add(temp_);
        }
        return result;
    }

    public List<Vector3> ReturnPath(int id)
    {
        return BezierPath.PathTrans;
    }
}

[System.Serializable]
public class BezierPathModel
{
    public List<Transform> ControlTrans;
    public int segmentNum;
    public List<Vector3> PathTrans;

}
复制代码

 

posted on   奇个旦Game  阅读(376)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示