天天看點

leap motion原理

這就是 Motion Visualizer,它将由 Leap 傳感器捕捉到的手部運動資訊映射出來:

<img src="https://pic1.zhimg.com/f1f1f51f2b51f03002bb65dfe80c45b0_b.jpg" data-rawwidth="1440" data-rawheight="900" class="origin_image zh-lightbox-thumb" width="1440" data-original="https://pic1.zhimg.com/f1f1f51f2b51f03002bb65dfe80c45b0_r.jpg">

leap motion原理

(黃色錐體即 Leap 的視野)

Leap 的傳感器能捕捉到這三種運動資訊:手指(及手持物)的運動、手掌的運動、手掌球(手的弧面模拟的球體,帶有球心位置和半徑資訊)三種。另外,還可以通過兩隻手的相對運動生成平移、旋轉和縮放資訊。這裡有更詳細的描述:Leap Motion 的原理是什麼?

手指的運動:

在隻伸出一隻手指的情況下,Leap 的捕捉資訊相當精準。手指的一點點移動都能被迅速捕捉到。不過,伸出多個手指後,Leap 盡管對手指的捕捉依然非常精準,但經常會「跟丢」一些手指,即手指突然消失随後識别成一個新手指出現在螢幕上。尤其是手兩端的拇指和小指。若不伸出手指,那麼 Leap 是不會捕捉到運動資訊的。若手指被手掌或其他手指擋住,也不會捕捉到的。(是以就不能像小孩子玩那種 biu~biu~biu~ 那種打槍遊戲那樣玩 FPS 類遊戲了,很遺憾 = = )

手掌的運動:

在 Motion Visualizer 裡按一下 [n] ,即可标注手掌的運動:

<img src="https://pic3.zhimg.com/e2551cd51200285eec9c91a7070576d2_b.jpg" data-rawwidth="1440" data-rawheight="900" class="origin_image zh-lightbox-thumb" width="1440" data-original="https://pic3.zhimg.com/e2551cd51200285eec9c91a7070576d2_r.jpg">

leap motion原理

在這裡,手掌平面以圓盤标出,圓盤上指向的箭頭分别是手指方向的方向向量,與手掌方向的法向量。

手掌的運動也捕捉地比較準确。但有很大局限性。局限性之一是,手掌的傾角不能太大,大于 45 度效果就很差了。然後,手掌的法向量的正向被設定成始終指向 Leap 傳感器。如果手掌一開始在 Leap 傳感器的右側,保持手掌朝向不變緩緩移到左側,Leap 識别的方向也會變成朝向原點(即 Leap 傳感器自己的位置)一邊。還有,人臉對此也會有幹擾,會把人臉檢測成一個不穩定的平面。是以用的時候,要注意臉離傳感器的視野遠一些。(本來還想做一個乒乓球遊戲呢,看到這樣還是算了吧 > <)

手掌球:

&amp;amp;lt;img src=&quot;https://pic3.zhimg.com/8e07b8b34795900b24d4673f5e24d5d2_b.jpg&quot; data-rawwidth=&quot;1394&quot; data-rawheight=&quot;927&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1394&quot; data-original=&quot;https://pic3.zhimg.com/8e07b8b34795900b24d4673f5e24d5d2_r.jpg&quot;&amp;amp;gt;手掌球随手掌的張開大小,半徑發生變化。不過半徑的變化範圍比較有限,不能變得太小,也變不了太大。

leap motion原理

手掌球随手掌的張開大小,半徑發生變化。不過半徑的變化範圍比較有限,不能變得太小,也變不了太大。

Leap Motion 給了開發者一些程式設計範例,其中一個是檢測兩隻手的相對位移,根據這個相對位移來平移、旋轉、縮放這個網格:

&amp;amp;lt;img src=&quot;https://pic3.zhimg.com/c8f683d7a88dffca2c782cdd340ce2ea_b.jpg&quot; data-rawwidth=&quot;1054&quot; data-rawheight=&quot;824&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1054&quot; data-original=&quot;https://pic3.zhimg.com/c8f683d7a88dffca2c782cdd340ce2ea_r.jpg&quot;&amp;amp;gt;

