unity3D中貝塞爾曲線的控制點計算

       一、貝塞爾曲線的概念 

        對於兩點之間的連線,我們可以用直線進行連接效果如下:

        其中的每一個F點都在AB連接的線段上

        這就是一階貝塞爾曲線

       

如果我們加入一個控制點C,那麼做圖如下:

       1、連接AC,BC

        2、在AC,BC上找到 AD/AC = CE/CB 的點D,E

        3、連接DE,在DE上尋找點F,F點需要滿足:EF/ ED = AD/AC = CE/CB

        4、找出所有F點,連接而成的線,就是貝塞爾曲線

       兩個線段根據等比關係找點的貝塞爾曲線,一般也稱爲二階貝塞爾曲線。

       關於貝賽爾曲線的基本數學理論大概就是上面的內容。

       除了二階貝塞爾曲線外還有三階,四階貝塞爾曲線,它們的控制點依次增加,我們常用的是三階貝塞爾曲線,有兩個控制點,控制點決定着生成完成後曲線的形狀。

      三階貝塞爾曲線的繪製示意圖如下:

     1、首先連接AC,AB,BD

     2、找到EFG三點,滿足 AE/AC = BF/BA = DG/DB

     3、連接EF.FG

     4、找到J,I兩點,滿足 AE/AC = BF/BA = DG/DB = FJ/FE = GI/GF

     5、連接JI兩點

     6、找到H點,滿足AE/AC = BF/BA = DG/DB = FJ/FE = GI/GF = IH/IJ

     7、F點從A移動到B,所計算出的H點連成的線,就是三階貝塞爾曲線

二、三階貝塞爾曲線控制點的計算方法

        介紹完了什麼是貝塞爾曲線,現在來說遇到的問題:

        現在已知有A,B.C.D,E,F,G,H點若干個,假如它們直線連接如下

       可以看出,連接直線並不平滑,在連接點上會出現方向突變。

       如果想要生成光滑曲線,需要進行控制點計算,計算出A,B,C,D,E,F,H各個帶你的控制點進行計算

       每個位置要計算出左右兩個控制點L1,L2:

算法如下:

1、兩端的控制點位置爲自己本身,例如A點控制點位置L1=L2=A ,G點 L1=L2=G

2、中間控制點的位置由左右兩個點的位置決定,例如C點的控制點位置通過計算BCD連接而成的三角形決定

3、計算向量\underset{CB}{\rightarrow}\underset{CD}{\rightarrow} 與三角形BCD的夾角\angle BCD  ,

4、計算垂直於三角形BCD所在平面的單位向量\underset{CF}{\rightarrow},計算方法爲\underset{CB}{\rightarrow}\underset{CD}{\rightarrow}的向量積,再歸一化

5、向量\underset{CB}{\rightarrow}\underset{CF}{\rightarrow}軸旋轉 (^{180^{0}} - \angle BCD)/ 2 度 得到向量\underset{C^{D{'}}}{\rightarrow}

6、向量\underset{CD}{\rightarrow}\underset{CF}{\rightarrow}軸旋轉 -(^{180^{0}} - \angle BCD)/ 2 度得到向量  \underset{C^{B{'}}}{\rightarrow}

7、將5,6計算結果乘以一個比例因子\lambda的到向量CL1 與CL2(\lambda的大小決定曲線的形狀,一般設置在0.5以下)

8、L1座標 = CL1 + C , L2座標 = CL2 + C

    \angle BCD如果爲180度,那麼跳過4,5,6步的計算

三、代碼實現

      暫無

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章