葉招娣 陳海祺 尹婭琳 余小希 鄭譽煌
(1.廣東第二師范學(xué)院物理與信息工程學(xué)院 廣東省廣州市 510303)
(2.廣東第二師范學(xué)院教務(wù)處 廣東省廣州市 510303)
隨著近年來虛擬現(xiàn)實技術(shù)的迅猛發(fā)展,特別是與現(xiàn)實世界產(chǎn)生了越來越多的結(jié)合技術(shù),它可以建立人工構(gòu)造的三維虛擬環(huán)境,用戶可以以自然地方式與虛擬環(huán)境中的物體進行交互作用、相互影響,幫助人類不斷增強認識世界和適應(yīng)世界的能力,尤其是當(dāng)今疫情時代,虛擬現(xiàn)實技術(shù)的開發(fā)和利用幫助人們解決了教育、金融、醫(yī)療等各方面的問題。此外,游戲產(chǎn)業(yè)作為娛樂產(chǎn)業(yè)中的一員,在全世界得到飛速發(fā)展,而玩家在游戲過程中,對于游戲的操控性和游戲的代入感的需求也在不斷地增加。其中,體感游戲是一種新穎的游戲類型,憑借它的可操控、可玩性和體驗感越來越受許多玩家的喜愛。不論是國內(nèi)還是國外,對于體感游戲的開發(fā)尚處于一個研究探索的階段,還沒有完整地開發(fā)技術(shù)。
基于上述研究背景,本文主要利用Unity3D 強大的游戲引擎和Leap Motion 體感控制的技術(shù),研究從科普的視角建立一個基礎(chǔ)修車過程游戲,利用3Dmax 三維建模軟件,建立一個自行車維修的場景,構(gòu)建自行車模型和工具模型并導(dǎo)入unity3D的游戲引擎中,在Leap Motion的手勢識別功能下,共同打造基于體感交互技術(shù)的三維車輛維修的基礎(chǔ)游戲,實現(xiàn)用戶手部虛擬抓取物體等人機交互功能,推動體感游戲在國內(nèi)的發(fā)展。
為了增進人們對車輛結(jié)構(gòu)的了解,本游戲系統(tǒng)設(shè)計了一個基于Leap Motion 的Unity3D 的三維車輛維修游戲,該游戲的整體設(shè)計共由四部分組成。第一個是游戲的UI 設(shè)計,在游戲中添加UI 設(shè)計增加趣味交互性, UI 界面和游戲的交互模式是整個游戲系統(tǒng)的基礎(chǔ),游戲中的菜單需要用到UI界面進行實現(xiàn)。
第二個是本游戲的三維模型模塊,本游戲利用Unity3D平臺搭建一個車輛維修虛擬場景,利用unity 的Hierarchy 組件調(diào)節(jié)燈光的明暗以適應(yīng)不同的玩家視角角度。我們使用3dmax 建構(gòu)游戲核心模型自行車,自行車三維模型由導(dǎo)向系統(tǒng)、驅(qū)動系統(tǒng)、制動系統(tǒng)所組成。導(dǎo)向系統(tǒng)包括車把、前軸、前輪等,主要用來保持平衡和改變行駛方向;而驅(qū)動系統(tǒng)包括腳蹬、鏈條、飛輪、后軸等,主要用來驅(qū)動前進;制動系統(tǒng)主要有車閘,方便操縱車閘減速、停駛。 在場景的另外一個位置上,我們還設(shè)計了維修自行車所需要使用的一些工具,例如扳手、鉗子、螺絲等等。
第三個模塊就是利用Leap Motion 控制器的手勢識別技術(shù)實現(xiàn)用戶抓取物體的交互功能,Leap Motion 的抓取交互功能主要是在實時捕獲的人手運動數(shù)據(jù)的基礎(chǔ)上,驅(qū)動虛擬手部的變換動作,并根據(jù)虛擬手的動作狀態(tài)與環(huán)境中待抓取對象的聯(lián)系,判斷是否滿足抓取條件,進而實現(xiàn)對現(xiàn)實抓取動作的數(shù)字化仿真。在游戲中通過手勢識別技術(shù)達到抓取、放置、放大等操作,擺脫傳統(tǒng)鼠標(biāo)和鍵盤的約束,運用肢體動作將現(xiàn)實和虛擬相結(jié)合,使得用戶更有代入感與更好的體驗感,真正實現(xiàn)unity3D 引擎與Leap Motion 控制器相結(jié)合的交互式游戲。在虛擬自行車游戲中無法使用單一手勢來進行識別交互,所以利用動態(tài)識別抓捕來實現(xiàn)操作,所以用戶在不同的操作中需用到不同的動作來進行交互。例如我們要完成抓取自行車輪胎的動作,首先將手部放置在Leap Motion 正上方距離大概30cm 至50cm,手掌向著Leap Motion 所在的一面上,確保每個手指都被識取到傳感器中,手勢輸出后屏幕內(nèi)就會出現(xiàn)一個虛擬手部,這個虛擬手部會隨著用戶手部的移動而移動,當(dāng)移動至輪胎處,輪胎會出現(xiàn)光圈狀態(tài),此刻做出手掌緊握即五指需保持彎曲的狀態(tài)即可抓取輪胎。另外放大車輛某個部分的動態(tài)動作是拳頭變手掌即五指保持伸直的狀態(tài),縮小即是五指合并即是五指伸直合并在一起的狀態(tài)。利用抓獲這些特定的動作來用于控制游戲。在能直接在車輛進行的交互動作外,還可以使用維修工具來進行操作,在墻面會有常見的維修器件,可通過Leap Motion 的交互模式來抓取并移動至車輛來達到拆裝的效果,在這里能實現(xiàn)的動作是用戶在Leap Motion 上首先用手抓取想要的零件,并將它移至到自行車可拆卸處即會自動拆分,等拆分完成后會有復(fù)原的按鍵,這就能使用戶在了解車輛組成的基礎(chǔ)上更有趣味性的學(xué)習(xí)。
第四個模塊是游戲的動畫設(shè)計,我們選用的是unity中的animation 組件,主要用于展示輪胎維修的過程。在windows—animator 打開動畫制作界面。首先鎖定游戲?qū)ο蟮囊苿又黧w(即輪胎),確認輪胎的移動軌跡、距離和時間后,進行animator 錄制,添加游戲?qū)ο蟪跏嘉恢米鳛榈谝粠?,然后選中輪胎,拖動其緩緩向既定位置移動,添加新的一幀,結(jié)束錄制,一個動畫就即可完成。
Unity3D 是一款國際領(lǐng)先的跨平臺的專業(yè)游戲引擎,Unity 平臺提供了一套完善的游戲軟件設(shè)計到開發(fā)的完整解決方案,可用于設(shè)計、創(chuàng)作、運營任何一款2D 或3D 游戲,而且還跨平臺支持各種平臺,包括iOS、Android、Windows、Mac 等各類硬件平臺,充分體現(xiàn)了Unity 強大功能,在使用過程中,它的跨平臺游戲開發(fā)的特性為開發(fā)者解決了大量移植過程中的不必要的麻煩,并且相較于其他游戲的開發(fā)平臺,Unity3D 的基于腳本的監(jiān)聽機制使得開發(fā)者僅僅需要編寫相應(yīng)的游戲腳本即可,由游戲腳本響應(yīng)unity 系統(tǒng)平臺上的各個模塊的組件,以此實現(xiàn)相應(yīng)的功能。作為一款商業(yè)游戲引擎,Unity 可支持更高級別的引擎功能,在游戲制作后期可以移植和打包,大大便利了開發(fā)者進行使用。
Leap Motion 是一款面向PC 以及Mac 平臺的體感控制器。Leap Motion 具有很好地軟硬件結(jié)合能力,Leap Motion控制器可追蹤全部10 只手指,精度高達 1/100 毫米。它遠比現(xiàn)有的運動跟蹤控制技術(shù)更為精確,同時,它可以實現(xiàn)用手指瀏覽網(wǎng)頁、閱讀、彈鋼琴或者其他小游戲,基于此功能,本游戲采用Unity3D 和Leap Motion 相結(jié)合的游戲操控方式,增加游戲過程中的體驗感和趣味性。
C#是微軟公司發(fā)布的一種由C 和C++衍生出來的面向?qū)ο蟮木幊陶Z言、運行于.NET Framework 和.NET Core(完全開源,跨平臺)之上的高級程序設(shè)計語言,它是一種安全的、穩(wěn)定的、簡單的、優(yōu)雅的面向?qū)ο缶幊陶Z言,它在繼承C 和C++強大功能的同時去掉了一些它們的復(fù)雜特性(例如沒有宏以及不允許多重繼承)。C#綜合了VB 簡單的可視化操作和C++的高運行效率,以其強大的操作能力、優(yōu)雅的語法風(fēng)格、創(chuàng)新的語言特性和便捷的面向組件編程的支持成為.NET 開發(fā)的首選語言。目前,大多數(shù)unity 開發(fā)游戲所使用的語言是C#,它比較普及并且所具有的參考資料較豐富。
要實現(xiàn)從Leap Motion 設(shè)備捕捉手部動作到Unity 中手模型的綁定,最后再實現(xiàn)與游戲中物品的交互,整個過程需要使用許多的Unity 數(shù)據(jù)包。首先,我們需要將Leap Motion 核心驅(qū)動導(dǎo)入Unity 平臺,并采用Leap Motion 的核心core 文件來實現(xiàn),本游戲使用的是核心組件的4.6 版本,如圖1 所示。
圖1: 核心組件
將Leap Motion 連接電腦之后,通過Leap Motion 的攝像頭以及自帶的內(nèi)部代碼,玩家的手在Leap Motion 的內(nèi)置監(jiān)視器中將被套上默認的球棍模型骨架如圖2 所示,這為開發(fā)者在unity 中代入模型提供了極大的便利。
圖2: 內(nèi)置攝像頭默認球棍模型
打開Unity 軟件,需要在平臺中創(chuàng)建一些組件(即Unity 平臺中的create empty 創(chuàng)建的一個GameObject)來配合Leap Motion 進行工作,本文以最簡單的抓握這一交互動作為例子,描述利用四個主要組件組成完成交互動作所需的流程,四個組件分別為Leap Motion 支持組件、手模型管理組件、交互管理組件、物品交互組件。
本游戲的抓取交互主要有四個步驟,也就是布置四個組件:Leap service provider 組件負責(zé)連接Leap Motion 硬件與Unity 平臺;Hand model manager 給Unity 導(dǎo)入綁定好手部模型;Interaction manager 負責(zé)給交互的主體以及受體賦予交互方式以及主體的接觸點;最后是給交互物體設(shè)置好碰撞體以及物理邏輯。完成這樣一套流程之后,基本的抓取交互就完成了,下面本文將詳細介紹這一過程。
要完成在游戲中實時捕捉玩家的手部動作,需要在unity 中加入的第一個組件是Leap Motion 的服務(wù)支持組件,該組件是由腳本leap service provider 構(gòu)成,如圖3 所示。
圖3: leap service provider 組件界面
它能夠?qū)eap Motion 攝像頭實時捕捉的動作輸入到unity 平臺之中,同時該組件中的腳本編寫中還具有改變Leap Motion 攝像頭監(jiān)視模式的功能edit time pose(監(jiān)視模式包括桌面模式desktop mode 以及頭盔式Head mounted),根據(jù)Leap Motion 的放置方式可以選擇不同的監(jiān)視模式。該組件同樣包括交互體可視化Interaction volume visualization選項,可以適配Leap Motion 公司其他產(chǎn)品,剩余是有關(guān)交互時物理方面的反饋和表現(xiàn)等選項。
在將leap service provide 導(dǎo)入后,需要我們建立的Unity組件是手模型管理組件,將Leap Motion 內(nèi)置攝像頭捕捉的手部圖像轉(zhuǎn)換為Unity 內(nèi)對虛擬手模型的控制。這一組件是由腳本hand model manager 構(gòu)成,如圖4 所示,該組件的主要功能是將與之前設(shè)置的leap service provide 綁定起來,把攝像頭捕捉的圖像導(dǎo)入進來;其次是創(chuàng)建一個model pool(模型池)用來放置虛擬手模型,同時可以設(shè)置手模型的有關(guān)參數(shù)。
圖4: hand model manager 組件界面
在該組件中的模型池里放置了一雙手模型后,該組件擁有兩個子組件rigged hand,分為左手和右手。由圖4 和圖5也可以看出兩者均是由腳本rigged hand 構(gòu)成的組件,該組件的主要功能有:分別設(shè)定單獨手模型的左右;設(shè)定手模型的大小,該功能用于協(xié)調(diào)好手模型與其他模型的比例關(guān)系;設(shè)置一個列表用于放置手指模型,可以把五個手指的模型綁定好;設(shè)定手掌坐標(biāo),用于確定整個手的位置;設(shè)定前臂、腕關(guān)節(jié)、肘關(guān)節(jié)的位置,該功能在運用更加詳盡的手部模型的時候能夠增加控制坐標(biāo),調(diào)整位置,增加真實感;最后一個功能是設(shè)定手模型的初始待機動作。
圖5: rigged hand(左手)組件界面
簡單版本的手模型僅有手掌和五個手指(thumb 拇指、index 食指、middle 中指、ring 無名指、pinky 小指),其中手指部分又被分為三個更小的單元(A、B、C),如圖6 所示的L_Finger_Thumb_A 是大拇指,就被分為了三個GameObject,分別對應(yīng)了手指指尖部分,手指中間部分以及手指末端關(guān)節(jié)凸起處;這樣可以靈活調(diào)單獨每根手指的長度,協(xié)調(diào)手部比例,看起來更加真實自然。
圖6: 完整的簡單版本手模型目錄
在完成了以leap service provide 為腳本的Leap Motion支持組件和以hand model manager 為腳本的手模型管理組件之后,最后需要創(chuàng)建的就是交互管理組件,如圖7 和圖8 所示,該組件的腳本為Interaction Manager。組件的主要功能是:設(shè)定需要進行交互的對象,即虛擬手模型;設(shè)定交互設(shè)置,包括懸停觸發(fā)半徑以及觸碰觸發(fā)半徑;交互層級設(shè)置。
圖7: Interaction Manager 組件界面
圖8: Interaction hand(左手)組件界面
所謂的懸停(hover)是指當(dāng)虛擬手模型接近交互物品時的反饋,通過懸停我們可以判斷手距離交互物品的距離,官方組件中給出的反饋方式是給交互物品上色,通過設(shè)置可以使物品從原本的淺色變?yōu)樯钌值木嚯x越近則顏色越深,反過來設(shè)置也同樣可以實現(xiàn)。所以說,懸停觸發(fā)半徑就是指虛擬手模型以及交互物品之間的反饋半徑。觸碰觸發(fā)半徑則是虛擬手模型和交互物品發(fā)生碰撞,抓取等物理動作的發(fā)生半徑。
與手模型管理組件類似,該組件下有兩個子組件:Interaction Hand。該組件的功能是要綁定好Leap Motion 攝像頭(leap service provider),同時也將交互主體綁定為之前導(dǎo)入的虛擬手模型;設(shè)定手的交互模式,包括懸停、接觸和抓取三種;分別設(shè)定單獨手模型的左右;設(shè)定主懸停的指尖,可以理解為之前提到的懸停觸發(fā)半徑計算的出發(fā)點。
在設(shè)置完虛擬手模型以及交互管理之后,下一步需要對要交互的物體進行設(shè)置。這里可以使用Unity 平臺中自帶的腳本rigid body 對物品設(shè)置物理規(guī)則(界面如圖9 所示),讓物品能夠像現(xiàn)實生活中一樣遵循常識的運動和互動。組件的主要功能是:設(shè)置該物品的質(zhì)量;設(shè)定拖動時會產(chǎn)生的各種阻力,角阻力系數(shù);設(shè)定是否應(yīng)用重力,是否符合運動學(xué)邏輯;設(shè)定插入,沖突檢測,最終也可以讓物品凍結(jié)在某一地點。
圖9: rigid body 組件界面
首先對游戲中的輪胎進行交互設(shè)置,rigid body 組件賦予了輪胎重力,以及和物體接觸時的力,我們需要給輪胎設(shè)計一個碰撞體積,在unity 中自帶了許多碰撞體構(gòu)建組件包括box(方盒形),capsule(膠囊型),sphere(橢球型),mesh(網(wǎng)格)。
由于輪胎屬于不太規(guī)則的幾何體,這里采用的是mesh collider,在輪胎的外部構(gòu)建一層網(wǎng)格覆蓋,這樣可以最大限度的確保輪胎的碰撞體積接近現(xiàn)實,具體效果如圖10 所示。
圖10: 碰撞體類型及輪胎的網(wǎng)格碰撞效果圖
這樣,虛擬手就可以與輪胎進行最簡單的交互了,包括用手推動輪胎,雙指捏合拿取輪胎等等。
本游戲demo 中第二交互物品是工具,原理和輪胎的交互過程是相似的。同樣的,在之前的三個組件搭建完成以后,可以通過給工具加入rigid body 以及碰撞體使得工具符合真實的物理規(guī)則進行手與物體的交互或是物體與物體的交互,如圖11 所示。
圖11: 部分工具的網(wǎng)格碰撞效果圖
打開游戲,選擇進入游戲,可以看見游戲主場景,在空曠的修車房中央,擺放著一輛破舊的自行車,這輛自行車,就是我們游戲的主要游戲?qū)ο?,在場景后方擺放著修理車輛所需要的相關(guān)工具。
將Leap Motion 連接至設(shè)備,在場景中會出現(xiàn)手部模型,如圖12 所示。我們可以通過將手放在Leap Motion 攝像頭前面的動作變化來控制場景內(nèi)手部建模的同步變化。同時,我們也可以通過手指捏合、張開等方式來做到游戲場景內(nèi)物體的拿取或者放下。
圖12: Leap Motion 接入設(shè)備
以修理自行車輪胎為例,將Leap Motion 接入主機,移動手以控制游戲畫面中的手部建模移動至自行車破損的前輪胎處,雙指捏合,拆下破損的輪胎,如圖13 所示。
圖13: 卸下破損輪胎
等破損輪胎被拆下后,重新控制建模移動到后面的新輪胎處,通過雙指捏合,將新輪胎安裝在車上。具體效果請看圖14、15 和圖16。
圖14: 場景內(nèi)新輪胎的放置
圖15: 安裝新輪胎
圖16: 總效果圖
隨著科技的不斷發(fā)展,虛擬現(xiàn)實技術(shù)在近幾年的發(fā)展中愈發(fā)迅速,手勢識別技術(shù)作為人機交互的方向尤為重要。本文以基于Leap Motion 的Unity3D 的三維車輛維修游戲為例,詳細地介紹了游戲的整體設(shè)計模塊,以及如何利用Leap Motion 實現(xiàn)抓取物體時的交互功能,還利用Unity3D 中的animation 組件實現(xiàn)物體交互的動畫過程,極大的提高了用戶在游戲過程中的可玩性和操控性。