leap motion原理

在這裡,如果就是那樣伸出兩隻手,效果一般。不過,如果兩隻手各伸出一隻手指來操控的話,效果會好很多,平移、旋轉、縮放都非常靈敏。

Leap 還有一個功能,就是在進行螢幕校準後,可以用手指隔空像雷射筆一樣模拟滑鼠在螢幕上的運動(但不能點選,現在 Leap 僅供開發者測試、制作程式和遊戲用),如圖(圖怎麼正不過來 > <):

&amp;amp;lt;img src=&quot;https://pic1.zhimg.com/2544a164d5cf84dcf28179028cc44c28_b.jpg&quot; data-rawwidth=&quot;2592&quot; data-rawheight=&quot;1936&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;2592&quot; data-original=&quot;https://pic1.zhimg.com/2544a164d5cf84dcf28179028cc44c28_r.jpg&quot;&amp;amp;gt;

leap motion原理

這個功能非常好用,也可以左右手各伸出一隻手指來玩。不過還是那樣,伸出多個手指後效果就差一些,經常有手指跟丢。

在強光直射下,Leap 的檢測效果會變差一些。不過遠離頂燈、台燈、日光什麼的就是了~

Leap 傳感器在使用了一段時間後會有些發熱。不過也就是比較溫的那種熱量啦。

總結:

優點:單指、雙指操控非常靈敏,「隔空指物」功能很好用;

缺點:易受幹擾,多指操控容易出現「跟丢」現象。

是以,建議對預訂 Leap 持觀望态度,在正式版出來後看看媒體的評測,然後再決定購買。不過在正式版上會帶有紅外線 LED,效果應該會好一些~

Leap Motion 傳感器對 OS X 和 Windows 的支援都很好(Leap Motion 公司的 CFO 以前在蘋果管 iAd 業務)。對于開發者來說,可以使用很多程式設計語言(工具)來開發應用程式,有C++, Objective-C, Java, C#, Python, Unity 等,但注意 Unity 需要 Pro 許可證,因為免費版本的 Unity 不支援插件。(Pro 版本的 Unity 要一千五美刀呢,哭)

關于 Leap Motion 的應用,個人也在根據這幾天的測試探索當中,希望做出一些高品質的遊戲、應用。

從 API 的角度大概說一下

Leap Motion 傳感器的結構:

&amp;amp;lt;img src=&quot;https://pic3.zhimg.com/375b2d913e59c4c5e5c13cc0ff373e1a_b.jpg&quot; data-rawwidth=&quot;668&quot; data-rawheight=&quot;478&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;668&quot; data-original=&quot;https://pic3.zhimg.com/375b2d913e59c4c5e5c13cc0ff373e1a_r.jpg&quot;&amp;amp;gt;

leap motion原理

大體上,Leap 傳感器根據内置的兩個攝像頭從不同角度捕捉的畫面,重建出手掌在真實世界三維空間的運動資訊。檢測範圍大體在傳感器上方 25 毫米到 600 毫米之間,檢測的空間大體是一個倒四棱錐體。

首先,Leap Motion 傳感器會建立一個直角座標系,座標的原點是傳感器的中心,座標的 X 軸平行於傳感器,指向螢幕右方。Y 軸指向上方。Z 軸指向背離螢幕的方向。單位爲真實世界的毫米。如圖:

&amp;amp;lt;img src=&quot;https://pic1.zhimg.com/ae1774695a4ae7f5051962d70c4f7658_b.jpg&quot; data-rawwidth=&quot;600&quot; data-rawheight=&quot;480&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;600&quot; data-original=&quot;https://pic1.zhimg.com/ae1774695a4ae7f5051962d70c4f7658_r.jpg&quot;&amp;amp;gt;

leap motion原理

在使用過程中, Leap Motion 傳感器會定期的發送關於手的運動資訊,每份這樣的資訊稱爲「幀」( frame )。每一個這樣的幀包含檢測到的:

  • 所有手掌的清單及資訊;
  • 所有手指的清單及資訊;
  • 手持工具(細的、筆直的、比手指長的東西,例如一枝筆)的清單及資訊;
  • 所有可指向對象(Pointable Object),即所有手指和工具的清單及資訊;

