在Unity中使用贝塞尔曲线

作者: Foldcc | 来源:发表于2019-03-06 22:28 被阅读0次

    前言

    最近项目需要呈现各种轨道且随机性较强,在找了一天插件后打算自己实现平滑曲线,思路是策划对关卡中的轨道放置任意个节点,我通过代码将所有节点绘制成一条平滑的曲线,每两个节点之间通过三阶贝塞尔实现,最后获得一个位置数组,在通过数组创建mesh路面。

    这篇文章将介绍如何实现两个节点之间的三次贝塞尔曲线运用。


    三次贝塞尔实际效果

    贝塞尔公式

    关于贝塞尔曲线详细介绍请百度,这里直接列出三阶贝塞尔公式:


    三阶贝塞尔公式

    我将公式简化并封装到一个静态工具类中,需要复制即可:

        /// <summary>
        /// 作者:Foldcc
        /// </summary>
    public class BezierMath
    {
        /// <summary>
        /// 二次贝塞尔
        /// </summary>
        public static Vector3 Bezier_2(Vector3 p0, Vector3 p1, Vector3 p2, float t)
        {
            return (1 - t) * ((1 - t) * p0 + t * p1) + t * ((1 - t) * p1 + t * p2);
        }
        public static void Bezier_2ref(ref Vector3 outValue, Vector3 p0, Vector3 p1, Vector3 p2, float t)
        {
            outValue = (1 - t) * ((1 - t) * p0 + t * p1) + t * ((1 - t) * p1 + t * p2);
        }
    
        /// <summary>
        /// 三次贝塞尔
        /// </summary>
        public static Vector3 Bezier_3(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t)
        {
            return (1 - t) * ((1 - t) * ((1 - t) * p0 + t * p1) + t * ((1 - t) * p1 + t * p2)) + t * ((1 - t) * ((1 - t) * p1 + t * p2) + t * ((1 - t) * p2 + t * p3));
        }
        public static void Bezier_3ref(ref Vector3 outValue , Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t)
        {
            outValue = (1 - t) * ((1 - t) * ((1 - t) * p0 + t * p1) + t * ((1 - t) * p1 + t * p2)) + t * ((1 - t) * ((1 - t) * p1 + t * p2) + t * ((1 - t) * p2 + t * p3));
        }
    }
    

    为了验证函数的准确性我创建了一个测试脚本,在场景中创建4个小球模拟p0~p3,4个参数,最后写一个循环从0-1 每次增加0.01代表t的变化,最后

    在二维空间中的表现如下:


    bezier1.gif

    在三维空间中的表现如下:


    bezier2.gif

    以上实验结果达到预期要求,接下来是连续绘制和生成mesh。

    相关文章

      网友评论

        本文标题:在Unity中使用贝塞尔曲线

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