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