1. 程式人生 > >Unity3D學習日記(三)貝塞爾曲線

Unity3D學習日記(三)貝塞爾曲線

這裡有很多小夥伴可能不知道啥事貝塞爾曲線是啥玩意,如果你用過PS的鋼筆功能就知道這是啥,如果還是不知道這是啥那麼說一個遊戲你就知道了“憤怒的小鳥”這個遊戲用到彈弓效果可以用這個貝塞爾曲線來實現。還不知道的話拿自己去百度谷歌,這個是遊戲很常用到的一個畫曲線的函式方式。

那麼我們要實現貝塞爾曲線函式要怎麼弄了,別把貝塞爾曲線想的太難,其實如果你懂得怎麼貝塞爾曲線的公式怎麼寫,那麼這個其實將數學公式轉化成程式碼語言就行了。那麼我們先去看看貝塞爾曲線公式有哪些,下圖是百度百科對貝塞爾曲線的介紹並且其中還包括公式,有興趣的娃可以去百科看看這些介紹,地址如下:點選開啟連結


從上圖我們可以看出大體上用法有3種,如果看不懂這些不要緊,這裡我們把P1,P2等可以看作引數,t可以看作一個0-1的引數這樣將其化作簡單程式碼語言來看待,那麼我們可以根據引數多少大體知道有3個不同的引數的函式。接下來我們繼續往下把貝塞爾曲線函式實現出來,這裡寫成了靜態函式方便呼叫,因為很簡單所以就直接上程式碼了,如果連將數學公式轉化為簡單的程式碼語言都不會,怎麼你可要慎重考慮是否適合做這行了,程式碼如下:

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;
    }
}
一般公式是教你怎麼使用公式,這裡我們可以忽略掉的。這裡要注意的是,我們是通過t來繪製到曲線的每一個點位置,但是要記得t是一個0到1值,所以可以利用for迴圈來繪製所需要的點,大體用法就如圖所示:


這裡要感謝Momo大神,介面大部分程式碼都是用Momo寫個那個案例,原文地址:點選開啟連結

最後的效果如圖顯示: