unity 两点间生成随机的贝塞尔曲线

效果如图:

思路:

  主要问题在于生成随机控制点。

  1. 以start -> end 为z轴建立坐标系,获得 x_Axis, y_Axis, z_Axis

  2.以z轴方向随机长度, x轴y轴随机所在位置

  3.用贝塞尔曲线公式生成曲线

public class Test : MonoBehaviour
{
    public Transform m_Start;
    public Transform m_End;

    Vector3 m_AxisX;
    Vector3 m_AxisY;
    Vector3 m_AxisZ;
    float m_OriLength;

    List<Vector3> m_PointList;
    Vector3[] m_BLine;

    void Start()
    {
        m_PointList = new List<Vector3>();
        var start = m_Start.position;
        var end = m_End.position;
        m_OriLength = Vector3.Distance(start, end);

        BuildMoveMatrix(start, end);

        m_PointList.Add(start);
        RandomPoint(start, end, m_OriLength);
        m_PointList.Add(end);

        m_BLine = Bezeir.draw_bezier_curves(m_PointList.ToArray(), m_PointList.Count, 0.005f);
    }

    void BuildMoveMatrix(Vector3 start, Vector3 end)
    {
        var z = (end - start).normalized;
        var y = new Vector3(1.0f, 1.0f, -(z.x + z.y) / z.z).normalized;
        var x = Vector3.Cross(z, y).normalized;

        m_AxisX = x;
        m_AxisY = y;
        m_AxisZ = z;
    }

    void RandomPoint(Vector3 start, Vector3 end, float length)
    {
        if (length < m_OriLength * 0.3f)
            return;

        var len = UnityEngine.Random.Range(length * 0.2f, length * 0.8f);
        var point = (end - start).normalized * len + start;
        point = point +
                m_AxisX * UnityEngine.Random.Range(-0.3f * length, 0.3f * length) +
                m_AxisY * UnityEngine.Random.Range(-0.3f * length, 0.3f * length);

        RandomPoint(start, point, Vector3.Distance(start, point));
        m_PointList.Add(point);
        RandomPoint(point, end, Vector3.Distance(point, end));
    }
}

public class Bezeir
{
    public static Vector3[] draw_bezier_curves(Vector3[] points, int count, float step)
    {
        List<Vector3> bezier_curves_points = new List<Vector3>();
        float t = 0F;
        do
        {
            var temp_point = bezier_interpolation_func(t, points, count);    // 计算插值点
            t += step;
            bezier_curves_points.Add(temp_point);
        }
        while (t <= 1 && count > 1);    // 一个点的情况直接跳出.
        return bezier_curves_points.ToArray();  // 曲线轨迹上的所有坐标点
    }

    /// <summary>
    /// n阶贝塞尔曲线插值计算函数
    /// 根据起点,n个控制点,终点 计算贝塞尔曲线插值
    /// </summary>
    /// <param name="t">当前插值位置0~1 ,0为起点,1为终点</param>
    /// <param name="points">起点,n-1个控制点,终点</param>
    /// <param name="count">n+1个点</param>
    /// <returns></returns>
    private static Vector3 bezier_interpolation_func(float t, Vector3[] points, int count)
    {
        var PointF = new Vector3();
        var part = new float[count];
        float sum_x = 0, sum_y = 0, sum_z = 0;
        for (int i = 0; i < count; i++)
        {
            ulong tmp;
            int n_order = count - 1;    // 阶数
            tmp = calc_combination_number(n_order, i);
            sum_x += (float)(tmp * points[i].x * Math.Pow((1 - t), n_order - i) * Math.Pow(t, i));
            sum_y += (float)(tmp * points[i].y * Math.Pow((1 - t), n_order - i) * Math.Pow(t, i));
            sum_z += (float)(tmp * points[i].z * Math.Pow((1 - t), n_order - i) * Math.Pow(t, i));
        }
        PointF.x = sum_x;
        PointF.y = sum_y;
        PointF.z = sum_z;
        return PointF;
    }

    /// <summary>
    /// 计算组合数公式
    /// </summary>
    /// <param name="n"></param>
    /// <param name="k"></param>
    /// <returns></returns>
    private static ulong calc_combination_number(int n, int k)
    {
        ulong[] result = new ulong[n + 1];
        for (int i = 1; i <= n; i++)
        {
            result[i] = 1;
            for (int j = i - 1; j >= 1; j--)
                result[j] += result[j - 1];
            result[0] = 1;
        }
        return result[k];
    }

}

参考链接 : https://blog.csdn.net/qq_32688731/article/details/84037072

原文地址:https://www.cnblogs.com/liucUP/p/10755420.html

时间: 2024-11-07 21:13:06

unity 两点间生成随机的贝塞尔曲线的相关文章

安卓自定义 View 进阶:贝塞尔曲线

