在Unity中使用贝塞尔曲线

尊重原创,从你我做起
原创地址:https://www.jianshu.com/p/144948c671a2

前言

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

三次贝塞尔曲线实际效果

贝塞尔公式

一阶贝塞尔曲线
一阶贝塞尔曲线
二阶贝塞尔曲线
二阶贝塞尔曲线
三阶贝塞尔曲线

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

    /// <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。

posted @ 2022-02-14 12:58  yassine  阅读(288)  评论(0编辑  收藏  举报