前言
最近項目需要呈現(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。