張?zhí)锾?,何聚?/p>
(1.陜西師范大學(xué) 計(jì)算機(jī)科學(xué)學(xué)院,陜西 西安 710119;2.陜西師范大學(xué) 現(xiàn)代教學(xué)技術(shù)教育部重點(diǎn)實(shí)驗(yàn)室,陜西 西安 710062)
虛擬現(xiàn)實(shí)技術(shù)是近年來發(fā)展較為迅速的計(jì)算機(jī)技術(shù),因其具有極好的沉浸、交互和構(gòu)想的特性,以及能夠高精度地對(duì)現(xiàn)實(shí)世界和假象世界進(jìn)行模擬和表現(xiàn),在軍事、醫(yī)學(xué)、交通、游戲和文化教育等行業(yè)和部門的研究中應(yīng)用廣泛。虛擬現(xiàn)實(shí)中的人機(jī)交互是用戶在虛擬環(huán)境中操作各種虛擬對(duì)象,獲得逼真感知的必要條件[1]。
LEAP公司推出的Leap Motion小型傳感設(shè)備,是目前較為新型的基于手部運(yùn)動(dòng)的虛擬現(xiàn)實(shí)人機(jī)交互設(shè)備。Leap Motion體感設(shè)備通過采用兩個(gè)廣角相機(jī)傳感器和3個(gè)紅外LED,能夠捕捉在150°視場以及25~600 ms的有效探測(cè)范圍內(nèi)的多個(gè)物體,且能夠?qū)τ脩舻氖植恳猿^每秒200幀的速度實(shí)現(xiàn)實(shí)時(shí)的動(dòng)態(tài)跟蹤探測(cè),精度高達(dá)1/100 ms。
在人機(jī)交互中,人體手部姿態(tài)是傳遞信息的重要方式[2],因此如何能夠更加高效準(zhǔn)確地實(shí)現(xiàn)手部操縱物體是一個(gè)重要的研究方向。現(xiàn)今,國內(nèi)外很多學(xué)者對(duì)虛擬現(xiàn)實(shí)研究領(lǐng)域內(nèi)的虛擬手操縱物體的人機(jī)交互理論都進(jìn)行了不同程度的研究。例如,文獻(xiàn)[2]研究了數(shù)據(jù)手套針對(duì)不同形狀下物體的操縱方式;文獻(xiàn)[3]對(duì)基于數(shù)據(jù)手套的虛擬手精確抓取物體的各種姿態(tài)的方法進(jìn)行了研究;文獻(xiàn)[4]研究了在工業(yè)生產(chǎn)中的機(jī)械手抓取物體的方法;文獻(xiàn)[5]研究了不同的凸面物體下虛擬手抓取物體的情況;文獻(xiàn)[6]通過建立虛擬手模型及其坐標(biāo)系統(tǒng),設(shè)計(jì)了根據(jù)虛擬手與物體在接觸面的法向量的不同夾角決定其抓取物體的狀態(tài)條件;文獻(xiàn)[7]研究了基于數(shù)據(jù)手套的在無力反饋的情況下實(shí)現(xiàn)的虛擬手抓取物體的情況;文獻(xiàn)[8]提出了基于Leap Motion的虛擬手部關(guān)鍵點(diǎn)的手部姿態(tài)估計(jì)方法,但在手部出現(xiàn)遮擋的情況下,該姿態(tài)估計(jì)狀況急劇下降。
在Leap Motion官方提供的SDK的手部抓取虛擬物體的算法示例中,采用的是僅基于距離進(jìn)行判定的算法思想,也即通過虛擬手的大拇指指尖距離虛擬物體距離的大小判定手是否處于抓取物體狀態(tài)。并且該算法在求解目標(biāo)物體的目標(biāo)位置時(shí)僅使用大拇指指尖與食指指尖距離的中點(diǎn)進(jìn)行計(jì)算。該算法設(shè)計(jì)過于簡化,容易出現(xiàn)誤操作的現(xiàn)象,同時(shí)因?yàn)椴煌矬w需要設(shè)定的距離不同,反復(fù)地設(shè)定多個(gè)距離過于復(fù)雜,拓展性不夠好。此外,在虛擬手模型對(duì)虛擬3D物體模型進(jìn)行抓取操作時(shí),會(huì)出現(xiàn)嚴(yán)重的手指穿透物體的不真實(shí)現(xiàn)象。
針對(duì)該問題,提出一種基于觸發(fā)檢測(cè)思想的虛擬手操作物體算法,通過觸發(fā)檢測(cè)傳遞出來的手部數(shù)據(jù)信息,判斷手部抓取物體的不同狀態(tài)。手部不觸發(fā)物體,物體就沒有任何操作,增加了手部控制物體的靈敏性和準(zhǔn)確性,并且通過Unity3D引擎設(shè)計(jì)實(shí)驗(yàn)對(duì)算法的可行性進(jìn)行了驗(yàn)證。
人的手部結(jié)構(gòu)可以分為腕部、手掌、手指以及手背等幾個(gè)部分,在手部抓取物體時(shí),主要依靠手掌和手指來控制物體的運(yùn)動(dòng)。所以,詳細(xì)分析手部的組成結(jié)構(gòu)對(duì)設(shè)定手部操縱物體的狀態(tài)條件非常必要。以人的一只手為例,生物學(xué)上,有5塊掌骨,14塊指骨,指骨分為近節(jié)指骨、中節(jié)指骨以及末節(jié)指骨3類,如圖1所示。在手部掌骨和指骨中,大拇指僅由3個(gè)骨骼組成,其余4根手指均由4個(gè)骨骼組成,即1塊掌骨和3塊指骨。在Leap Motion采集手部骨骼信息時(shí),規(guī)定大拇指的掌骨長度為0,其余3個(gè)有長度的骨骼劃入為指骨計(jì)算。
圖1 手部骨骼結(jié)構(gòu)
在Leap Motion使用過程中,一定會(huì)出現(xiàn)虛擬手指與物體之間的接觸碰撞,處理這些碰撞,使用高效率的碰撞檢測(cè)算法,能夠使虛擬手更實(shí)時(shí)地操縱物體。一般常用的碰撞檢測(cè)算法有包圍盒層次法、距離跟蹤法以及空間剖分法等[9]。
文中采用觸發(fā)檢測(cè)來獲取手部的相關(guān)信息,觸發(fā)檢測(cè)采用層次包圍盒碰撞檢測(cè)思想。層次包圍盒碰撞檢測(cè)算法應(yīng)用比較廣泛,該算法曾經(jīng)在計(jì)算機(jī)圖形學(xué)的許多應(yīng)用領(lǐng)域中都被深入的研究[10]。
層次包圍盒碰撞檢測(cè)思想即是利用體積略大而形狀簡單的包圍盒把復(fù)雜的幾何對(duì)象包裹起來,在進(jìn)行碰撞檢測(cè)時(shí)首先進(jìn)行包圍盒之間的相交測(cè)試,如果包圍盒相交則再進(jìn)行幾何對(duì)象之間的精確的碰撞檢測(cè)[11]。文中將3D虛擬物體用形狀簡單的包圍盒包括起來進(jìn)行觸發(fā)檢測(cè),通過獲取的觸發(fā)信息來定義手部所處的狀態(tài),從而判斷手部操作虛擬物體的不同狀態(tài)切換。
真實(shí)手在抓取物體時(shí)5根手指起了主要作用,以右手為例,若要抓取物體至少要有2根手指,大拇指和食指。所以定義不同的操作狀態(tài)條件可以通過判斷觸發(fā)手指的個(gè)數(shù),從而制定不同的狀態(tài)切換條件。
根據(jù)手部抓取虛擬物體的形態(tài)判斷,文中應(yīng)用一個(gè)集合S描述兩種抓取類型:S={Pinch,Grab}。其中Pinch元素表示捏取狀態(tài),描述僅運(yùn)用手指末節(jié)指骨抓取物體的情況,當(dāng)為Pinch控制狀態(tài)時(shí),通過5根手指的末節(jié)指骨對(duì)虛擬物體施加力來移動(dòng)物體;Grab元素表示抓取狀態(tài),當(dāng)為Grab控制狀態(tài)時(shí),通過5根手指和手掌結(jié)合對(duì)物體施加力來操縱物體的移動(dòng)。
對(duì)于兩種抓取類型,定義兩個(gè)集合來處理抓取的狀態(tài)切換。定義集合P={pinching,pinched,releasing,released},其中pinching表示手部將要捏取物體;pinched表示手部已經(jīng)捏取物體,正處在操縱狀態(tài);releasing表示手部將要釋放物體;released表示物體已經(jīng)釋放物體。同理,定義集合G={grabbing,grabbed,releasing,released},集合G的4個(gè)元素表示抓取物體過程的不同狀態(tài)。
表1給出了在Pinch控制狀態(tài)下手部捏取物體的各個(gè)狀態(tài)需要滿足的部分條件,Grab控制狀態(tài)與Pinch狀態(tài)下滿足相同的觸發(fā)條件。
表1 Pinch狀態(tài)下各狀態(tài)需滿足的部分條件
為了增強(qiáng)手部操縱物體的仿真效果,防止出現(xiàn)誤操作的情況,需要在以下控制狀態(tài)下附加操作條件。
(1)當(dāng)手完全處于伸展或者握拳狀態(tài)時(shí),即使觸發(fā)器檢測(cè)到手指,也認(rèn)為用戶沒有意向要操縱物體。
(2)當(dāng)手正在捏取或抓取物體時(shí),手部相對(duì)虛擬物體微小的位移,不改變手部控制物體的狀態(tài)。
(3)要操作的目標(biāo)物體必須是剛體。
基于以上操作物體的條件,給出算法基本流程:
Step1:定義手部操作物體的不同狀態(tài)條件;
Step2:根據(jù)從Leap Motion和觸發(fā)器獲取到的數(shù)據(jù)信息來決定手部的操作控制狀態(tài);
Step3:根據(jù)不同的控制狀態(tài)決定不同的操作;
Step4:當(dāng)處于pinched或grabbed狀態(tài)時(shí),計(jì)算目標(biāo)物體要移動(dòng)到的目標(biāo)位置。當(dāng)處于released狀態(tài)時(shí),目標(biāo)物體脫離虛擬手控制;
Step5:回到Step1。
要實(shí)現(xiàn)操縱物體,除了完成抓取的動(dòng)作之外,還需要在抓取的過程中實(shí)現(xiàn)物體的移動(dòng),這時(shí)就需要對(duì)物體的動(dòng)態(tài)目標(biāo)位置進(jìn)行計(jì)算判斷。文中求取目標(biāo)物體需要移動(dòng)的目標(biāo)位置,通過該物體移動(dòng)的速度進(jìn)行計(jì)算。
根據(jù)手部模型控制虛擬物體不同的方式建立模型。當(dāng)手部處于Pinch狀態(tài)時(shí),以3根手指捏取一個(gè)立方體為例。如圖2所示,當(dāng)3個(gè)手指的指尖與物體表面觸發(fā)器接觸時(shí),以手指與觸發(fā)器接觸點(diǎn)A,B,C為頂點(diǎn)建立一個(gè)三角形模型,然后求解該三角形的重心點(diǎn)G(xG,yG,zG),點(diǎn)O(xO,yO,zO)為物體自身的位置坐標(biāo)點(diǎn),進(jìn)而計(jì)算出O-G之間的距離DOG。
對(duì)于4個(gè)手指和5個(gè)手指的情況,需要建立的模型為多面體模型,如圖3所示。在4個(gè)手指的情況下,建立了四面體模型。此時(shí),需要計(jì)算該四面體的重心位置。同理,在5個(gè)手指的情況下,需要建立5個(gè)頂點(diǎn)的多面體模型,然后計(jì)算其重心坐標(biāo)位置。對(duì)于大拇指與食指捏取的情況,建立以兩只手指末節(jié)指骨中點(diǎn)為頂點(diǎn)的直線模型。
圖2 三角形模型
圖3 四面體模型
當(dāng)手部處于Grab狀態(tài)時(shí),需要通過手指與手掌的配合來實(shí)現(xiàn)物體的抓取,根據(jù)Pinch狀態(tài)下建模的思想啟發(fā),可以通過利用手部掌骨和指骨的骨骼中心點(diǎn)為頂點(diǎn)來建立非規(guī)則多面體模型,如圖4所示。
圖4 非規(guī)則多面體模型
在建立的模型中,首先需要求得模型的重心坐標(biāo)點(diǎn)G的位置,通過使用基于頂點(diǎn)系的重心坐標(biāo)計(jì)算思想[12-13]進(jìn)行求解。也即是,在空間坐標(biāo)系O-xyz中,設(shè)多面體V的頂點(diǎn)Ai的坐標(biāo)是Ai(xi,yi,zi),則組成的多面體的重心坐標(biāo)G(xG,yG,zG)為:
(1)
其中,當(dāng)為Pinch狀態(tài)時(shí),n=(2,…,5);當(dāng)為Grab狀態(tài)時(shí),n=(2,…,20)。
通過式1計(jì)算出G點(diǎn)坐標(biāo)之后,就可以計(jì)算出O-G兩個(gè)位置坐標(biāo)點(diǎn)的距離DOG。
(2)
其中,Δt表示每幀的間隔時(shí)間。
Leap Motion采用的是右手笛卡爾坐標(biāo)系,原點(diǎn)在Leap Motion控制器中心,返回的值是以真實(shí)世界的毫米為單位,而Unity采用的是左手坐標(biāo)系,以米為單位。
如果要使用從Leap Motion中獲取的手部坐標(biāo)數(shù)據(jù),則需要根據(jù)式3進(jìn)行坐標(biāo)轉(zhuǎn)換,將毫米轉(zhuǎn)換成米,需要乘以比例因子k=0.001,右手坐標(biāo)系轉(zhuǎn)換成左手坐標(biāo)系,需要使用坐標(biāo)轉(zhuǎn)換向量Fz。通過式3計(jì)算出Unity坐標(biāo)系下的本地坐標(biāo)Plocal,該本地坐標(biāo)值表示獲取到的手部坐標(biāo)值是相對(duì)于Unity空間中Leap Motion控制器位置的。
Plocal=k*Fz·Plp
(3)
在Unity中最后使用的坐標(biāo)值,是基于Unity世界坐標(biāo)系的世界坐標(biāo)值,所以需要將Unity本地坐標(biāo)系下的本地坐標(biāo)值轉(zhuǎn)換成世界坐標(biāo)值。這需要坐標(biāo)值在不同坐標(biāo)系下進(jìn)行仿射變換[14-15]。設(shè)坐標(biāo)點(diǎn)在Unity世界坐標(biāo)系下的坐標(biāo)值為Pworld=[xw,yw,zw]T,運(yùn)用仿射變換,該坐標(biāo)值為:
(4)
其中,Mlocal→world為一個(gè)4×4的本地坐標(biāo)值轉(zhuǎn)換到世界坐標(biāo)值的坐標(biāo)變換矩陣。通過該變換可以獲得手部信息在Unity世界坐標(biāo)系下的坐標(biāo)值。
通過上述內(nèi)容,設(shè)計(jì)了基本的手部控制物體操作實(shí)驗(yàn)。硬件環(huán)境配置為:Intel(R)Core(TM)i7-6700 CPU,3.4 GHz處理器,16.0 GB內(nèi)存,NVIDIA GeForce GTX970顯卡,Window7旗艦版操作系統(tǒng),一臺(tái)Leap Motion傳感器。軟件環(huán)境配置為:Unity3D引擎軟件,5.1.3f1個(gè)人版本;VisualStudio2012專業(yè)版本集成開發(fā)環(huán)境;同時(shí)采用LEAP公司提供的SDK V2.3.0 for Windows獲取Leap Motion傳感器返回的信息數(shù)據(jù)。
通過采用幾種不同形狀的3D虛擬物體模型,驗(yàn)證了算法的可行性。圖5和圖6給出了未改進(jìn)前算法的左右手實(shí)現(xiàn)捏取物體的效果圖。從效果圖中可以看出,未改進(jìn)前算法虛擬手抓取物體出現(xiàn)了明顯的穿透物體現(xiàn)象,抓取效果不夠真實(shí)。圖7和圖8給出了改進(jìn)算法虛擬手抓取物體的效果展示,可以看出虛擬手抓取物體效果明顯提高。
圖5 未改進(jìn)算法左手抓取物體效果展示
圖6 未改進(jìn)算法右手抓取物體效果展示
圖7 改進(jìn)算法左右手捏取物體效果展示
圖8 改進(jìn)算法左右手抓取物體效果展示
通過分析手部骨骼結(jié)構(gòu)以及手部運(yùn)動(dòng)姿態(tài),建立了不同的非規(guī)則多面體模型,實(shí)現(xiàn)了左右兩只手均能對(duì)Unity中構(gòu)建的虛擬3D物體進(jìn)行抓取、移動(dòng)、釋放等操作功能。文中算法基于Unity設(shè)計(jì),實(shí)驗(yàn)結(jié)果表明,該算法具有良好的可行性和擴(kuò)展性。因?yàn)閷?duì)場景內(nèi)虛擬物體使用了碰撞包圍盒,所以極大降低了虛擬手指對(duì)虛擬物體的穿透現(xiàn)象的發(fā)生,增加了手部抓取物體模擬效果的真實(shí)性,為設(shè)計(jì)基于Leap Motion的人機(jī)交互應(yīng)用提供了參考。在設(shè)計(jì)基于Leap Motion的Unity3D游戲中,可以將基于該算法設(shè)計(jì)的代碼直接應(yīng)用到具有觸發(fā)器的3D虛擬物體和虛擬手模型上,進(jìn)而實(shí)現(xiàn)手部模型操縱虛擬游戲物體的效果。
由于現(xiàn)在LEAP公司設(shè)計(jì)的Leap Motion傳感器僅提供單個(gè)Leap Motion工作,在Leap Motion工作的過程中會(huì)出現(xiàn)手部遮擋部分無法檢測(cè)的情況,這時(shí)操縱物體的效果會(huì)受到一定影響。此外,Leap Motion在檢測(cè)過程中會(huì)出現(xiàn)丟幀現(xiàn)象,也會(huì)在一定程度上影響實(shí)驗(yàn)效果。因此,在以后的研究工作中,會(huì)思考并嘗試將Leap Motion與多個(gè)計(jì)算機(jī)進(jìn)行連接,使用多Leap Motion進(jìn)行實(shí)驗(yàn)操作,以及將其與其他體感設(shè)備(如Kinect)相結(jié)合,從而增強(qiáng)手部操縱物體的綜合實(shí)驗(yàn)效果。