从leap motion官网的介绍文章leap motion overview中,提取出个人认为有价值的东西,做下笔记,也是分享,希望能给大家带来帮助。原文地址
https://developer.leapmotion.com/documentation/Languages/C++/Guides/Leap_Overview.html
一、坐标系统
leap motion系统使用右手笛卡尔坐标系(图1)。什么是右手坐标系呢?就是右手四指从X轴正向向Y轴正向握拳,拇指方向就是Z轴正向(图2)。记录单位为毫米,原点在设备中心。X,Z轴水平,Y轴竖直。远离屏幕Z值增大,向上Y值增大,需注意放置方向。
图一 leap motion 坐标系
图二 右手坐标系
二、动作跟踪数据
leap motion可以跟踪手,手指,和一些小工具,并以帧的形式更新跟踪数据。每一帧包括跟踪对象的列表,和描述对象动作的特征。每检测到一个对象leap motion就自动给它分配一个唯一的ID,直到对象移动出检测区域,重新进入检测区域的对象会重新分配ID。
1、帧的结构
每一个帧的实例都包括跟踪数据,手势和动作因子(factor)等。
跟踪数据列表:
- hands手。包括所有可以检测到的
- fingers手指。所有的
- tools工具。所有的
- pointables。具有指向性的物体,包括所有的手指和工具
- gestures手势。包括以上所有对象的动作
leap motion通过分析当前帧动作与之前帧动作的变化,将动作翻译成平移、旋转、缩放等动作因子。例如双手都向左移动表示平移,双手做转球的动作表示旋转,双手相向移动或远离表示缩放。leap motion根据检测区域内检测到的所有对象的运动转化为动作因子。如果检测到两只手,则同时考虑两只手的动作,也可以通过单个手的实例分别获取每一只手的动作因子。
描述动作的属性包括:
- rotation axis旋转轴
- rotation angle旋转角度
- rotation matrix旋转矩阵
- scale factor缩放系数
- translation平移向量
2、手的模型
手模型可以提供位置、特征、动作,以及和手关联的手指、工具等信息。对手的模型leap motion API提供了尽可能多的信息,但并不是每一帧都能完全检测到这些属性。例如握拳时,手指不可见,所以手指的列表就可能为空,编码时要注意到这些情况。
leap motion并不区分左右手,hand列表也可以包含超过2只手,但是超出两只手时会影响跟踪效果。
手的属性包括:
- palm position手掌位置,手掌中心位置距leap motion原点的距离,单位毫米
- palm velocity手掌速度,单位mm/s
- palm normal手掌法向量,由掌心向下指向外部,图3
- direction方向,掌心指向手指的向量,图3
- sphere center球心,根据手的曲线拟合出的球的球心,图4
- sphere radius球半径,拟合球的半径,图4
图3 法向量和方向
图4 球心与球半径
手的动作即上面提到的平移,旋转,缩放等,不再赘述。
调用函数hand::finger(),hand::tool(),hand::pointable()可以得到手指和工具的ID。
3、手指和工具的模型
leap motion靠形状识别手状物体,工具指比手更长、更细或者更直的物体(图5)。在leap motion模型中,手指和工具被抽象为pointable对象。其物理属性包括:
- length长度。可见部分长度
- width宽度。可见部分平均宽度
- direction方向。物体的单位向量,例如从指根到指尖,图6
- tip position指尖的位置。指尖相对leap motion原点的位置,单位mm
- tip velocity指尖的速度。单位mm/s
图5 工具更长,更细,更直
图6 指尖位置和方向向量
4、手势
leap motion可以识别特定的运动模式,用户可以靠这些手势发令。手势和手指、手等其他运动跟踪数据的传回方式一样,每发现一个手势就向帧中自动添加一个手势对象,可以从帧中的手势列表获取手势对象。
leap motion可以识别的运动模式包括:
- circle画圆,一根手指画一个圆
- swipe挥扫,手的线性运动
- key tap击键,敲键盘一样的轻击
- screen tap触屏,触摸垂直屏幕一样的轻击
程序中,想使用某个手势前,需要调用Controller类中的enableGesture()方法启用该手势的识别。
画圆
可以用手指和工具画圆,手势开始后leap motion会一直更新这个过程直到手势结束,手指或工具离开圆的轨道或动作过慢时视为手势结束。相关API:CircleGesture。
图7 画圆
挥扫
相关API:SwipeGesture。
图8 挥扫
击键
快速的向下敲击被视为一次击键手势。相关API:KeyTapGesture。
图9 击键
触屏
快速向前轻击被视为一次触屏手势,相关API: ScreenTapGesture。
图10 触屏
有些地方翻译的比较生硬。请指教。