Leap 傳感器會給所有這些配置設定一個唯一標識(ID),在手掌、手指、工具保持在視野範圍內時,是不會改變的。根據這些 ID,可以通過 Frame::hand( ) , Frame::finger( ) 等函數來查詢每個運動對象的資訊。

Leap 可以根據每幀和前幀檢測到的數據,生成運動資訊。例如,若檢測到兩隻手,並且兩隻手都超一個方向移動,就認爲是平移;若是像握着球一樣轉動,則記爲旋轉。若兩隻手靠近或分開,則記爲縮放。所生成的數據包含:

  • 旋轉的軸向向量;
  • 旋轉的角度(順時針爲正);
  • 描述旋轉的矩陣;
  • 縮放因子;
  • 平移向量;

對於每隻手,可以檢測到如下資訊:

  • 手掌中心的位置(三維向量,相對於傳感器座標原點,毫米爲單位);
  • 手掌移動的速度(毫米每秒);
  • 手掌的法向量(垂直於手掌平面,從手心指向外);
  • 手掌朝向的方向;
  • 根據手掌彎曲的弧度確定的虛擬球體的中心;
  • 根據手掌彎曲的弧度確定的虛擬球體的半徑;

其中,手掌的法向量和方向如下圖所示:

&amp;amp;lt;img src=&quot;https://pic3.zhimg.com/39ccd43f137cec866fd23c7ca9b56a36_b.jpg&quot; data-rawwidth=&quot;517&quot; data-rawheight=&quot;261&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;517&quot; data-original=&quot;https://pic3.zhimg.com/39ccd43f137cec866fd23c7ca9b56a36_r.jpg&quot;&amp;amp;gt;

leap motion原理

「手掌球」的圓心和半徑:

&amp;amp;lt;img src=&quot;https://pic1.zhimg.com/dcc82dfb23c58cc4cd23714568feb5fc_b.jpg&quot; data-rawwidth=&quot;650&quot; data-rawheight=&quot;385&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;650&quot; data-original=&quot;https://pic1.zhimg.com/dcc82dfb23c58cc4cd23714568feb5fc_r.jpg&quot;&amp;amp;gt;

leap motion原理

對於每個手掌,亦可檢測出平移、旋轉(如轉動手腕帶動手掌轉動)、縮放(如手指分開、聚合)的資訊。檢測的數據如全局變換一樣,包括:

  • 旋轉的軸向向量;
  • 旋轉的角度(順時針爲正);
  • 描述旋轉的矩陣;
  • 縮放因子;
  • 平移向量;

    Leap 除了可以檢測手指外,也可以檢測手持的工具。像上文所說的,就是細的、筆直的、比手指長的物件:

    &amp;amp;lt;img src=&quot;https://pic4.zhimg.com/c10d82458234dd878fe3754d74e1bba3_b.jpg&quot; data-rawwidth=&quot;633&quot; data-rawheight=&quot;229&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;633&quot; data-original=&quot;https://pic4.zhimg.com/c10d82458234dd878fe3754d74e1bba3_r.jpg&quot;&amp;amp;gt;

    leap motion原理
    對於手指和工具,會統一地稱爲可指向對象(Pointable Object,抱歉不太會翻譯),每個 Pointable Object 包含了這些資訊:
    • 長度;
    • 寬度;
    • 方向;
    • 指尖位置;
    • 指尖速度;
    方向和指尖位置如下圖:&amp;amp;lt;img src=&quot;https://pic3.zhimg.com/6543d457778c7e98f6a85350367af6ea_b.jpg&quot; data-rawwidth=&quot;517&quot; data-rawheight=&quot;261&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;517&quot; data-original=&quot;https://pic3.zhimg.com/6543d457778c7e98f6a85350367af6ea_r.jpg&quot;&amp;amp;gt;
    leap motion原理

    根據全局的資訊、運動變換,手掌、手指和工具的資訊和變換,開發者就可以靠這些來制作遊戲、程式了。

    參考:

    Leap Motion 的開發者文檔 Leap Motion | Developers

繼續閱讀