李澔民 陸向艷
摘? 要: 為實現在Unity引擎中使用任意階貝塞爾曲線繪制三維物體的軌跡,本文提出了一種靈活繪制N階貝塞爾曲線的方法。該方法設計了一種可以降階的插值計算函數來實現自定義控制點數的N階貝塞爾曲線。對比實驗結果表明該方法有效且簡化了三維物體的運動軌跡的參數定義,為應用貝塞爾曲線來控制三維物體的運動軌跡提供了方法參考。
關鍵詞: Unity;N階貝塞爾曲線;三維物體;運動軌跡
中圖分類號: TP391.7? ? 文獻標識碼: A? ? DOI:10.3969/j.issn.1003-6970.2020.09.001
本文著錄格式:李澔民,陸向艷. 基于Unity的N階貝塞爾曲線繪制三維物體運動軌跡[J]. 軟件,2020,41(09):0104
【Abstract】: In order to use the Bessel curve of arbitrary order in the Unity engine to draw the trajectory of 3d objects, this paper presents,? a flexible method for drawing N-order Bessel curve. This method designs an interpolation calculation function which can reduce the order of Bessel curve and support the custom amounts selection of control point of N-order Bessel curve. The comparative experimental results show that this method is effective and simplifies the parameter definition of motion trajectory of 3d objects. This paper provides a method for controlling the motion trajectory of 3d objects with Bessel curve.
【Key words】: Unity; N-order Bessel curve; Three-dimensional objects; Motion trajectory
0? 引言
Unity3D引擎是大多數虛擬現實項目選擇的開發(fā)工具[1],應用Unity實現物體運動軌跡繪制,會受到諸多的外界干擾因素。為避免干擾,可以在Unity中使用貝塞爾曲線提前計算出路徑,再使用適當的運動方法沿路徑進行移動,使得到的路徑固定且運動軌跡穩(wěn)定。已有相當多的研究將貝塞爾曲線應用于Unity3D引擎,例如用來對三維物體進行彎曲[2],控制足球射門運動曲線等。貝塞爾曲線也在很多二維繪圖軟件(如微軟繪圖軟件、PhotoShop等)中得到應用。使用物理公式的方法繪制物體運動軌跡往往參數較多,后期調整軌跡需要繁雜的計算和驗證,而貝塞爾曲線則只需調節(jié)中間控制點就可以快速調整整條軌跡路線。然而,將貝塞爾曲線應用于Unity3D環(huán)境需要進行算法設計和編程才能使其應用于三維坐標,最終實現對三維物體運動的控制。為此,本文提出一種繪制N階貝塞爾曲線的方法,該方法可以自定義控制點的數量,繪制出復雜的物體運動軌跡。
1? 貝塞爾曲線
貝塞爾曲線,也稱為貝茲曲線或貝濟埃曲線,是在制作二維圖形的應用程序中廣泛應用的數學曲線。1962年,貝塞爾曲線由法國工程師Pierre Bezier對伯恩斯坦多項式進行擴展用于汽車工業(yè)輔助設計而產生,之后推廣而得到廣泛應用。貝塞爾曲線的優(yōu)點是繪制曲線簡便易行,只需要定義曲線的起始點、終止點以及兩個相互分離的中間點(控制點)即可完成。用貝塞爾曲線繪制復雜曲線可以先分段定義多段曲線,然后再將這些曲線段連接起來形成所需要的曲? 線或曲面圖形[3]。貝塞爾曲線的簡單性特點,使很多? 圖形工作者選擇用它來繪制形狀較為復雜的圖形或模型[4-15]。貝塞爾曲線的數學表達如下:
2? 方法描述
在實際應用中,繪制三維物體平滑運動軌跡,主要是應用貝塞爾曲線2階公式或貝塞爾曲線3階公式。本文的問題是擬在Unity3D環(huán)境下,用GetBezierList函數實現應用貝塞爾曲線繪制三維物體平滑運動軌跡。解決問題的核心思想是應用GetBezierList函數來繪制任意中間控制點(N取2或3均可)的三維貝塞爾曲線軌跡。解決方法是首先分析二階和三階貝塞爾的插值點關系,導出GetBezierList函數實現貝塞爾曲線的N階公式的插值的計算函數;然后設計Unity中的實現貝塞爾曲線N階公式插值的計算函數代碼;最后用剛體Rigidbody組件和本文設計的貝塞爾曲線N階公式法進行物體運動軌跡實現的效果和參數復雜度對比。
3? 方法設計與實現
3.1? 函數設計
本文通過GetBezierList函數獲得貝塞爾曲線的線段點列表,其參數為:GetBezierList(List
式(25)中,j代表{Pi}控制點集降了多少次維,由于每降一次維,控制點數量就減少一個,故i的取值范圍是(0,n–j)。當降了n次維以后,最后得到B(t)點的位置。
3.2? 方法實現
///
/// 獲取N階貝塞爾曲線
///
/// 包括起點和終點在內的所有控制點
/// 描述貝塞爾曲線的點數量
///
public static List
{
List
for (int i = 1; i <= num; i++)
{
float t = i / num;
Vector3 pixel = GetBeizerPoint(PiList, t);
beizerPath.Add(pixel);
}
return beizerPath;
}
//根據PiList各點插值遞歸得到貝塞爾曲線B(t)值
public static Vector3 GetBeizerPoint( List
{
if (PiList.Count <= 1)
return PiList[0];
List
for (int i = 0; i < PiList.Count - 1; i++)
{
Vector3 pp = (1 - t) * PiList[i] + t * PiList[i + 1];
newPiList.Add(pp);
}
return GetBeizerPoint(newPiList, t);
}
4? 實驗與對比分析
繪制運動軌跡我們使用unity的LineRenderer組件,LineRenderer線渲染器組件主要是用于在3D中渲染線段,使用LineRenderer我們可以對繪制線段進行很多操作,例如設置顏色、寬度等。本文中我們在一款乒乓球游戲中利用生成N階貝塞爾曲線的方法繪制乒乓球運球的一條預判軌跡,來展示本文提出的方法是如何在實際項目中應用的。
LineRenderer組件可以定義一段由多個采集點構成的曲線,然后在相鄰兩個采集點之間渲染出一條直線,只要繪制的時候生成的采集點足夠多就能繪制出相對來說更平滑的曲線。所以我們將GetBezierList方法生成出來的描述曲線的點坐標組代入LineRenderer組件中去。
4.1? 使用Rigidbody控制物體運動實驗
控制unity3D里面物體的物理運動一般使用剛體Rigidbody組件來控制,賦有剛體屬性的對象可以施加力,并且可以設置物體的質量,初速度等物理運動初始屬性。我們控制一個乒乓球在乒乓球桌上進行一次運球運動,并設置乒乓球的兩段運動屬性如表1所示。第一段運動為乒乓球從被擊出后到接觸到乒乓球桌上的運動,第二段運動為乒乓球從桌上彈起后到落地的運動,設置好上表1中的屬性后繪制出的運動軌跡如圖3所示。
4.2? 使用貝塞爾曲線控制物體運動實驗
由于乒乓球在運球的過程中會與桌面發(fā)生一次碰撞交互形成第二段運動,所以需要繪制兩條貝塞爾曲線來描述乒乓球的整個運球路線,第二條貝塞爾曲線的起點即為第一條曲線的終點,調節(jié)控制點的屬性屬性如表2所示。
在圖3的基礎上生成貝塞爾曲線,其曲線用紅色線條繪制,可以對比使用剛體形成的運動軌跡曲線,如圖4所示。
4.3? 實驗結果分析
(1)通過圖4的對比可以看到使用貝塞爾曲線生成的運動軌跡和使用剛體的物理學控制形成的運動軌跡幾乎重合,可以看出貝塞爾曲線已經可以繪制三維物體,模擬真實的物理運動。
(2)從表1和表2的對比來看,使用剛體中的物理屬性控制物體運動時,需要同時考慮到重力加速度、物體質量、物體初速度、物體初速度向量等比較多的系數,這樣使得后期調整物體運動軌跡的時候調試步驟繁雜,調試成本高。而使用貝塞爾曲線控制物體的運動軌跡時,只需要考慮控制對應線段的控制點,即可方便快捷的修改運動曲線,后期維護成本較低。
(3)對于物體做一些比較特殊的運動,或者是不受重力和其他物理因素影響的運動這些情況,使用貝塞爾曲線來生成和配置物體的運動路徑相當簡單高效。
5? 結束語
使用物理公式的方法繪制物體運動軌跡往往參數較多,后期想要調整軌跡需要繁雜的計算和驗證,而使用貝塞爾曲線則只需調節(jié)少量的中間控制點就可以快速調整條軌跡路線。在Unity中使用貝塞爾曲線可以提前計算出路徑,進而使用適當的運動方法沿路徑進行移動,繪制的路徑固定且運動軌跡穩(wěn)定。本文提出一種基于Unity的靈活繪制N階貝塞爾曲線的方法來控制三維物體的運動軌跡。該方法設計了一種可以降階的插值計算函數來實現自定義控制點數的N階貝塞爾曲線。對比實驗結果表明該方法有效且簡化了三維物體的運動軌跡的參數定義,為應用貝塞爾曲線來控制三維物體的運動軌跡提供了方法參考。
參考文獻
[1]唐實, 任淑霞, 王佳欣, 等. 基于虛擬VR技術的心臟醫(yī)療輔助系統(tǒng)的設計與應用[J]. 軟件, 2018, 39(6): 23-25.
[2]吳曉亮, 黃襄念. Unity中使用貝塞爾曲線對三維物體進行彎曲[J]. 現代計算機(專業(yè)版), 2016(07): 57-59.
[3]胡學峰, 朱家明, 劉雅倩等. 基于貝賽爾曲線位圖矢量化方法的研究[J]. 西昌學院學報(自然科學版), 2015, 29(02): 72-75.
[4]張祖媛. 貝塞爾曲線的幾何構型[J]. 四川工業(yè)學院學報, 1998(04): 33-36+45.
[5]張少林, 景奉水, 王碩. 基于球面貝塞爾的姿態(tài)過渡與插補方法[J]. 華中科技大學學報(自然科學版), 2017, 45(10): 75-79.
[6]張金煒, 王文揚, 郭蓬等. 基于蟻群四次貝塞爾曲線的無人車路徑規(guī)劃[J]. 現代電子技術, 2019, 42(13): 113-116.
[7]牛巖軍, 王進杰, 曹國華等. 基于高階貝塞爾曲線的提升機鋼絲繩層間過渡平穩(wěn)性研究[J]. 礦山械, 2015, 43(12): 53-58.
[8]張文靜, 加云崗, 王偉. 基于Bezier曲線的移動模型研究[J]. 計算機應用研究, 2015, 32(06): 1830-1834.
[9]韓浩, 王舜燕. 基于混合貝塞爾曲線模型的車道檢測算法[J]. 計算機工程與計, 2018, 39(03): 732-737.
[10]張志毅, 楊溪. A級貝塞爾曲線的交互式控制生成方法[J]. 計算機應用與件, 2014, 31(02): 103-105+194.
[11]徐梁, 高宏力, 宋興國. 貝塞爾曲線融合ACO的移動機器人路徑規(guī)劃[J]. 機械設計與造, 2020(01): 263-266.
[12]劉成志, 李軍成, 楊煉. 基于三次Bézier 曲線逼近的邊緣亞像素定位方法[J]. 軟件, 2015, 36(7): 31-35.
[13]何洪亮, 趙珂, 王子群, 等. 基于層次分析與多元曲線擬合法的眾包任務定價模型研究[J]. 軟件, 2018, 39(10): 139-144.
[14]譚振, 李軍成. 一種平面正則 C-Bézier 曲線的廣義偏距曲線構造方法[J]. 軟件, 2018, 39(11): 07-10.
[15]盧超, 黃蔚, 胡國超. 基于圖形數據結構的復雜對象建模設計[J]. 軟件, 2015, 36(12): 220-223.