美文网首页
Unity中,给定起点终点,据此生成一条曲线

Unity中,给定起点终点,据此生成一条曲线

作者: 全新的饭 | 来源:发表于2023-07-04 17:44 被阅读0次

思路

基于贝塞尔曲线,再给定一个控制点,用于控制曲线轨迹。
示意:如图红色球表示起点、蓝色球表示终点,黄色球表示控制点。


生成曲线.gif

关键代码

 // 根据起点、终点、控制点、采样点数,获取贝塞尔曲线(点集)
    private Vector3[] GetBeizerPosList(Vector3 begin, Vector3 ctrl, Vector3 end, int cnt)
    {
        cnt--;
        Vector3[] path = new Vector3[cnt + 1];
        path[0] = begin;
        for (int i = 1; i <= cnt; i++)
        {
            float t = i / (float)cnt;
            Vector3 curPos = CalculateCubicBezierPoint(t, begin, ctrl, end);
            path[i] = curPos;
        }

        return path;
    }

    // 根据t,算得贝塞尔曲线上对应的点
    // p0~2分别是起点、控制点、终点
    private Vector3 CalculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2)
    {
        float u = 1 - t;
        float tt = t * t;
        float uu = u * u;
        Vector3 p = uu * p0;
        p += 2 * u * t * p1;
        p += tt * p2;
        return p;
    }

上述示意图用到的代码

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

public class Fan_CreateCurve : MonoBehaviour
{
    [SerializeField]
    private Transform _beginTrans;
    private Vector3 BeginPos { get { return _beginTrans.position; } }
    [SerializeField]
    private Transform _endTrans;
    private Vector3 EndPos { get { return _endTrans.position; } }
    [SerializeField]
    private Transform _ctrlTrans;
    private Vector3 CtrlPos { get { return _ctrlTrans.position; } }

    [SerializeField]
    private int _cnt = 10;
    [SerializeField]
    private Transform _curveRoot;
    private Transform[] _curve;


    private void Start()
    {
        Init();
    }

    private void Update()
    {
        MyUpdate();
    }

    private void OnDestroy()
    {
        MyDestroy();
    }

    private void Init()
    {

    }

    private void MyUpdate()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (_curve != null)
            {
                for (int i = _curve.Length - 1; i >= 0; i--)
                {
                    Destroy(_curve[i].gameObject);
                }
                _curve = null;
            }

            _curve = new Transform[_cnt];
            var _curvePoints = GetBeizerPosList(BeginPos, CtrlPos, EndPos, _cnt);
            for (int i = 0; i < _cnt; i++)
            {
                _curve[i] = GameObject.CreatePrimitive(PrimitiveType.Sphere).transform;
                _curve[i].transform.position = _curvePoints[i];
                _curve[i].transform.SetParent(_curveRoot);
            }
        }
    }

    private void MyDestroy()
    {

    }

    // 根据起点、终点、控制点、采样点数,获取贝塞尔曲线(点集)
    private Vector3[] GetBeizerPosList(Vector3 begin, Vector3 ctrl, Vector3 end, int cnt)
    {
        cnt--;
        Vector3[] path = new Vector3[cnt + 1];
        path[0] = begin;
        for (int i = 1; i <= cnt; i++)
        {
            float t = i / (float)cnt;
            Vector3 curPos = CalculateCubicBezierPoint(t, begin, ctrl, end);
            path[i] = curPos;
        }

        return path;
    }

    // 根据t,算得贝塞尔曲线上对应的点
    // p0~2分别是起点、控制点、终点
    private Vector3 CalculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2)
    {
        float u = 1 - t;
        float tt = t * t;
        float uu = u * u;
        Vector3 p = uu * p0;
        p += 2 * u * t * p1;
        p += tt * p2;
        return p;
    }
}

相关文章

  • Ruby学习笔记4(范围,迭代器,异常处理)

    范围 Ruby中的Range就是给定起点和终点,自动为您生成连续值的方式。 可以使用to.a方法将这个范围转为数组...

  • 2021/3/22

    人生是一条曲线,我们无法选择起点与终点,但是,在起点与终点之间却充满了无数个可以选择的机会。从这一点来...

  • Unity中,让物体沿弧线从起点向终点运动

    思路 给定:起点、终点、“速度”、“高度”。 做法 根据“速度”算得运动总时长:运动总时长 = 起点到终点的距离 ...

  • 高级UI<第二十八篇>:贝赛尔曲线

    (1)概念 将任意一条曲线转化为精确的数学公式。 (2)组成部分 数据点: 曲线的起点和终点。控制点: 控制点决定...

  • 活着为了什么

    活着就为了活着。 从呱呱落地, 到入土为安, 人生从起点走到终点。 不过是一条弧线, 或是一条曲线, 没有直线。 ...

  • codeforces-2B The least round wa

    题意:给定n*n的矩阵,矩阵左上角为起点,右下角为终点,选择一条路线,使得走过路线中乘积中的0最少。思路:避免质因...

  • 点到点轨迹规划归纳

    常用方法 三次曲线,五次曲线,梯形曲线,S曲线 背景知识 冲击 类别1)刚性冲击在运动的起点和终点处,速度发生突变...

  • 题解 NOIP 2014 寻找道路

    NOIP 2014 寻找道路 题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点...

  • 人生,就是一个坑!

    人生,一条路, 从起点到终点, ...

  • 运动规划笔记——邱强

    定义 给定环境,指定起点和终点,计算出连接起点与重点并满足约束的路径 运动规划平台 Mujin openrave ...

网友评论

      本文标题:Unity中,给定起点终点,据此生成一条曲线

      本文链接:https://www.haomeiwen.com/subject/eprhudtx.html