前言
最近項(xiàng)目需要呈現(xiàn)各種軌道且隨機(jī)性較強(qiáng)荧缘,在找了一天插件后打算自己實(shí)現(xiàn)平滑曲線递胧,思路是策劃對(duì)關(guān)卡中的軌道放置任意個(gè)節(jié)點(diǎn)鲫竞,我通過(guò)代碼將所有節(jié)點(diǎn)繪制成一條平滑的曲線昵济,每?jī)蓚€(gè)節(jié)點(diǎn)之間通過(guò)三階貝塞爾實(shí)現(xiàn)尚猿,最后獲得一個(gè)位置數(shù)組窝稿,在通過(guò)數(shù)組創(chuàng)建mesh路面。
這篇文章將介紹如何實(shí)現(xiàn)兩個(gè)節(jié)點(diǎn)之間的三次貝塞爾曲線運(yùn)用凿掂。
三次貝塞爾實(shí)際效果
貝塞爾公式
關(guān)于貝塞爾曲線詳細(xì)介紹請(qǐng)百度伴榔,這里直接列出三階貝塞爾公式:
三階貝塞爾公式
我將公式簡(jiǎn)化并封裝到一個(gè)靜態(tài)工具類(lè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));
}
}
為了驗(yàn)證函數(shù)的準(zhǔn)確性我創(chuàng)建了一個(gè)測(cè)試腳本庄萎,在場(chǎng)景中創(chuàng)建4個(gè)小球模擬p0~p3踪少,4個(gè)參數(shù),最后寫(xiě)一個(gè)循環(huán)從0-1 每次增加0.01代表t的變化糠涛,最后
在二維空間中的表現(xiàn)如下:
bezier1.gif
在三維空間中的表現(xiàn)如下:
bezier2.gif
以上實(shí)驗(yàn)結(jié)果達(dá)到預(yù)期要求援奢,接下來(lái)是連續(xù)繪制和生成mesh。