吳曉亮,黃襄念(西華大學(xué)計(jì)算機(jī)與軟件工程學(xué)院,成都 610039)
Unity中使用貝塞爾曲線對三維物體進(jìn)行彎曲
吳曉亮,黃襄念
(西華大學(xué)計(jì)算機(jī)與軟件工程學(xué)院,成都610039)
三維物體在三維制作軟件中進(jìn)行彎曲,是很常見的。但是當(dāng)導(dǎo)出模型到游戲引擎后就無法再改變形狀,而現(xiàn)在一些虛擬現(xiàn)實(shí)的軟件中,經(jīng)常需要對三維物體進(jìn)行實(shí)時的彎曲,如管道等。要想在游戲引擎中對三維物體進(jìn)行變形,就只有通過算法編程進(jìn)行實(shí)現(xiàn)[1]。而管道等這些長條型物體,可以看成一條粗的線,只不過這條線主要靠的是網(wǎng)格,而形成網(wǎng)格的基礎(chǔ)就是網(wǎng)格點(diǎn),通過使用貝塞爾曲線控制網(wǎng)格點(diǎn),就可以控制三維物體的形狀,達(dá)到彎曲變形的目的。
貝塞爾曲線是一種應(yīng)用于二維圖形應(yīng)用程序的數(shù)學(xué)曲線。貝塞爾曲線由線段與節(jié)點(diǎn)組成,節(jié)點(diǎn)是可拖動的支點(diǎn),線段像可伸縮的皮筋。通過拖動節(jié)點(diǎn),可以改變線段的彎曲程度和彎曲方向。貝塞爾曲線有線性公式、二次方公式、三次方公式和一般參數(shù)公式,分別對應(yīng)兩個節(jié)點(diǎn)、三個節(jié)點(diǎn)、四個節(jié)點(diǎn)和任意節(jié)點(diǎn)的貝塞爾曲線。由于這里只會用到四個節(jié)點(diǎn),所以只敘述三次方公式。
貝塞爾曲線的定義有四個點(diǎn):起始點(diǎn)、終止點(diǎn)(也稱錨點(diǎn))以及兩個相互分離的中間點(diǎn)。滑動兩個中間點(diǎn),貝塞爾曲線的形狀會發(fā)生變化。
如圖1,定義四個頂點(diǎn)P0、P1、P2、P3,曲線從P0走向P3,并不會經(jīng)P1、P2兩點(diǎn)。這兩個點(diǎn)只是在那里提供方向信息。P0和P1之間的間距,決定了曲線在趨進(jìn)P3之前,走向P2方向的長度有多長。
貝塞爾曲線公式[2]:
B(t)=P0(1-t)3+3P1t(1-t)3+3P2t2(1-t)+P3t3,t∈[0,1]
上述公式中,參數(shù)t可看做是線段百分比所在的位置,如圖2所示。
三維物體的形成,主要靠的就是網(wǎng)格,而網(wǎng)格的形成則需要網(wǎng)格頂點(diǎn)。如圖3-1所示的,就是一個圓柱體的網(wǎng)格,在建模的時候,都會看見模型上有著密密麻麻的網(wǎng)格,在網(wǎng)格的邊相交的地方就是網(wǎng)格頂點(diǎn),通過改變這些網(wǎng)格頂點(diǎn)的位置,相應(yīng)的網(wǎng)格就會發(fā)生形狀變化,從而讓模型的形狀發(fā)生改變。

圖1 貝塞爾曲線效果圖

圖2 生成示意圖
在Unity中,模型導(dǎo)入后形狀就會固定,達(dá)不到想要彎曲變形的目的。要想在Unity中對模型實(shí)時操作變形,就需要通過算法來實(shí)現(xiàn)。
Unity中的網(wǎng)格信息是通過 GameObject的 Mesh-Filter組件中的mesh屬性來獲取。所以想要進(jìn)行網(wǎng)格操作,必須為游戲?qū)ο筇砑右粋€MeshFiler游戲組件,而MeshFiler中的mesh屬性中包含了三維游戲模型的法線、UV坐標(biāo)、三角形和vertices頂點(diǎn)數(shù)組屬性。三角形屬性并不是單獨(dú)保存,而是通過頂點(diǎn)數(shù)組間接保存。數(shù)組不使用特殊類表示三角形,而只是一個簡單的整數(shù)指數(shù)列表。每一個三角形都是以三個點(diǎn)為一組,因此,前三個元素定義為第一個三角形,之后的三個元素定義為第二個三角形,并依此類推。

