您当前的位置: 首页 >  unity
  • 4浏览

    0关注

    193博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

unity之贝塞尔曲线

我寄人间雪满头丶 发布时间:2021-08-19 17:58:58 ,浏览量:4

简介

什么是贝塞尔曲线 贝塞尔曲线(Bezier curve),又称 贝兹曲线 或 贝济埃曲线 ,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,当时主要用于汽车主体设计。现主要应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,比如PhotoShop中的钢笔工具。在unity中我们一般用来生成弯路的路径点或者导弹移动轨迹等等。 什么是阶(次) 两种理解: 1、贝塞尔曲线,它的背后是一个数学函数,N阶可以理解为N次方的意思,我们也可以把三阶贝塞尔曲线叫做三次贝塞尔曲线。 2、二阶贝塞尔曲线就是在一阶贝塞尔曲线的基础上再求一次一阶贝塞尔曲线;三阶贝塞尔曲线就是在二阶贝塞尔曲线的基础上再求一次一阶贝塞尔曲线;以此类推。 简单来说就是套娃。

使用

首先要传入控制点。

    public Transform[] points;

一阶贝塞尔曲线算法:

public Vector3 lineBezier(float t)
{
    Vector3 a = points[0].position;
    Vector3 b = points[1].position;
    return a + (b - a) * t;
}

效果图 在这里插入图片描述

二阶贝塞尔曲线算法:

public Vector3 quardaticBezier(float t)
{
    Vector3 a = points[0].position;
    Vector3 b = points[1].position;
    Vector3 c = points[2].position;

    Vector3 aa = a + (b - a) * t;
    Vector3 bb = b + (c - b) * t;
    return aa + (bb - aa) * t;
}

效果图 在这里插入图片描述

三阶贝塞尔曲线算法:

public Vector3 cubicBezier(float t)
{
    Vector3 a = points[0].position;
    Vector3 b = points[1].position;
    Vector3 c = points[2].position;
    Vector3 d = points[3].position;

    Vector3 aa = a + (b - a) * t;
    Vector3 bb = b + (c - b) * t;
    Vector3 cc = c + (d - c) * t;

    Vector3 aaa = aa + (bb - aa) * t;
    Vector3 bbb = bb + (cc - bb) * t;
    return aaa + (bbb - aaa) * t;
}

效果图 在这里插入图片描述

以此类推。

扩展

贝塞尔曲线返回点的贝塞尔函数,使用线性插值的概念作为基础。下面我们使用Vector3.Lerp实现贝塞尔曲线在编辑器模式下生成路径点。 代码:

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class CreatCurvePoints : MonoBehaviour
{
    public Transform parent;
    [SerializeField] private Transform points;                          //控制点父对象
    private List point_tranList = new List();     //控制点列表
    [SerializeField] private int pointCount = 100;                      //曲线点的个数
    [HideInInspector]
    public List line_pointList;                               //曲线点列表

    public void Init()
    {
        if (null != points && point_tranList.Count == 0)
        {
            foreach (Transform item in points)
            {
                point_tranList.Add(item);
            }
        }
        line_pointList = new List();
        for (int i = 0; point_tranList.Count != 0 && i = 1; i--)
            {
                DestroyImmediate(parent.GetChild(i - 1).gameObject, true);
            }
        }
    }
}
#endif

检视面板 在这里插入图片描述

在这里插入图片描述

效果图 在这里插入图片描述

关注
打赏
1648518768
查看更多评论
立即登录/注册

微信扫码登录

0.0836s