从leap motion官网的介绍文章leap motion overview中,提取出个人认为有价值的东西,做下笔记,也是分享,希望能给大家带来帮助。原文地址 https://developer./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)等。 跟踪数据列表:
leap motion通过分析当前帧动作与之前帧动作的变化,将动作翻译成平移、旋转、缩放等动作因子。例如双手都向左移动表示平移,双手做转球的动作表示旋转,双手相向移动或远离表示缩放。leap motion根据检测区域内检测到的所有对象的运动转化为动作因子。如果检测到两只手,则同时考虑两只手的动作,也可以通过单个手的实例分别获取每一只手的动作因子。 描述动作的属性包括:
2、手的模型 手模型可以提供位置、特征、动作,以及和手关联的手指、工具等信息。对手的模型leap motion API提供了尽可能多的信息,但并不是每一帧都能完全检测到这些属性。例如握拳时,手指不可见,所以手指的列表就可能为空,编码时要注意到这些情况。 leap motion并不区分左右手,hand列表也可以包含超过2只手,但是超出两只手时会影响跟踪效果。 手的属性包括:
图3 法向量和方向
图4 球心与球半径 手的动作即上面提到的平移,旋转,缩放等,不再赘述。 调用函数hand::finger(),hand::tool(),hand::pointable()可以得到手指和工具的ID。 3、手指和工具的模型 leap motion靠形状识别手状物体,工具指比手更长、更细或者更直的物体(图5)。在leap motion模型中,手指和工具被抽象为pointable对象。其物理属性包括:
图5 工具更长,更细,更直
图6 指尖位置和方向向量 4、手势 leap motion可以识别特定的运动模式,用户可以靠这些手势发令。手势和手指、手等其他运动跟踪数据的传回方式一样,每发现一个手势就向帧中自动添加一个手势对象,可以从帧中的手势列表获取手势对象。 leap motion可以识别的运动模式包括:
程序中,想使用某个手势前,需要调用Controller类中的enableGesture()方法启用该手势的识别。 画圆 可以用手指和工具画圆,手势开始后leap motion会一直更新这个过程直到手势结束,手指或工具离开圆的轨道或动作过慢时视为手势结束。相关API:CircleGesture。
图7 画圆 挥扫 相关API:SwipeGesture。
图8 挥扫 击键 快速的向下敲击被视为一次击键手势。相关API:KeyTapGesture。
图9 击键 触屏 快速向前轻击被视为一次触屏手势,相关API: ScreenTapGesture。
图10 触屏 有些地方翻译的比较生硬。请指教。 |
|
来自: 文清阳 > 《LEAPMOTION》