Unity3D學習日記(三)貝塞爾曲線
阿新 • • 發佈:2019-02-15
這裡有很多小夥伴可能不知道啥事貝塞爾曲線是啥玩意,如果你用過PS的鋼筆功能就知道這是啥,如果還是不知道這是啥那麼說一個遊戲你就知道了“憤怒的小鳥”這個遊戲用到彈弓效果可以用這個貝塞爾曲線來實現。還不知道的話拿自己去百度谷歌,這個是遊戲很常用到的一個畫曲線的函式方式。
那麼我們要實現貝塞爾曲線函式要怎麼弄了,別把貝塞爾曲線想的太難,其實如果你懂得怎麼貝塞爾曲線的公式怎麼寫,那麼這個其實將數學公式轉化成程式碼語言就行了。那麼我們先去看看貝塞爾曲線公式有哪些,下圖是百度百科對貝塞爾曲線的介紹並且其中還包括公式,有興趣的娃可以去百科看看這些介紹,地址如下:點選開啟連結
從上圖我們可以看出大體上用法有3種,如果看不懂這些不要緊,這裡我們把P1,P2等可以看作引數,t可以看作一個0-1的引數這樣將其化作簡單程式碼語言來看待,那麼我們可以根據引數多少大體知道有3個不同的引數的函式。接下來我們繼續往下把貝塞爾曲線函式實現出來,這裡寫成了靜態函式方便呼叫,因為很簡單所以就直接上程式碼了,如果連將數學公式轉化為簡單的程式碼語言都不會,怎麼你可要慎重考慮是否適合做這行了,程式碼如下:
一般公式是教你怎麼使用公式,這裡我們可以忽略掉的。這裡要注意的是,我們是通過t來繪製到曲線的每一個點位置,但是要記得t是一個0到1值,所以可以利用for迴圈來繪製所需要的點,大體用法就如圖所示:using UnityEngine; [System.Serializable] public class Bezier : System.Object { /// <summary> /// 線性貝賽爾曲線 /// </summary> /// <param name="P0"></param> /// <param name="P1"></param> /// <param name="t"> 0.0 >= t <= 1.0 </param> /// <returns></returns> public static Vector3 BezierCurve(Vector3 P0, Vector3 P1, float t) { Vector3 B = Vector3.zero; float t1 = (1 - t); B = t1*P0 + P1*t; //B.y = t1*P0.y + P1.y*t; //B.z = t1*P0.z + P1.z*t; return B; } /// <summary> /// /// </summary> /// <param name="P0"></param> /// <param name="P1"></param> /// <param name="P2"></param> /// <param name="t">0.0 >= t <= 1.0 </param> /// <returns></returns> public static Vector3 BezierCurve(Vector3 P0, Vector3 P1, Vector3 P2, float t) { Vector3 B = Vector3.zero; float t1 = (1 - t)*(1 - t); float t2 = t*(1 - t); float t3 = t*t; B = P0*t1 + 2*t2*P1 + t3*P2; //B.y = P0.y*t1 + 2*t2*P1.y + t3*P2.y; //B.z = P0.z*t1 + 2*t2*P1.z + t3*P2.z; return B; } /// <summary> /// /// </summary> /// <param name="P0"></param> /// <param name="P1"></param> /// <param name="P2"></param> /// <param name="P3"></param> /// <param name="t">0.0 >= t <= 1.0 </param> /// <returns></returns> public static Vector3 BezierCurve(Vector3 P0, Vector3 P1, Vector3 P2, Vector3 P3, float t) { Vector3 B = Vector3.zero; float t1 = (1 - t)*(1 - t)*(1 - t); float t2 = (1 - t)*(1 - t)*t; float t3 = t*t*(1 - t); float t4 = t*t*t; B = P0*t1 + 3*t2*P1 + 3*t3*P2 + P3*t4; //B.y = P0.y*t1 + 3*t2*P1.y + 3*t3*P2.y + P3.y*t4; //B.z = P0.z*t1 + 3*t2*P1.z + 3*t3*P2.z + P3.z*t4; return B; } }
這裡要感謝Momo大神,介面大部分程式碼都是用Momo寫個那個案例,原文地址:點選開啟連結
最後的效果如圖顯示: