Leap Motion運(yùn)行原理介紹
定位與輸入是VR技術(shù)的關(guān)鍵,leap MoTIon使用的是一種基于計(jì)算機(jī)視覺原理的識(shí)別技術(shù)。目前在業(yè)內(nèi)比較有代表性的就是Leap MoTIon的手勢(shì)識(shí)別技術(shù),當(dāng)然這并非Leap MoTIon獨(dú)有的技術(shù),hololens上同樣搭載該技術(shù)。從 API 的角度大概說一下。
Leap MoTIon 傳感器的結(jié)構(gòu):
大體上,Leap 傳感器根據(jù)內(nèi)置的兩個(gè)攝像頭從不同角度捕捉的畫面,重建出手掌在真實(shí)世界三維空間的運(yùn)動(dòng)信息。檢測(cè)的范圍大體在傳感器上方 25 毫米到 600 毫米之間,檢測(cè)的空間大體是一個(gè)倒四棱錐體。
首先,Leap Motion 傳感器會(huì)建立一個(gè)直角座標(biāo)系,座標(biāo)的原點(diǎn)是傳感器的中心,座標(biāo)的 X 軸平行于傳感器,指向屏幕右方。Y 軸指向上方。Z 軸指向背離屏幕的方向。單位為真實(shí)世界的毫米。如圖:
在使用過程中, Leap Motion 傳感器會(huì)定期的發(fā)送關(guān)于手的運(yùn)動(dòng)信息,每份這樣的信息稱為“幀”( frame )。每一個(gè)這樣的幀包含檢測(cè)到的:
所有手掌的列表及信息;
所有手指的列表及信息;
手持工具(細(xì)的、筆直的、比手指長(zhǎng)的東西,例如一枝筆)的列表及信息;
所有可指向?qū)ο螅≒ointable Object),即所有手指和工具的列表及信息;
Leap 傳感器會(huì)給所有這些分配一個(gè)唯一標(biāo)識(shí)(ID),在手掌、手指、工具保持在視野范圍內(nèi)時(shí),是不會(huì)改變的。根據(jù)這些 ID,可以通過 Frame::hand( ) , Frame::finger( ) 等函數(shù)來查詢每個(gè)運(yùn)動(dòng)對(duì)象的信息。
Leap 可以根據(jù)每幀和前幀檢測(cè)到的數(shù)據(jù),生成運(yùn)動(dòng)信息。例如,若檢測(cè)到兩只手,并且兩只手都超一個(gè)方向移動(dòng),就認(rèn)為是平移;若是像握著球一樣轉(zhuǎn)動(dòng),則記為旋轉(zhuǎn)。若兩只手靠近或分開,則記為縮放。所生成的數(shù)據(jù)包含:
旋轉(zhuǎn)的軸向向量;
旋轉(zhuǎn)的角度(順時(shí)針為正);
描述旋轉(zhuǎn)的矩陣;
縮放因子;
平移向量;
對(duì)于每只手,可以檢測(cè)到如下信息:
手掌中心的位置(三維向量,相對(duì)于傳感器座標(biāo)原點(diǎn),毫米為單位);
手掌移動(dòng)的速度(毫米每秒);
手掌的法向量(垂直于手掌平面,從手心指向外);
手掌朝向的方向;
根據(jù)手掌彎曲的弧度確定的虛擬球體的中心;
根據(jù)手掌彎曲的弧度確定的虛擬球體的半徑;
其中,手掌的法向量和方向如下圖所示:
“手掌球”的圓心和半徑:
對(duì)于每個(gè)手掌,亦可檢測(cè)出平移、旋轉(zhuǎn)(如轉(zhuǎn)動(dòng)手腕帶動(dòng)手掌轉(zhuǎn)動(dòng))、縮放(如手指分開、聚合)的信息。檢測(cè)的數(shù)據(jù)如全局變換一樣,包括:
旋轉(zhuǎn)的軸向向量;
旋轉(zhuǎn)的角度(順時(shí)針為正);
描述旋轉(zhuǎn)的矩陣;
縮放因子;
平移向量;
Leap 除了可以檢測(cè)手指外,也可以檢測(cè)手持的工具。像上文所說的,就是細(xì)的、筆直的、比手指長(zhǎng)的物件:
對(duì)于手指和工具,會(huì)統(tǒng)一地稱為可指向?qū)ο螅≒ointable Object,抱歉不太會(huì)翻譯),每個(gè) Pointable Object 包含了這些信息:
長(zhǎng)度;
寬度;
方向;
指尖位置;
指尖速度;
方向和指尖位置如下圖:
根據(jù)全局的信息、運(yùn)動(dòng)變換,手掌、手指和工具的信息和變換,開發(fā)者就可以靠這些來制作游戲、程序了。