圖3 三維網(wǎng)格
要對三維物體進(jìn)行變形,只需要獲得這組頂點(diǎn)數(shù)組,將每一個頂點(diǎn)的位置通過貝塞爾曲線算法進(jìn)行計(jì)算,重新定位即可。具體算法如下[3]:
(1)將三維物體導(dǎo)入U(xiǎn)nity引擎中,為其添加Mesh-Filer組件,通過它獲取物體的mesh屬性,再通過mesh獲取物體的網(wǎng)格頂點(diǎn)vertices屬性。
(2)為物體創(chuàng)建一條貝塞爾曲線。在三維物體的兩端加入兩個子物體,對應(yīng)好位置,通過引擎提供的In-verseTransformPoint()函數(shù)將兩個子物體的坐標(biāo)點(diǎn)轉(zhuǎn)化為三維物體的本地坐標(biāo)點(diǎn),并將此兩點(diǎn)作為三階貝塞爾曲線的兩個端點(diǎn)。再在此兩點(diǎn)中間任取兩點(diǎn),將其作為貝塞爾曲線的錨點(diǎn)。有了這四個頂點(diǎn),就可以根據(jù)三階貝塞爾曲線公式計(jì)算出一條適用于這個三維物體的一條曲線。
(3)將獲取到的mesh屬性的vertices數(shù)組取出,根據(jù)自己的物體要彎曲的軸向,選擇相應(yīng)的X、Y、Z軸,并找出相應(yīng)軸的最大值和最小值,相減獲得物體的總長,再將每個點(diǎn)對應(yīng)的值和最小值相減并除以總長,得到每一個網(wǎng)格頂點(diǎn)在物體中的百分比。
(4)將百分比值傳給貝塞爾曲線,計(jì)算出貝塞爾曲線對應(yīng)的百分比所在點(diǎn),并計(jì)算出此百分比對應(yīng)的前一個點(diǎn)和后一個點(diǎn)。
(5)通過叉乘,計(jì)算出這個百分比所在的貝塞爾曲線上的切線方向和垂直方向的偏移量。
(6)將此切線偏移量和垂直偏移量和三維物體的vertices屬性中對應(yīng)百分比的點(diǎn)相加,得到新的網(wǎng)格頂點(diǎn)。
(7)重復(fù)上述(3)到(6)的操作步驟,計(jì)算出每一個網(wǎng)格頂點(diǎn)的值。如此得到一個新的網(wǎng)格頂點(diǎn)數(shù)組,將此數(shù)組賦給vertices得到新的vertices頂點(diǎn)屬性,就改變了三維物體網(wǎng)格頂點(diǎn)的位置,從而使物體發(fā)生彎曲(如下圖)。

圖4 三維物體彎曲
本文給出了利用貝塞爾曲線對三維物體進(jìn)行彎曲的實(shí)現(xiàn)算法,并且對Unity中的網(wǎng)格屬性進(jìn)行了簡單的說明,使大家對網(wǎng)格有簡單的認(rèn)識,在實(shí)現(xiàn)算法時有一定的幫助。但是在Unity中實(shí)現(xiàn)此算法,需要掌握一些Unity3D的API[4],使用這些API進(jìn)行計(jì)算,可以減少許多不必要的實(shí)現(xiàn)代碼,可以大大地簡化此算法的實(shí)現(xiàn)。
此算法擴(kuò)大了貝塞爾曲線的應(yīng)用,不只是局限于應(yīng)用在二維平面中的線條,如今也可以應(yīng)用于三維的條形狀物體,具有一定的創(chuàng)新性。
[1]丁德紅,方逵,饒大鵬,敬松.三維植物花朵動態(tài)仿真模型技術(shù)研究與實(shí)現(xiàn)[J].農(nóng)機(jī)化研究,2014(5)
[2]王竹溪,郭敦仁著.特殊函數(shù)概論[M].北京:北京大學(xué)出版社,2012.
[3]陳江.VC實(shí)現(xiàn)貝塞爾曲線繪制[J].科技經(jīng)濟(jì)市場,2011(5)
[4]陳泉宏著.Unity API詳解[M].北京:人民郵電出版社,2014.
[5]克利福德·彼得斯(Clifford Peters),斯特·奈·斯瑞(Thet Naing Swe)著.Unity 3D人工智能編程[M].李秉義譯.北京:機(jī)械工業(yè)出版社,2015.
Bezier Curve;3D Object;Mesh Vertex;Bend
Using Bezier Curve to Bend 3D Objects in Unity
WU Xiao-liang,HUANG Xiang-nian
(School of Computer and Software Engineering,Xihua University,Chengdu610039)
1007-1423(2016)07-0057-03
10.3969/j.issn.1007-1423.2016.07.013
吳曉亮(1994-),男,四川簡陽人,本科,研究方向?yàn)閁nity開發(fā)
2016-01-26
2016-02-26
隨著虛擬現(xiàn)實(shí)的發(fā)展,在游戲引擎中對三維物體進(jìn)行彎曲效果的模擬越來越重要。在三維游戲引擎中,需要對一些三維的物體進(jìn)行彎曲,以達(dá)到游戲操作中實(shí)時模擬物體彎曲。貝塞爾曲線算法是一個在計(jì)算機(jī)圖形中常用的算法,被用于各類圖形制作軟件中,如Photoshop等軟件,但多限于二維線條的應(yīng)用,在三維物體上的應(yīng)用較少。通過貝塞爾曲線算法結(jié)合三維物體的網(wǎng)格頂點(diǎn),可以實(shí)現(xiàn)對條形三維物體進(jìn)行彎曲變化。
貝塞爾曲線;三維物體;網(wǎng)格頂點(diǎn);彎曲
2014年國家級大學(xué)生創(chuàng)新訓(xùn)練項(xiàng)目(No.201410623012)
黃襄念(1964-),男,四川人,教授,研究方向?yàn)閳D像/文字識別技術(shù)與系統(tǒng)、智能視頻監(jiān)控技術(shù)與系統(tǒng)、三維游戲圖形引擎技術(shù)與系統(tǒng)、體感交互技術(shù)與虛擬現(xiàn)實(shí)系統(tǒng)
With the development of virtual reality,it’s increasingly important to simulate bending effect of 3D objects in game engine.In order to re-al-time simulate the bending of object in the 3D game engine,it needs to bend some 3D objects.Bezier curve algorithm is one of the common algorithms in computer graphics,which is used in all kinds of graphics software,such as Photoshop and so on.It is usually used in 2D lines while rarely in 3D objects.By combining Bezier curve algorithm with mesh vertex of the 3D objects,it can achieve to bend the bar 3D objects.