LeapMotion 之Unity開發(fā)指南(1.基本概念和手的預(yù)制件)
【敘言】
最近用Leap Motion + 國產(chǎn)的3Glass眼鏡構(gòu)建了房地產(chǎn)、數(shù)字礦山的1些利用,感覺這是很經(jīng)濟的1個VR架構(gòu)方案,比用Oculus和HTC的硬件要省錢很多,并且效果也不錯。
在行業(yè)VR利用中,其實重在培訓(xùn)教育、生產(chǎn)安全的仿真演練上,更多地通過1些UI互動、基礎(chǔ)性的手勢(比如開關(guān)裝備、拾起滅火設(shè)備等)來進行交互,這些其實不1定需要非常昂貴的激光定位裝備、復(fù)雜的硬件套件才可實現(xiàn),而手勢辨認在未來也是1個趨勢。
所以將1些開發(fā)積累整理下來,希望不斷地能在這個領(lǐng)域中學(xué)習(xí)領(lǐng)會,終究能為行業(yè)客戶創(chuàng)造1些實用的價值。 歡迎大家和我1起交換,QQ:115913892
1. 安裝
1. 打開官網(wǎng):https://developer.leapmotion.com/get-started
2. 先要下載和安裝LeapMotion的驅(qū)動程序
注:我買的是2代Leap Motion,所以在Win10下 不支持V2 Desktop的開發(fā)驅(qū)動,選擇左面的。(注意是開發(fā)驅(qū)動,而非App利用)
我下載的最新版本是3.1.2,解壓后以下圖。
運行EXE文件,根據(jù)提示安裝驅(qū)動,實際上這將安裝了1個駐留程序在系統(tǒng)托盤中,并且生成1個自動啟動的系統(tǒng)服務(wù)Leap Service,在控制面板中可查看它,當遇到Leap Motion不工作,或托盤中圖標顯示黑色時,可檢查1下這個服務(wù)是不是正常。
驅(qū)動程序與LeapService通訊,讀取硬件層面3D攝像頭跟蹤的手勢數(shù)據(jù),上層類的利用(如Unity,虛幻4,Java等)則與驅(qū)動程序(C++寫成)通訊。
安裝成功后,能看到LeapMotion兩個攝像頭和中間LED燈都正常亮起,表明處于工作狀態(tài),這時候可用自動安裝的Leap App Home利用來測試1下,通過它還可下載1些官方的例子。
3. 下載準備好各類Unity包
到https://developer.leapmotion.com/unity下載所需的包。
其中CoreAssert是核心包,其他都是封裝好的各類功能包,在實戰(zhàn)篇中會介紹。
2. 基本概念
1. 坐標系統(tǒng)
Unity使用左手坐標,LeapMotion使用右手坐標(所以,Z軸是相反的)。
Unity以米為單位,LeapMotion使用毫米。LeapMotion配備的Plugin腳本內(nèi)部對坐標系統(tǒng)進行了轉(zhuǎn)化,行將單位和坐標轉(zhuǎn)化為Unity的標準。
注意:在Unity中,1定要從LeapServiceProvider中取得Frame對象,否則在幀中的數(shù)據(jù)(TrackingData)將還使用Leap的坐標系統(tǒng)。LeapServiceProvider解析了Scaling,Rotation,Translation的變換.
2. 手勢跟蹤
LeapMotion使用了光學(xué)傳感器和紅外光組件。傳感器的FOV為150度。頂部0.03~0.06米為有效的跟蹤范圍。
最好的工作環(huán)境是可產(chǎn)生清晰的、高對照度對象輪廓的光照環(huán)境。
HMD模式下(頭盔綁定的模式 ),跟蹤算法被優(yōu)化成對不同的視角下辨認手勢(大概的意思多是,你頭盔多動動,辨認得更好1些),比放在桌面固定不動要更好1些。
3. 手(Hand Assert)
(1)表示方法
在預(yù)制件目錄下,分成圖形(圖元)和物理兩組腳本和預(yù)制件,可以用其中各1來組合表示手。這1處1定要理解,官方的Unity包里給了1些場景例子,可以研習(xí)1下。
從概念上手被辨別成Graphic和Physic兩種組件構(gòu)成,前1即是圖元,主要是顯現(xiàn)手的外觀,后1主要表現(xiàn)手的物理特性(如剛體、碰撞)。
也能夠沒有物理組件,這樣就不能產(chǎn)生物理特點了。
(2)創(chuàng)建手的方法
有幾種創(chuàng)建手的方法:
(3)1個例子
下圖是1個典型的手的例子,1個HandController下掛4個子對象,分別是圖元左右手,物理左右手。
3. 創(chuàng)建你自己的手Prefab
注:隨著官方例子創(chuàng)建1個手,可能其實不是很實用,但有助于理解手的預(yù)制件和原理組成。
你可以創(chuàng)建類似于已提供的Unity包里的手預(yù)制件,用你自己的圖形來表示手,同時定制自己的手的行動(基于已提供好的代碼)。
我們要創(chuàng)建的這類手稱為“離散手預(yù)制件Discrete Hand Prefabs”,意思是手上每一個部位都是單獨的Game Object,都有其單獨的位置和方向信息。在Core assert 包里,機器人的手即是這樣的“離散預(yù)制件”。下面介紹了通過使用Unity自帶的幾何體(圓柱、圓)來創(chuàng)建Prefab。
首先,我們需要創(chuàng)建1個手指的Prefab,并且使用它來創(chuàng)建手Prefab。
1. 創(chuàng)建1個場景.
2. 新建1個空對象,命名KnobbyFinger
3. 創(chuàng)建骨頭
1) 新建1個空對象到KnobbyFinger下,命名Metacarpal (掌骨)
2) 新建1個Cylinder到Metacarpal,命名Tube.在創(chuàng)建你自己的手時,將此Cylinder替換為你自己的圖形對象(或Obejct)
3) 移除碰撞體組件,否則RigidHand碰撞體將會與它反彈。
4) 設(shè)置X Rotation為90。
(最好設(shè)置成Top視野來視察)
5) 將Tube X、Z的Scale設(shè)置成0.003(3毫米)。之所以這樣設(shè)置,是由于要使用帶皮膚的骨頭,真實的手指要更胖1些。
6) 設(shè)置Tube Y的Scale為0.034(34毫米)。這個決定了手指的長度。
尺寸必須使用真實世界的,轉(zhuǎn)化為米。Y的長度應(yīng)為68mm的1半,這是由于Cylinder是2個單位高。所以我們要Scale縮減50%。.
7) 復(fù)制Metacarpal,命名Proximal,Tube的 Y-Scale設(shè)置為0.02
8) 再復(fù)制Metacarpal,命名Intermediate,Tube的Y-Scale設(shè)置為0.01。
9) 再次復(fù)制Metacarpal,命名Distal,Tube的Y-Scale為0.007。
4. 創(chuàng)建關(guān)節(jié)
記住:你沒必要都需要骨頭和關(guān)節(jié)
1) 新建空對象到KnobbyFinger,取名MetacarpophalangealJoint(掌指關(guān)節(jié))。
2) 新建1個圓到關(guān)節(jié),取名Knob.
3) 移除碰撞體。
4) 將Knob所有的Scale設(shè)置成0.01(1厘米).
5) 復(fù)制MetacarpophalangealJoint更名為ProximalinterphalangealJoint.
6) 復(fù)制MetacarpophalangealJoint更名為DistalinterphalangealJoint.
6. 增加SkeletalFinger 腳本組件到KnobbyFinger
7. 拖動每一個關(guān)節(jié)和骨頭到腳本中的相應(yīng)變量處。
具體以下:
Bones:
o 0 -Metacarpal
o 1 - Proximal
o 2 -Intermediate
o 3 - Distal
Joints:
o 0 - MetacarpohalangealJoint
o 1 -ProximalinterphalangealJoint
o 2 -DistalphalangealJoint
8. 將KonbbyFinger做成預(yù)制件。
(創(chuàng)建好手指Prefab后)
1. 創(chuàng)建空對象,取名KnobbyHand.
2. 增加SkeletalHand 腳本到 KnobbyHand.
3. 腳本變量Handedness設(shè)置成“Either.” (如果你的手是不對稱的,設(shè)置成 “Right” or “Left”.)
4. 拖動5個KnobbyFinger Prefab得手中,命名為:Thumb, Index, Middle, Ring, and Pinky.
5. 對每一個手指,設(shè)置Finger類型為相對應(yīng)的類型(SkelatalFinger腳本組件中)。
6. 拖動手指到KnobbyHand 的SkeletalHand 腳本中相應(yīng)的Fingers變量上.
Finger element order:
o 0 - Thumb
o 1 - Index
o 2 - Middle
o 3 - Ring
o 4 - Pinky
7. 拇指是特殊的,沒有Metacarpal. 因此,編輯Thumb,在bone數(shù)組中移除bone( element 0 ) . 刪除Metacarpal子對象.
8. 增加手掌Add the palm:
如果沒有圖形元素,你可以在KnobbyHand的SkeletalHand腳本變量Palm,wrist,forearm先留為空白。手掌也可通過RigidHand來表示,如果你不使用palm,你可以修改RigidHand的副本,但要移除rigid body和collider。
1) 增加1個空對象到KnobbyHand.取名Palm.
2) 增加1個Cylinder到 Palm.取名 Disc.
3) 移除Collider.
4) 設(shè)置Disc的 scale為 (.085, .0015, .085)..
5) 拖動Palm到SkeletalHand腳本的Palm變量中
9. 增加手段:
1) 增加1個空對象到KnobbyHand,取名Wrist.
2) 增加1個圓到Wrist.取名 Ball.
3) 移除Collider.
4) 設(shè)置Ball的 scale為(.03, .03, .03).
5) 拖動Wrist到SkeletalHand腳本WristJoint變量中.
10. 增加胳膊
1) 增加1個空對象Arm.
2) 增加1個Cylinder:Rod.
3) 移除Collider.
4) 設(shè)置Rod的x rotation為: 90.
5) 設(shè)置Rod的scale為:(.02, .12, .02).
6) 拖動 Arm到SkeletalHand腳本的Forearm
12. 將KnobbyHand創(chuàng)建為prefab.
KnobbyHand的結(jié)構(gòu)應(yīng)為下圖所示:
1. 新建1個LeapHandController prefab到場景中,以便交互區(qū)域是在攝影機的FOV內(nèi)。
2. 設(shè)置以下層次結(jié)構(gòu)
3. 在LeapHandController的HandPool中設(shè)置:
.
4. 運行關(guān)卡,視察你的手
如果RigidHand組件在Scene窗口中可見,但抖動或反彈,確保你移除圖元手部位的所有碰撞體。
如果手指堆疊或移動在1個手指的控制下,檢查手指SkeletalFinger 腳本的手指類型設(shè)置。
如果你的手混雜成1大團的亂糟糟模樣,那是每一個子元的Scale設(shè)置的太大了,記得Unity的單位是1米,1個典型的手寬度是8.5厘米(或表示成Unity transform的Scale是0.085)。如果想使手更大1些(在游戲里看),增大LeapHandController的Scale.