吳曉亮,黃襄念(西華大學(xué)計(jì)算機(jī)與軟件工程學(xué)院,成都 610039)
Unity中使用貝塞爾曲線對(duì)三維物體進(jìn)行彎曲
吳曉亮,黃襄念
(西華大學(xué)計(jì)算機(jī)與軟件工程學(xué)院,成都610039)
三維物體在三維制作軟件中進(jìn)行彎曲,是很常見的。但是當(dāng)導(dǎo)出模型到游戲引擎后就無(wú)法再改變形狀,而現(xiàn)在一些虛擬現(xiàn)實(shí)的軟件中,經(jīng)常需要對(duì)三維物體進(jìn)行實(shí)時(shí)的彎曲,如管道等。要想在游戲引擎中對(duì)三維物體進(jìn)行變形,就只有通過算法編程進(jìn)行實(shí)現(xiàn)[1]。而管道等這些長(zhǎng)條型物體,可以看成一條粗的線,只不過這條線主要靠的是網(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)是可拖動(dòng)的支點(diǎn),線段像可伸縮的皮筋。通過拖動(dòng)節(jié)點(diǎn),可以改變線段的彎曲程度和彎曲方向。貝塞爾曲線有線性公式、二次方公式、三次方公式和一般參數(shù)公式,分別對(duì)應(yīng)兩個(gè)節(jié)點(diǎn)、三個(gè)節(jié)點(diǎn)、四個(gè)節(jié)點(diǎn)和任意節(jié)點(diǎn)的貝塞爾曲線。由于這里只會(huì)用到四個(gè)節(jié)點(diǎn),所以只敘述三次方公式。
貝塞爾曲線的定義有四個(gè)點(diǎn):起始點(diǎn)、終止點(diǎn)(也稱錨點(diǎn))以及兩個(gè)相互分離的中間點(diǎn)?;瑒?dòng)兩個(gè)中間點(diǎn),貝塞爾曲線的形狀會(huì)發(fā)生變化。
如圖1,定義四個(gè)頂點(diǎn)P0、P1、P2、P3,曲線從P0走向P3,并不會(huì)經(jīng)P1、P2兩點(diǎn)。這兩個(gè)點(diǎn)只是在那里提供方向信息。P0和P1之間的間距,決定了曲線在趨進(jìn)P3之前,走向P2方向的長(zhǎng)度有多長(zhǎng)。
貝塞爾曲線公式[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所示的,就是一個(gè)圓柱體的網(wǎng)格,在建模的時(shí)候,都會(huì)看見模型上有著密密麻麻的網(wǎng)格,在網(wǎng)格的邊相交的地方就是網(wǎng)格頂點(diǎn),通過改變這些網(wǎng)格頂點(diǎn)的位置,相應(yīng)的網(wǎng)格就會(huì)發(fā)生形狀變化,從而讓模型的形狀發(fā)生改變。
圖1 貝塞爾曲線效果圖
圖2 生成示意圖
在Unity中,模型導(dǎo)入后形狀就會(huì)固定,達(dá)不到想要彎曲變形的目的。要想在Unity中對(duì)模型實(shí)時(shí)操作變形,就需要通過算法來(lái)實(shí)現(xiàn)。
Unity中的網(wǎng)格信息是通過 GameObject的 Mesh-Filter組件中的mesh屬性來(lái)獲取。所以想要進(jìn)行網(wǎng)格操作,必須為游戲?qū)ο筇砑右粋€(gè)MeshFiler游戲組件,而MeshFiler中的mesh屬性中包含了三維游戲模型的法線、UV坐標(biāo)、三角形和vertices頂點(diǎn)數(shù)組屬性。三角形屬性并不是單獨(dú)保存,而是通過頂點(diǎn)數(shù)組間接保存。數(shù)組不使用特殊類表示三角形,而只是一個(gè)簡(jiǎn)單的整數(shù)指數(shù)列表。每一個(gè)三角形都是以三個(gè)點(diǎn)為一組,因此,前三個(gè)元素定義為第一個(gè)三角形,之后的三個(gè)元素定義為第二個(gè)三角形,并依此類推。
圖3 三維網(wǎng)格
要對(duì)三維物體進(jìn)行變形,只需要獲得這組頂點(diǎn)數(shù)組,將每一個(gè)頂點(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)建一條貝塞爾曲線。在三維物體的兩端加入兩個(gè)子物體,對(duì)應(yīng)好位置,通過引擎提供的In-verseTransformPoint()函數(shù)將兩個(gè)子物體的坐標(biāo)點(diǎn)轉(zhuǎn)化為三維物體的本地坐標(biāo)點(diǎn),并將此兩點(diǎn)作為三階貝塞爾曲線的兩個(gè)端點(diǎn)。再在此兩點(diǎn)中間任取兩點(diǎn),將其作為貝塞爾曲線的錨點(diǎn)。有了這四個(gè)頂點(diǎn),就可以根據(jù)三階貝塞爾曲線公式計(jì)算出一條適用于這個(gè)三維物體的一條曲線。
(3)將獲取到的mesh屬性的vertices數(shù)組取出,根據(jù)自己的物體要彎曲的軸向,選擇相應(yīng)的X、Y、Z軸,并找出相應(yīng)軸的最大值和最小值,相減獲得物體的總長(zhǎng),再將每個(gè)點(diǎn)對(duì)應(yīng)的值和最小值相減并除以總長(zhǎng),得到每一個(gè)網(wǎng)格頂點(diǎn)在物體中的百分比。
(4)將百分比值傳給貝塞爾曲線,計(jì)算出貝塞爾曲線對(duì)應(yīng)的百分比所在點(diǎn),并計(jì)算出此百分比對(duì)應(yīng)的前一個(gè)點(diǎn)和后一個(gè)點(diǎn)。
(5)通過叉乘,計(jì)算出這個(gè)百分比所在的貝塞爾曲線上的切線方向和垂直方向的偏移量。
(6)將此切線偏移量和垂直偏移量和三維物體的vertices屬性中對(duì)應(yīng)百分比的點(diǎn)相加,得到新的網(wǎng)格頂點(diǎn)。
(7)重復(fù)上述(3)到(6)的操作步驟,計(jì)算出每一個(gè)網(wǎng)格頂點(diǎn)的值。如此得到一個(gè)新的網(wǎng)格頂點(diǎn)數(shù)組,將此數(shù)組賦給vertices得到新的vertices頂點(diǎn)屬性,就改變了三維物體網(wǎng)格頂點(diǎn)的位置,從而使物體發(fā)生彎曲(如下圖)。
圖4 三維物體彎曲
本文給出了利用貝塞爾曲線對(duì)三維物體進(jìn)行彎曲的實(shí)現(xiàn)算法,并且對(duì)Unity中的網(wǎng)格屬性進(jìn)行了簡(jiǎn)單的說(shuō)明,使大家對(duì)網(wǎng)格有簡(jiǎn)單的認(rèn)識(shí),在實(shí)現(xiàn)算法時(shí)有一定的幫助。但是在Unity中實(shí)現(xiàn)此算法,需要掌握一些Unity3D的API[4],使用這些API進(jìn)行計(jì)算,可以減少許多不必要的實(shí)現(xiàn)代碼,可以大大地簡(jiǎn)化此算法的實(shí)現(xiàn)。
此算法擴(kuò)大了貝塞爾曲線的應(yīng)用,不只是局限于應(yīng)用在二維平面中的線條,如今也可以應(yīng)用于三維的條形狀物體,具有一定的創(chuàng)新性。
[1]丁德紅,方逵,饒大鵬,敬松.三維植物花朵動(dòng)態(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ì)市場(chǎng),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-),男,四川簡(jiǎn)陽(yáng)人,本科,研究方向?yàn)閁nity開發(fā)
2016-01-26
2016-02-26
隨著虛擬現(xiàn)實(shí)的發(fā)展,在游戲引擎中對(duì)三維物體進(jìn)行彎曲效果的模擬越來(lái)越重要。在三維游戲引擎中,需要對(duì)一些三維的物體進(jìn)行彎曲,以達(dá)到游戲操作中實(shí)時(shí)模擬物體彎曲。貝塞爾曲線算法是一個(gè)在計(jì)算機(jī)圖形中常用的算法,被用于各類圖形制作軟件中,如Photoshop等軟件,但多限于二維線條的應(yīng)用,在三維物體上的應(yīng)用較少。通過貝塞爾曲線算法結(jié)合三維物體的網(wǎng)格頂點(diǎn),可以實(shí)現(xiàn)對(duì)條形三維物體進(jìn)行彎曲變化。
貝塞爾曲線;三維物體;網(wǎng)格頂點(diǎn);彎曲
2014年國(guó)家級(jí)大學(xué)生創(chuàng)新訓(xùn)練項(xiàng)目(No.201410623012)
黃襄念(1964-),男,四川人,教授,研究方向?yàn)閳D像/文字識(shí)別技術(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.