在20世紀(jì)50年代和60年代在雷諾公司工作期間,皮埃爾·貝塞爾(Pierre Bézier)開發(fā)了用于設(shè)計汽車車身的軟件系統(tǒng)。他的程序利用了Paul de Casteljau之前開發(fā)的數(shù)學(xué)方程組,后者曾為競爭對手雪鐵龍汽車制造商[BE72,DC63]工作。de Casteljau方程僅使用幾個標(biāo)量參數(shù)描述曲線,同時使用一種高明的的遞歸算法,稱為“de Casteljau算法”,就可以生成任意精度的曲線?,F(xiàn)在它們分別被稱為“貝塞爾曲線”和“貝塞爾曲面”,這些方法通常用于高效地對各種曲面3D物體進行建模。
參考這個
11.1 二次貝塞爾曲線(三點)
二次貝塞爾曲線由一組參數(shù)方程定義,方程組中使用3個控制點指定特定的曲線的形狀,每個控制點都是2D空間中的一個點??紤]圖11.1中所示的一組3個點[p0,p1,p2]。
通過引入?yún)?shù)t,我們可以構(gòu)建一個用來定義曲線的參數(shù)方程組。表示從一個控制點到另一控制點間線段距離的分?jǐn)?shù)。對于在線段上的點,t的值在[0…1]的范圍內(nèi)。圖11.2顯示了一個這樣的值:t=0.75,分別應(yīng)用于連接
p0-p1,p1-p2的線段。通過t在兩條原始線段上定義了兩個新點p01(t)和p12(t)。我們對連接兩個新點p01(t)和p12(t)
的線段重復(fù)該過程,產(chǎn)生點P(t),其中沿線段p01(t)和p12(t)在t=0.75得到點P(t)。P(t)是最終得到的曲線上的點,因此用大寫字母P表示。
針對各種t值收集大量的點P(t),則會產(chǎn)生一條曲線,如圖11.3所示。采樣的t的參數(shù)值越多,生成的點P(t)越多,得到的曲線則越平滑。
現(xiàn)在可以導(dǎo)出二次貝塞爾曲線的分析定義。首先,我們注意到連接兩個點pa和pb的線段pa-pb上的任意點p可以用參數(shù)t表示如下:
使用該等式,我們解出點p01和p12(分別在p0-p1,p1-p2上的點)如下:
同理,在這兩點所連接的線段上的點可以表示為:
替換p12和p01的定義得:
分解并重新合并各項可得:
或
其中
因此,我們通過控制點的加權(quán)和解出曲線上的任意點。加權(quán)函數(shù)B通常被稱為“混合函數(shù)”(盡管名稱“B”實際上源自Sergei Bernstein [BE16],他首先描述了這個多項式族)。請注意,混合函數(shù)的形式都是二次的,這就是為什么得到的曲線稱為二次貝塞爾曲線。
11.2 三次貝塞爾曲線(四點)
我們現(xiàn)在將曲線模型擴展到4個控制點,就會得到一個三次貝塞爾曲線,如圖11.4所示。與二次曲線相比,三次貝塞爾曲線能夠定義的形狀更加豐富,而二次曲線僅限于定義凹形。
同二次曲線時的情形,我們可以推導(dǎo)出三次貝塞爾曲線的解析定義:
曲線上的點則是:
使用p12-23和p01-12的定義替換等式中的項,再合并得:
其中
渲染貝塞爾曲線時,可以使用許多不同的技術(shù)。其中一種方法是,使用固定的增量,在0.0~1.0范圍內(nèi),迭代增加得出t的后繼值。
例如,當(dāng)增量為0.1時,我們可以使用t值為0.0、0.1、0.2、0.3等的循環(huán)。對于t的每個值,計算貝塞爾曲線上的對應(yīng)點,并繪制連接連續(xù)點的一系列線段,如圖11.5中的算法所述。
另一種方法是使用de Casteljau算法遞歸地將曲線對半細(xì)分,其中,在每個遞歸步驟t=1/2。圖11.6展示了左側(cè)曲線細(xì)分后的新三次控制點(q0,q1,q2,q3),以綠色顯示(見彩插)。該算法由de Casteljau提出(完整推導(dǎo)見[AS14])。
算法見圖11.7。該算法重復(fù)將曲線段細(xì)分為兩半的過程,直到每個曲線段足夠直,進一步的細(xì)分不會產(chǎn)生實際的好處。在極限情況下(隨著生成的控制點越來越靠近),曲線段本身實際上與第一個控制點和最后一個控制點(
q0和q3)之間的線段相同。因此,可以通過比較從第一控制點到最后一個控制點的距離與連接4個控制點的3條線段的長度之和來確定曲線段是否“足夠直”:
當(dāng)D1-D2小于一個足夠小的閾值時,進一步的細(xì)分就沒有意義了。
de Casteljau算法有一個有趣的特性,它可以在不使用之前描述的混合函數(shù)的情況下,生成曲線上所有的點。同時請注意,p(1/2)處的中心點是“共享”的,即它既是左細(xì)分中最右的控制點,也是右細(xì)分中最左的控制點。它可以使用t=1/2處的混合函數(shù)或使用由de Casteljau導(dǎo)出的公式(q2+r1)/2來計算。
另請注意,圖11.7中所示的subdivide()
函數(shù)假定傳入的參數(shù) p、q和r是“引用”參數(shù),因此,圖11.7上方列出的drawBezierCurve
函數(shù)對于subdivide()
的調(diào)用,導(dǎo)致subdivide()
函數(shù)中的計算修改了調(diào)用中所傳的實際參數(shù)。
11.3 二次貝塞爾曲面(3x3控制點)
貝塞爾曲線定義了曲線(在2D或3D空間中),而貝塞爾曲面定義了3D空間中的曲面。將我們在曲線中看到的概念擴展到曲面,需要將參數(shù)方程組中的參數(shù)個數(shù)從一個擴展到兩個。對于貝塞爾曲線,我們將參數(shù)稱為t。對于貝塞爾曲面,我們將參數(shù)稱為u和v。曲線由點P(t)組成,而曲面將由點 P(u,v)組成,如圖11.8所示。
對于二次貝塞爾曲面,每個軸u和v上有3個控制點,總共9個控制點。圖11.9(見彩插)使用藍色展示了一組共9個控制點(通常稱為控制點“網(wǎng)格”)的示例,以及相應(yīng)的曲面(紅色)。
網(wǎng)格中的9個控制點標(biāo)記為pij,其中i和j分別代表u和v方向上的索引。每組3個相鄰控制點(例如(p00,p01,p02))會定義一條貝塞爾曲線。然后將表面上的點P(u,v)定義為兩個混合函數(shù)的和,一個在u方向,一個在v方向。則用于構(gòu)建貝塞爾曲面的兩個混合函數(shù)的形式遵循先前為貝塞爾曲線給出的方法:
接下來生成構(gòu)成貝塞爾曲面的點P(u,v)。對于每個控制點pij將其與第i個混合函數(shù)在u處的值相乘,再與第j個混合函數(shù)在v處的值相乘。最后將所有控制點的結(jié)果求和,生成貝塞爾曲面上的點 P(u,v)
組成貝塞爾曲面的生成點集有時會稱為補丁。術(shù)語“補丁”有時 會讓人感到困惑,我們稍后在研究曲面細(xì)分著色器時會看到(對于實 際實現(xiàn)貝塞爾曲面非常有用)。因為通常控制點組成的網(wǎng)格才稱為 “補丁”。
11.4 三次貝塞爾曲面(4x4控制點)
從二次曲面到三次曲面需要使用更大的網(wǎng)格——4×4而非3×3。 圖11.10(見彩插)顯示了16控制點網(wǎng)格(藍色)和相應(yīng)曲面(紅色)的示例。
同上,我們可以通過組合三次貝塞爾曲線的相關(guān)混合函數(shù)來推導(dǎo)表面上的點P(u,v)的公式:
其中:
渲染貝塞爾曲面也可以通過遞歸細(xì)分[AS14]完成,方法是交替地將曲面沿每個維度分成兩半,如圖11.11所示。每個細(xì)分產(chǎn)生4個新的控制點網(wǎng)格,每個網(wǎng)格包含16個點,這些點定義了曲面的一個象限。
當(dāng)渲染貝塞爾曲線時,我們在曲線“足夠直”時停止細(xì)分。而對于貝塞爾曲面,我們在曲面“足夠平坦”時停止遞歸。一種實現(xiàn)方法是,確保子象限控制網(wǎng)格上所有遞歸生成的點,距由該網(wǎng)格的4個角點中的3個定義的平面的距離,都小于一個允許的范圍。點(x,y,z)與平面(A,B,C,D)之間的距離d為:
如果小于某個足夠小的閾值,則我們停止細(xì)分過程,并簡單地使d用子象限網(wǎng)格的4個角的控制點來繪制兩個三角形。
對于貝塞爾曲線,OpenGL管線的細(xì)分階段為基于圖11.5中的迭代算法渲染貝塞爾曲面提供了一種有吸引力的替代方法。其策略是讓曲面細(xì)分生成一個大的頂點網(wǎng)格,然后使用混合函數(shù)將這些頂點重新定位到貝塞爾曲面上,由三次貝塞爾控制點指定。我們在第12章中實現(xiàn)了這一點。
補充說明
本章重點介紹參數(shù)貝塞爾曲線和曲面的數(shù)學(xué)基礎(chǔ)。我們推遲了在OpenGL中呈現(xiàn)其中任何一個的實現(xiàn),因為實現(xiàn)它們需要適當(dāng)?shù)那婕?xì)分著色器知識作為載體,我們將在下一章中進行介紹。我們還跳過了一些推導(dǎo)過程,例如遞歸細(xì)分算法。
在3D圖形中,使用貝塞爾曲線建模對象有許多優(yōu)點。首先,理論上,這些物體可以任意縮放,并且仍然保持光滑的表面而不“像素化”。其次,許多由復(fù)雜曲線組成的物體可以使用貝塞爾控制點集合進行更有效的存儲,而不是存儲數(shù)千個頂點。文章來源:http://www.zghlxwxcb.cn/news/detail-483056.html
除計算機圖形和汽車外,貝塞爾曲線還有許多實際應(yīng)用。在橋梁設(shè)計中也可以找到它們的身影,例如耶路撒冷的Chords Bridge[CB16]。類似的技術(shù)也用于構(gòu)建TrueType字體,因此可以將其縮放到任意大小,或者將視角任意拉近觀看,而字體邊緣始終保持平滑。文章來源地址http://www.zghlxwxcb.cn/news/detail-483056.html
到了這里,關(guān)于計算機圖形學(xué)與opengl C++版 學(xué)習(xí)筆記 第11章 參數(shù)曲面的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!