電腦圖學-淺談B-Spline曲線

Awan
4 min readJun 12, 2020

--

在電腦圖學中B-Spline(B雲形線,或稱B樣條),是Bézier(貝茲曲線)的一種延伸變化,B-Spline不但保有貝茲曲線的優點,且與Bézier不同的是B-Spline的曲線的方程式次數與控制點個數無關,而Bézier的曲線次數則是受到控制點個數的影響,所以在增加或減少或移動B-Spline的控制點時只會改變局部的曲線造型,而不會像Bézier一樣整條曲線的造型都受到影響。

而在「The NURBS BOOK」這本書中對於B-Spline(B雲形線)的數學定義描述是以曲線的次數(degree)進行描述,而我則是為了方便自己設計Recursive去計算基底函數所以對於數學定義則是以曲線的階數(order)來描述。

首先我們來看看B-Spline的數學定義:

B-Spline數學式定義

接著來整理一下這些數學式中的符號:
1. Pi: 曲線的第i個控制點(Control Point)
2. Ni,p:為階數p在第i個控制點的基底函數(Basis function)
3. C(u): 為控制點Pi經過基底函數計算之後插捕的位置輸出結果
4. u:介於0到1之間的節點插值,若不在0到1之間則需正規化(Normalization)
5. U:一組非遞減的節點向量(Knot Vector),要注意的是這邊的向量並非是指帶有大小及方向的量,而是指一個數列清單

其中在B-Spline的曲線定義中,【控制點的個數】與【節點向量中的節點個數】和【曲線的數學方程式的次數(或階數)】有著較為嚴謹的關係:
1. 階數(order)=次數(degree)+1
2. 節點向量(Knot Vector)中的節點個數=控制點數量+階數
3. 節點向量(Knot Vector)的起始值為0,結束值為1,且起始與結束的節點值需重複,重複的次數需與階數相同,才能確保曲線會通過第一個和最後一個控制點。
---------------------------------------------------------------------------------------------------------舉例來說,若有一條B-Spline有4個控制點、且曲線方程式為2次如下:
1. 控制點(Control Point):[P0,P1,P2,P3]=[(0,0) , (10,15) , (20,5) , (30,20)]
2. 階數(order)=2+1=3
3. 節點向量(Knot Vector):U=[ u0 , u1 , u2 , u3 , u4 , u5 , u6 ]
=[ 0 , 0 , 0 , u3 , 1 , 1 , 1 ]=[0,0,0,0.5,1,1,1]

產生的B-Spline曲線
基底函數與各節點插值之間的關係

— — — — — — — — — — — — — — — — — — — — — — — — — —
從輸出的結果可以觀察到B-Spline除了第一個和最後一個控制點,B-Spline並不會經過控制點,且基底函數Ni,p(u)的總和在任何一個0到1之間的節點插值均會為1。

--

--

Awan
0 Followers

2020畢業的新鮮人,想趁著求職空窗期的這段時間整理自己求學過程中所學到及體會的事物,並且記錄生活的點滴。