天天看点

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

继续阅读