在Unity中使用貝塞爾曲線

前言

最近項目需要呈現(xiàn)各種軌道且隨機性較強,在找了一天插件后打算自己實現(xiàn)平滑曲線,思路是策劃對關(guān)卡中的軌道放置任意個節(jié)點,我通過代碼將所有節(jié)點繪制成一條平滑的曲線,每兩個節(jié)點之間通過三階貝塞爾實現(xiàn),最后獲得一個位置數(shù)組,在通過數(shù)組創(chuàng)建mesh路面。

這篇文章將介紹如何實現(xiàn)兩個節(jié)點之間的三次貝塞爾曲線運用。


三次貝塞爾實際效果

貝塞爾公式

關(guān)于貝塞爾曲線詳細介紹請百度,這里直接列出三階貝塞爾公式:


三階貝塞爾公式

我將公式簡化并封裝到一個靜態(tài)工具類中,需要復(fù)制即可:

    /// <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));
    }
}

為了驗證函數(shù)的準確性我創(chuàng)建了一個測試腳本,在場景中創(chuàng)建4個小球模擬p0~p3,4個參數(shù),最后寫一個循環(huán)從0-1 每次增加0.01代表t的變化,最后

在二維空間中的表現(xiàn)如下:


bezier1.gif

在三維空間中的表現(xiàn)如下:


bezier2.gif

以上實驗結(jié)果達到預(yù)期要求,接下來是連續(xù)繪制和生成mesh。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容