【LeapMotion】LeapMotion学习笔记
Author:Solare @BUAA SCSE 2012
一、前言
最近在学习LeapMotion开发,现将学习过程保存在这里,方便查找和复习,最终整理成一份成型资料,作为BUAA SCSE资料保存。
二、LeapMotion介绍
Leap Motion是一个体感控制器,由Leap公司生产。售价约人民币500元。(leap:跳; motion:动作;移动;手势)
Leap Motion体感控制器(以下简称LM)支持Windows 7,Windows 8.x以及Mac OS X 10.7以上版本操作系统。
三、LM体感的原理
(以下资料大部分来自知乎)
大体上,LM根据内置的两个摄像头从不同角度捕捉的画面,重建出手掌在真实世界三维空间的运动信息,检测的范围大体在传感器上方25mm到600mm之间。检测的空间是一个倒四棱锥体。
首先,LM传感器建立一个直角坐标系,坐标的原点是传感器的中心,坐标的X轴平行于传感器,指向屏幕右方。Y轴指向上方。Z轴指向背离屏幕的方向。单位为真实世界的毫米。
使用过程中,LM定期发送关于手的运动信息,这样的信息称为“帧”。每一个帧包含检测到的:
- 所有手掌的列表及信息;
- 所有手指的列表及信息;
- 手持工具(细的,笔直的,比手指长的东西,如一支笔)的列表及信息;
- 所有可指向对象(Pointable对象)的列表及信息。
LM会给这些目标分配一个唯一的标识(ID),在手掌、手指、工具保持在视野范围内时,是不会改变的。根据这些ID,可以通过Frame::hand();,Frame::finger()等函数来查询每个运动对象的信息。
LM可以根据每帧和前一帧检测到的数据生成运动信息。例如,若检测到两只手,而且两只手都朝一个方向移动,就认为是平移。如果是握着手像球一样转动,则记为旋转。若两只手靠近或分开,则记为缩放。所生成的数据包含:
- 旋转的轴向向量;
- 旋转的角度(顺时针为正);
- 描述旋转的矩阵(--);
- 缩放因子;
- 平移向量;
对于每只手,可以检测到如下信息:
- 手掌中心的位置(三维向量,相对于传感器坐标原点,单位是毫米);
- 手掌移动的速度(毫米每秒);
- 手掌的法向量(垂直于手掌平面,从手心指向外);
- 手掌朝向的方向;
- 根据手掌弯曲的弧度确定的虚拟球体的中心;
- 根据手掌弯曲的弧度确定的虚拟球体的半径;
对于手指和工具,统一的称为Pointable对象,每个对象包含以下信息:
- 长度;
- 宽度;
- 方向;
- 指尖位置;
- 指尖速度;
根据全局信息,运动变换,手掌、手指和工具的信息和交换,开发者可以靠这些来制作游戏和程序了。