2013-12-09 27 views
7

Leap Motion API仅支持四种标准手势:圆形,轻扫,按键和屏幕分接。在我的应用程序中,我需要其他手势,但我不知道如何添加手势,或者甚至可以添加更多手势。我阅读了API,这没有帮助。如何实现非标准的Leap Motion手势?

在我的应用程序中,我想允许用户保存一个对象并将其拖动。这可以使用Leap Motion API吗?如果是这样,我该怎么做?

+0

第一:你用什么语言开发?你必须准确研究你手势的x/y/z轴,并分析它们。 – Larme

+0

Larme说,你需要提供更多的信息给我们来帮助你。您使用哪种Leap Motion API(JS,Objective-C等)?你如何让人们握住这个物体(手指,抓握手)?另外,你应该阅读你提供的文本,而不是试图通过粘贴到你的问题来游戏系统。 –

+0

好的,我重写了你的问题,并在最后清除了垃圾。它仍然有点宽泛,但它更接近于负责任。不过,它仍然有助于获得更多的细节。 –

回答

8

您需要创建自己的方法来识别手势的起点,过程和终点。

开始点: 您的程序如何识别您正在尝试持有的东西?我能想到的一个简单的手势是2个手指与1个手掌相连。因此,在框架中,如果您看到两个手指与一个手掌相连并且手指距离相距10-20 mm,则您可以将其识别为一种握住某物的手势。当这些条件满足时,程序将识别该手势,并且可以在这些条件内编写一些代码。

对于一个非常难看例如在C#:

起点: 布尔gesture_detected = FALSE;

Frame frame = controller.Frame(); 
HandList hands = controller.Hands; 

if (hands.Count == 1) 
{ 
    foreach (Hand hand in hands) 
    { 
     if (hand.fingers.Count == 2) 
     { 
      int fingerA_x,fingerB_x; 
      foreach (Finger finger in hand.fingers) 
      { 
       if(fingerA_x == 0) 
       { 
        fingerA_x = finger.x; 
       } else 
       { 
        fingerB_x = finger.x; 
       } 
      } 
     } 
    } 

    if((fingerA_x - fingerB_x) < 20) 
    { 
     //Gesture is detected. Do something... 
     gesture_detected = true; 
    } 
} 

过程: 你的手势试图做什么?如果你想移动,你将不得不调用鼠标方法来进行拖动。使用事件MOUSEEVENTF_LEFTDOWN在PInvoke下的C++中搜索mouse_event()方法。

终点: 您完成拖动后,你需要调用像MOUSEEVENTF_LEFTUP鼠标事件的方法来模拟已完成鼠标拖动。但是,您的程序如何检测何时应该停止拖动?最合乎逻辑的方式是如果手势不再在帧中被检测到。所以编写一个条件来处理备用方案。

 if (!gesture_detected) 
     { 
      // Do something 
     } 
0

有没有在某个时间点怀疑自己,如果有必要,以定义自定义类与其他的API来获得一些大跃进运动CLASSE(S),原来你没有。下面是C++中的一个简短例子,即Leap Motion本地语言,自定义手势定义,Lift手势,将空中的所有运动物体提升到空中。

手势定义需要2个可见的手,两个手掌均向上打开并向上移动速度低于预定义的(当前不推荐的)Leap Motion轻扫手势,因此在滑动在Leap Motion回调函数void GestureListener::onConnect(const Leap::Controller& controller)的启动过程中启用了手势。

从示例中可以看出,手势定义对双手的法线和速度施加了约束,因此它不会随机检测到,但也不会太多,所以仍然可以在合理的努力下执行。

// lift gesture: 2 hands open flat, both palms up and moving up slowly 
void LeapMotion::liftGesture(int numberHands, std::vector<glm::vec3> palmNormals, std::vector<glm::vec3> palmVelocities) { 

    if ((numberHands == 2) && 
     (palmNormals[0].x < 0.4f) && (palmNormals[1].x < 0.4f) && 
     (palmNormals[0].y > 0.9f) && (palmNormals[1].y > 0.9f) && 
     (palmNormals[0].z < 0.4f) && (palmNormals[1].z < 0.4f) && 
     (palmVelocities[0].z > 50.0f) && (palmVelocities[1].z > 50.0f) && 
     (palmVelocities[0].z < 300.0f) && (palmVelocities[1].z < 300.0f)) { 

     m_gesture = LIFT; 
     logFileStderr(VERBOSE, "\nLift gesture...\n"); 
    } 
} 
相关问题