摘 要:文章介紹了Kinect結(jié)合Unity的交互方法,以及利用手勢(shì)移動(dòng)場(chǎng)景、控制人物動(dòng)作以及控制模型的開(kāi)發(fā)實(shí)例,為Kinect與Unity的程序開(kāi)發(fā)提供一個(gè)參考。
關(guān)鍵詞:Kinect;Unity;手勢(shì)識(shí)別
中圖分類(lèi)號(hào):TP391.41
Kinect是一種功能強(qiáng)大的3D體感攝像機(jī),是微軟公司于2009年公布的XBOX360的體感周邊外設(shè),它導(dǎo)入了即時(shí)動(dòng)態(tài)捕捉、影像辨識(shí)、麥克風(fēng)輸入、語(yǔ)音辨識(shí)、社群互動(dòng)等功能,給人耳目一新的感覺(jué)。玩家可以通過(guò)手勢(shì)或語(yǔ)言指令來(lái)操作Xbox 360的系統(tǒng)界面,也能通過(guò)全身上下的動(dòng)作,用身體來(lái)玩游戲,而不是傳統(tǒng)的手持或腳踏控制器。它的出現(xiàn),開(kāi)創(chuàng)了互動(dòng)娛樂(lè)的新紀(jì)元,帶給玩家“免控制器的游戲與娛樂(lè)體驗(yàn)”。
圖1 Kinect實(shí)物圖
Kinect一共有三個(gè)鏡頭:RGB彩色攝影機(jī),紅外線發(fā)射器和紅外線 CMOS 攝影機(jī)所構(gòu)成的3D結(jié)構(gòu)光深度感應(yīng)器,同時(shí)還具備有追焦功能。Kinect還內(nèi)建了陣列式麥克風(fēng),可以在嘈雜的環(huán)境下,由多組麥克風(fēng)同時(shí)收音,通過(guò)比對(duì)消除雜音。它可以同時(shí)獲取彩色影像、3D深度影像、以及聲音訊號(hào)。
目前,Kinect已不僅局限于游戲控制當(dāng)中,而在機(jī)器人視覺(jué)與控制,醫(yī)療領(lǐng)域,計(jì)算機(jī)應(yīng)用,電子商務(wù)領(lǐng)域及教育領(lǐng)域都有其應(yīng)用。例如,Kinect試衣鏡,運(yùn)動(dòng)捕捉,3D建模,機(jī)械控制,虛擬樂(lè)器,外科手術(shù)應(yīng)用等。同時(shí),Kinect應(yīng)用技術(shù)的開(kāi)發(fā)還只是初步的發(fā)展,但它已表現(xiàn)出廣闊的發(fā)展空間和強(qiáng)大的生命力。
1 Kinect相關(guān)應(yīng)用
Kinect主要是以識(shí)別功能為主,它既可以識(shí)別人體骨架,又同時(shí)具備語(yǔ)音識(shí)別功能。正是由于其具有成本低、重量輕、精度高以及功能強(qiáng)等優(yōu)點(diǎn),當(dāng)今社會(huì)人們更多的將其與虛擬現(xiàn)實(shí)技術(shù)或是增強(qiáng)現(xiàn)實(shí)技術(shù)結(jié)合在一起,從而使其可以在軍事、醫(yī)療、娛樂(lè)以及教育等各個(gè)領(lǐng)域中充分的發(fā)揮作用。
Kinect在娛樂(lè)領(lǐng)域的應(yīng)用最為廣泛,微軟在Xbox上推出的Kinect Sports,Kinect Adventures,Kinect Joy Ride等,以及結(jié)合Kinect的水果忍者,超級(jí)瑪麗等。Kinect不僅增加了游戲者在游戲過(guò)程中的帶入感,同時(shí)也可以鍛煉身體。
魏尚基于kinect深度攝像頭對(duì)三維人臉識(shí)別技術(shù)進(jìn)行了研究。他認(rèn)為二維圖像人臉識(shí)別技術(shù)由于受到各種條件的限制,無(wú)法滿足當(dāng)前人們的需求。因此三維人臉識(shí)別技術(shù)具有非常大的發(fā)展空間。通過(guò)使用價(jià)格低廉的kinect并使用和主成分分析方法可以起到降低成本且提高質(zhì)量的效果。
Kinect的識(shí)別技術(shù)也可以被應(yīng)用于機(jī)器人身上。用kinect作為機(jī)器人的頭部,從而降低機(jī)器人的制作成本同時(shí)提高其識(shí)別精度。甚至在不久的將來(lái),該項(xiàng)技術(shù)也可以被廣泛應(yīng)用于無(wú)人駕駛領(lǐng)域。
況鷹研究了三維虛擬試衣,實(shí)現(xiàn)了讓消費(fèi)者不需試衣就能見(jiàn)到真實(shí)的試衣效果,消費(fèi)者甚至可以通過(guò)手勢(shì)選擇不同的衣服試穿。該項(xiàng)虛擬技術(shù)也可以被應(yīng)用于視頻會(huì)議。
Kinect在醫(yī)學(xué)方面實(shí)現(xiàn)了代替醫(yī)生做尸檢的工作,例如瑞士Bern大學(xué)的Virtopsy項(xiàng)目。該項(xiàng)目通過(guò)開(kāi)發(fā)ofxKinect系統(tǒng),制作體感軟件。從而使尸檢工作更加衛(wèi)生、省時(shí)。而華盛頓大學(xué)的學(xué)生們通過(guò)對(duì)Kinect的改造,實(shí)現(xiàn)了醫(yī)生遠(yuǎn)程遙控手術(shù)技術(shù)。但是為了精確治療,避免醫(yī)療事故的發(fā)生,該項(xiàng)技術(shù)仍在改進(jìn)。而目前為止應(yīng)用較為廣泛的則是通過(guò)Kinect體感控制查看患者的影像資料,這樣可以降低手術(shù)室的人員流動(dòng),提高工作的準(zhǔn)確性和效率。
王康將Kinect與電子白板結(jié)合使用,研究出了體感交互式電子白板,極大的提高了教學(xué)質(zhì)量和效率。錢(qián)鶴慶將Kinect與教學(xué)輔助工具相結(jié)合,通過(guò)真實(shí)的演示如化學(xué)分子結(jié)構(gòu)等,提高學(xué)生的學(xué)習(xí)興趣。而目前已經(jīng)投入使用的Kinect技術(shù)則是將其與投影儀相結(jié)合,實(shí)現(xiàn)用手勢(shì)或語(yǔ)音控制投影內(nèi)容。
目前,Kinect技術(shù)本身仍有待改進(jìn),而基于其的應(yīng)用更只是冰山一角。盡管如此,Kinect也已經(jīng)向我們展示出了其廣泛的應(yīng)用范圍。隨著人們需求的不斷改變以及Kinect技術(shù)的不斷完善,Kinect在各個(gè)領(lǐng)域的應(yīng)用都會(huì)向前邁出一大步,并且在人機(jī)交互領(lǐng)域?qū)?huì)得到更為廣泛的應(yīng)用。
2 Kinect在Unity平臺(tái)上的開(kāi)發(fā)實(shí)例
2.1 Unity
Unity是一個(gè)多平臺(tái)綜合型的游戲開(kāi)發(fā)工具,可用于創(chuàng)建三維視頻游戲、建筑可視化、實(shí)時(shí)三維動(dòng)畫(huà)等,是一個(gè)全面整合的專(zhuān)業(yè)游戲引擎。編輯器可以運(yùn)行在Windows或Mac OS X環(huán)境下,并且可以將游戲發(fā)布至Windows、Mac、Wii、iPhone、Windows Phone 8和Android等平臺(tái),也可以通過(guò)Unity Web Player插件來(lái)發(fā)布網(wǎng)頁(yè)游戲。
Unity的腳本可由C#或JavaScript語(yǔ)言編寫(xiě)。
目前,Kinect結(jié)合Unity的相關(guān)技術(shù)已經(jīng)取得了一些初步成果,例如卡耐基梅隆的KinectWrapper,以及OpenNI提供的OpenNIUinityToolkit等一些Kinect與Unity交互的中間件,以及發(fā)布在AssetStore上的應(yīng)用Kinected,Kinect Hand Game Starter Kit等。
2.2 Kinect結(jié)合Unity角色控制器
Unity中的Character Controller角色控制器包括第一人稱(chēng)控制器(First Person Controller)和第三人稱(chēng)控制器(3rd Person Controller)。角色控制器主要用于第三人稱(chēng)或第一人稱(chēng)的游戲主角控制,Kinect結(jié)合Unity角色控制器的目的是讓用戶(hù)能通過(guò)簡(jiǎn)單的手勢(shì)及動(dòng)作來(lái)控制人物角色,代替鍵盤(pán),鼠標(biāo)等設(shè)備。
在Unity的角色控制器中,與用戶(hù)的交互主要使用GetAxisRaw方法,它獲取水平軸和垂直軸以控制角色前進(jìn),后退以及左轉(zhuǎn)和右轉(zhuǎn)的動(dòng)作,對(duì)于鍵盤(pán)和控制器它的取值范圍在-1到1之間。當(dāng)輸入不平滑,鍵盤(pán)輸入必是-1,0或1。通過(guò)獲取空格按鈕,跳使用GetButton方法。本實(shí)例的主要思想是根據(jù)Kinect獲取到的骨骼數(shù)據(jù)以及手勢(shì)和動(dòng)作的設(shè)計(jì),編寫(xiě)腳本代替這兩個(gè)方法實(shí)現(xiàn)對(duì)人物的控制和場(chǎng)景轉(zhuǎn)換。使用的素材有Andrew DeVine的KinectSDK / Unity3D Interface中間件,Geartech Games的Demo Industrial Arena環(huán)境場(chǎng)景,以及Unity的Character Controller角色控制器。以第三人稱(chēng)控制器為例,步驟如下:
首先,打開(kāi)Demo Industrial Arena的場(chǎng)景Scene,導(dǎo)入Character Controller,在Scene中加入人物(3rd Person Controller的Prefab預(yù)制件),并對(duì)人物添加ThirdPersonCamera(攝像頭)和ThirdPersonController(角色控制)這兩個(gè)腳本,并在Inspector中設(shè)置相應(yīng)的動(dòng)作及數(shù)值。
對(duì)人物添加KUInterface腳本,并在腳本中定義flaot型變量v(Vertical)和h(Horizontal),及bool型變量j(Jump),分別代表前進(jìn)后退以及左轉(zhuǎn)右轉(zhuǎn)和跳躍。
public float h=0.0f;
public float v=0.0f;
public bool j=1;
定義需要的骨骼以及參數(shù)。
private bool LastFrameHandRightUp=1;
private Vector3 HandRight=new Vector3(0,0,0);
private Vector3 ShoulderRight=new Vector3(0,0,0);
private Vector3 Head=new Vector3(0,0,0);
在Unity中,每一幀都會(huì)執(zhí)行一次Update函數(shù)中的內(nèi)容,當(dāng)Update函數(shù)第一次被執(zhí)行前會(huì)執(zhí)行Start函數(shù)。因此,在Actions函數(shù)中編寫(xiě)相應(yīng)的動(dòng)作,并且在Upate中調(diào)用Actions中的內(nèi)容。
在Actions中,對(duì)h,v,j數(shù)值初始化,即分別將h,v賦值為0,j為1。
v=0.0f;
h=0.0f;
j=1;
通過(guò)GetJointPos方法來(lái)獲取Head,HandRight及ShoulderRight這三個(gè)骨骼位置。
HandRight=GetJointPos(KinectWrapper.Joints.HAND_RIGHT);
ShoulderRight=GetJointPos(KinectWrapper.Joints.SHOULDER_RIGHT);
Head=GetJointPos(KinectWrapper.Joints.HEAD);
定義了4個(gè)動(dòng)作,分別是前進(jìn),左轉(zhuǎn),右轉(zhuǎn),跳躍,需要用到頭部,右手,右肩這三個(gè)骨骼數(shù)據(jù)。將右手伸出并與肩部保持相應(yīng)的高度,人物前進(jìn),同時(shí)賦值v為1;在前進(jìn)狀態(tài)下,若將右手向左揮動(dòng),人物向左轉(zhuǎn),同時(shí)賦值h為-1;若將右手向右揮動(dòng),則人物向右轉(zhuǎn),同時(shí)賦值h為1;若右手向上揮動(dòng),人物跳躍,賦值j為true。
if(HandRight.y-ShoulderRight.y>-10){
v=1.0f;
if(HandRight.x-ShoulderRight.x > 200)
h=1.0f;
if(HandRight.x-ShoulderRight.x < -200)
h=-1.0f;
if(HandRight.y-Head.y > 150){
if (!LastFrameHandRightUp)
j=true;
LastFrameHandRightUp = true;}}
最后,在ThirdPersonController腳本中,通過(guò)GetComponent方法訪問(wèn)KUInterface中變量h,v及j。將腳本中GetAxisRaw,GetButton方法進(jìn)行替換。
程序開(kāi)發(fā)完成后經(jīng)過(guò)測(cè)試,效果令人滿意,通過(guò)右手的各種手勢(shì)分別控制了人物的4個(gè)動(dòng)作,操作起來(lái)自然協(xié)調(diào),無(wú)生疏感,表現(xiàn)出Kinect的實(shí)用性。
圖2 Kinect結(jié)合Unity角色控制器
2.3 Kinect Wrapper的人物模型控制
Kinect Wrapper的人物模型控制基于卡耐基梅隆的Kinect Wrapper中間件,使用了Mixamo的Male Character Pack人物模型包。
卡耐基梅隆的KinectWrapper是一個(gè)非常實(shí)用的Kinect與Unity交互中間件,它包含以下一些腳本和示例:
KinectExample這是一個(gè)示例場(chǎng)景。
Kinect_Prefab這個(gè)預(yù)制件包含了所有必需的腳本,但不包括控制器。
KinectModelControllerV2這個(gè)腳本將操縱模型中的骨骼,實(shí)現(xiàn)人物模型控制。
DisplayDepth獲取深度圖像。
DisplayColor 獲取RGB圖像。
以及KinectPointMan,KinectPointController,KinectRecorder,KinectEmulator,KinectSensor,DeviceOrEmulator,SkeletonWrapper,DepthWrapper和KinectInterop等腳本。
本實(shí)例的目的是對(duì)模型骨骼和Kinect獲取的骨骼數(shù)據(jù)進(jìn)行對(duì)應(yīng),使模型能模仿用戶(hù)的動(dòng)作,實(shí)現(xiàn)人物模型控制。其步驟如下:
在場(chǎng)景中加入Kinect_Prefab和人物模型,對(duì)模型添加模型控制腳本,即KinectModelControllerV2,在Inspector中將Kinect獲取到的骨骼與模型的骨骼數(shù)據(jù)對(duì)應(yīng),其中的Sw(Skeleton Wrapper)選擇Kinect_Prefab。
在程序測(cè)試中,人物模型能夠非常相似的模仿出用戶(hù)的動(dòng)作,具有很強(qiáng)的娛樂(lè)性。
圖3 Kinect Wrapper的人物模型控制
3 結(jié)束語(yǔ)
本文介紹了Kinect與Unity結(jié)合的開(kāi)發(fā)實(shí)例,利用Kinect通過(guò)手勢(shì)和動(dòng)作進(jìn)行人機(jī)交互以及游戲的開(kāi)發(fā),為Kinect和Unity的開(kāi)發(fā)者提供一個(gè)參考。同時(shí)也說(shuō)明Kinect具有很大的發(fā)展前景以及在各個(gè)領(lǐng)域都能廣泛應(yīng)用。
參考文獻(xiàn):
[1]魏尚.基于Kinect深度圖像的三維人臉識(shí)別技術(shù)研究[D].天津師范大學(xué),2012.
[2]況鷹.基于Kinect運(yùn)動(dòng)捕獲的三維虛擬試衣[D].華南理工大學(xué),2012.
[3]王康.基于Kinect的體感交互式電子白板初探[J].中國(guó)現(xiàn)代教育裝備,2012(06):29-30.
[4]錢(qián)鶴慶.應(yīng)用Kinect與手勢(shì)識(shí)別的增強(qiáng)現(xiàn)實(shí)教育輔助系統(tǒng)[D].上海交通大學(xué),2011.
作者簡(jiǎn)介:姚翠莉(1984-),女,河南西華人,工程師,博士研究生,研究方向:圖像處理與模式識(shí)別;袁璠(1993-),男,廣西靈川人,本科,研究方向:圖像處理與模式識(shí)別;彭飛翔(1993-),男,安徽界首人,本科,研究方向:圖像處理與模式識(shí)別;羅會(huì)哲(1993-),男,廣東深圳人,本科,研究方向:圖像處理與模式識(shí)別;鄧亞仙(1992-),女,遼寧沈陽(yáng)人,本科,研究方向:圖像處理與模式識(shí)別;蔡群(1993-),女,朝鮮族,吉林長(zhǎng)春人,本科,研究方向:圖像處理與模式識(shí)別。
作者單位:大連理工大學(xué)創(chuàng)新實(shí)驗(yàn)學(xué)院,遼寧大連 116023