Leap motion的类
Leap motion 硬件与你的程序交流中类 Controller 是使用最多的,也是最重要。
- Leap::controller
- Leap::Listener(包含许多回调函数用于响应controller)
- Leap::Gesture
- Leap::Frame & Pointable
- Vector(计算角度以及其他)
Leap::controller
- controller类中包含许多成员函数,用于传送 Leap motion 所采集的信息。
controller的成员函数,controller的成员函数可以传递手势信息
- controller.addListener( listener )
函数的作用就是在调用listener的成员函数(也是回调函数,执行成员函数的内容)。
它等价于:
Listener listener;
Controller leapController = Controller(listener);
//都是在执行listener的成员函数。 - controller.frame()
frame()函数里边有
- controller.addListener( listener )
Leap::Listener
Listener包含许多回调函数,可以用来处理controller所检测到的信息。
Listener包含的函数:
函数名(常用的) | 何时调用 |
---|---|
onConnect | 硬件成功连接并且在软件上创建了类controller |
onDisconnect | 没有成功连接或者Leap motion Service没有运行 |
onFocusGained | 硬件开始工作 |
onFocusLost | 硬件不工作了 |
onFrame(最重要的) | 你的硬件检测到手势,这样你就可以使用函数controller.frame()和其它函数了。 |
Leap::Gesture
- 手势识别首先需要调用这四个函数:
controller.enableGesture(Gesture::TYPE_CIRCLE); //画圈手势
controller.enableGesture(Gesture::TYPE_SWIPE); //滑动手势
controller.enableGesture(Gesture::TYPE_KEY_TAP); //手指点一下
controller.enableGesture(Gesture::TYPE_SCREEN_TAP); //点屏幕
这四个函数允许进行手势识别。
- Gesture.duration()/Gesture.durationSeconds(),这两个函数可以检测手势持续的时间。
- 手势识别函数:
首先需要实例化一个Gesture的对象gesture:
const Gesture gesture = frame.gestures()[0];
然后调用函数:
gesture.type()
再使用选择语句:
switch (gesture.type()) {
case Leap::Gesture::TYPE_CIRCLE:
std::cout<<"TYPE_CIRCLE"<<endl;
//Handle circle gestures
break;
case Leap::Gesture::TYPE_KEY_TAP:
//Handle key tap gestures
std::cout<<"TYPE_KEY_TAP"<<endl;
break;
case Leap::Gesture::TYPE_SCREEN_TAP:
//Handle screen tap gestures
std::cout<<"TYPE_SCREEN_TAP"<<endl;
break;
case Leap::Gesture::TYPE_SWIPE:
//Handle swipe gestures
std::cout<<"TYPE_SWIPE"<<endl;
break;
default:
//Handle unrecognized gestures
break;
}
这样就实现了手势的识别,如果需要对检测到某个手势后进行操作,只需要在case里边添加需要执行的内容即可。
Leap::Frame & Pointable
- 获取手指(指尖)的坐标:
frame.pointables()包含手指的一些信息,例如指尖的坐标,运动的方向,运动的速度,手掌的面积,宽度,长度等。
(1)实例化pointable对象
Leap::Pointable pointable = frame.hands()[0].pointables()[i];
//i是指检测到手掌自大拇指开始向右的第i跟手指,i从0开始。
当然也可以用其他的方法去获取手指的数据:
Leap::Finger farLeft = frame.fingers().leftmost();
//从最左边开始计数
Leap::Tool rightTool = frame.tools().rightmost();
//从最右边开始计数
Leap::Finger mostForwardOnHand = frame.hands()[0].fingers().frontmost();
//
Vector(计算角度以及其他)
- 使用angleTo()计算角度,计算两个矢量的夹角可以用以下代码实现:
angle =Vector::xAxis().angleTo(Vector::zAxis())*RAD_TO_DEG;
//这个是计算x-z轴的夹角,把这两个矢量换成你所需要计算的即可计算夹角。
- 使用pitch,yaw,roll获取角度,获取手掌向量V与x,y,z轴的角度。
pitch = hand.direction().pitch()*RAD_TO_DEG;
yaw = hand.direction().yaw()*RAD_TO_DEG;
roll = hand.direction().roll()*RAD_TO_DEG;
(Leap motion的坐标系的x轴为Leap motion长的方向(亮灯处为正方向),y轴的正向指向天空,z轴的正方向指向使用者(也是灯指向使用者的方向))
pitch是V映射到y-z平面上的分量与-z轴的夹角。
yaw是V映射到x-z平面上的分量与-z轴的夹角。
roll是V映射到x-y平面上的分量与+y轴的夹角。
- 手掌的旋转角度
首先规定一下手掌顺时针旋转为正,反之为负。
代码实现:
normal=Vector::xAxis().angleTo(hand.palmNormal())*RAD_TO_DEG-90;
//hand.palmNormal()是垂直于手掌的向量,方向向下。