在上一篇文章Path之基本图形中我们了解了Path的基本使用方法,本次了解Path中非常非常非常重要的内容-贝塞尔曲线. 一.Path常用方法表 为了兼容性(偷懒) 本表格中去除了在API21(即安卓版本5.0)以上才添加的方法.忍不住吐槽一下,为啥看起来有些顺手就能写的重载方法要等到API21才添加上啊.宝宝此刻内心也是崩溃的. 作用相关方法备注 移动起点moveTo移动下一次操作的起点位置 设置终点setLastPoint重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveT

Android自定义View进阶 - 贝塞尔曲线

Path之贝塞尔曲线 作者微博: @GcsSloop [本系列相关文章] 在上一篇文章Path之基本图形中我们了解了Path的基本使用方法,本次了解Path中非常非常非常重要的内容-贝塞尔曲线. 一.Path常用方法表 为了兼容性(偷懒) 本表格中去除了在API21(即安卓版本5.0)以上才添加的方法.忍不住吐槽一下,为啥看起来有些顺手就能写的重载方法要等到API21才添加上啊.宝宝此刻内心也是崩溃的. 作用 相关方法 备注 移动起点 moveTo 移动下一次操作的起点位置 设置终点 setLa

在Unity中使用贝塞尔曲线(转)

鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天因为工作的原因需要将贝塞尔曲线加在工程中,那么MOMO迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的任意角度的曲线,这两个点一个是起点,一个是终点.在这条曲线之上还会有两个可以任意移动的点来控制贝塞尔曲线的角度.如下图所示,点1 和点4 就是起点和终点,点2 和点3 就是控制曲线角度的两个动态点. 如下图所示.使用拖动条来让曲线发生旋转,大家会看的更加清晰.目前我们看到的被塞尔曲线是在平面中完成的,其实贝塞尔曲线是完全 支持3

Unity游戏中使用贝塞尔曲线

孙广东   2015.8.15 比方在3D rpg游戏中.我们想设置弹道,不同的轨迹类型! 目的:这篇文章的主要目的是要给你关于在游戏怎样使用贝塞尔曲线的基本想法. 贝塞尔曲线是最主要的曲线,一般用在计算机 图形学和 图像处理. 贝塞尔曲线能够用来创建平滑的曲线的道路. 弯曲的路径就像 祖玛游戏. 弯曲型的河流等. 一条贝塞尔曲线是由一组定义的控制点 P0到 Pn,在 n 调用它的顺序 (n = 1 为线性.2 为二次,等.).第一个和最后一个控制点总是具有终结点的曲线;然而,中间两个控制点 (

NGUI研究院之在Unity中使用贝塞尔曲线(六)[转]

鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天因为工作的原因需要将贝塞尔曲线加在工程中,那么MOMO迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的任意角度的曲线,这两个点一个是起点,一个是终点.在这条曲线之上还会有两个可以任意移动的点来控制贝塞尔曲线的角度.如下图所示,点1 和点4 就是起点和终点,点2 和点3 就是控制曲线角度的两个动态点. 如下图所示.使用拖动条来让曲线发生旋转,大家会看的更加清晰.目前我们看到的被塞尔曲线是在平面中完成的,其实贝塞尔曲线是完全支持3D

canvas-js贝塞尔曲线代码在线生成工具

详细内容请点击 canvas贝塞尔曲线代码在线生成工具 可以快速生成二次.三次贝塞尔曲线的源码生成器,方便经常使用到canvas画图的同学使用,可以直接预览效果随意画出自己想要的图像. 生成源码效果预览: canvas = document.getElementById("canvas"); ctx = canvas.getContext("2d") ctx.lineWidth = 6; ctx.strokeStyle = "#0090D2";

NGUI研究之在Unity中使用贝塞尔曲线

鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天因为工作的原因需要将贝塞尔曲线加在工程中,那么我迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的任意角度的曲线,这两个点一个是起点,一个是终点.在这条曲线之上还会有两个可以任意移动的点来控制贝塞尔曲线的角度.如下图所示,点1 和点4 就是起点和终点,点2 和点3 就是控制曲线角度的两个动态点.上一章分享了开发项目的一些使用心得比较细节对新手很有用可以看下. 如下图所示.使用拖动条来让曲线发生旋转,大家会看的更加清晰.目前我们看到

贝塞尔曲线:原理、自定义贝塞尔曲线View、使用!!!

一.原理 转自:http://www.2cto.com/kf/201401/275838.html Android动画学习Demo(3) 沿着贝塞尔曲线移动的Property Animation Property Animation中最重要,最基础的一个类就是ValueAnimator了.Property Animation利用ValueAnimator来跟踪记录对象属性已经变化了多长时间及当前这个时间点的值. 而在ValueAnimator中,又封装了两个类: 1)TimeInterpolat

【转~】初识贝塞尔曲线(B&#233;zier curve)

本文图文大多转自http://www.html-js.com/article/1628 QAQ我居然去扒维基,,,看不懂啊,,,我要去补数学,,, 在做变形小鸡的时候用到CSS3 transition-timing-function 属性,其语法如下: transition-timing-function: linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n); 总而言之可以用cubic-bezier(n,n,n,n)的形式