使用Leap Motion检测滑动手势方向

10

我正尝试使用JavaScript API和Leap Motion获取滑动手势的方向。我的代码如下:

$(document).ready(function() {
    controller = new Leap.Controller("ws://localhost:6437/");
    listener = new Leap.Listener();

    listener.onFrame = function(controller) {
        var frame = controller.frame();
        var hands = frame.hands();
        var pointables = frame.pointables();

        var gestures = frame.gestures();

        $("#rotationAxis").text(pointables.length);
        $("#gestureDetected").text(gestures[0]);
    }

    controller.addListener(listener);
    controller.enableGesture("swipe", true);
    listener.onConnect = function(controller) {
        // calibrate = new Leap.Calibrate(controller);
        // calibrate.onComplete = function(screen){
        // }
    }
});

我可以从数组中获取当前手势,但无法获取类型或方向。有任何想法吗?

谢谢。

5个回答

12

如果你在意方向,无论是左右上下,你可以比较Swipe方向向量的水平和垂直坐标的绝对值来判断Swipe是更偏向于垂直还是水平(然后将相关坐标与零进行比较,以确定Swipe是向右、向左、向上还是向下):

// Setup Leap loop with frame callback function
var controllerOptions = {enableGestures: true};

Leap.loop(controllerOptions, function(frame) {

  if (frame.gestures.length > 0) {
    for (var i = 0; i < frame.gestures.length; i++) {
      var gesture = frame.gestures[i];

      if (gesture.type == "swipe") {
          //Classify swipe as either horizontal or vertical
          var isHorizontal = Math.abs(gesture.direction[0]) > Math.abs(gesture.direction[1]);
          //Classify as right-left or up-down
          if(isHorizontal){
              if(gesture.direction[0] > 0){
                  swipeDirection = "right";
              } else {
                  swipeDirection = "left";
              }
          } else { //vertical
              if(gesture.direction[1] > 0){
                  swipeDirection = "up";
              } else {
                  swipeDirection = "down";
              }                  
          }
       }
     }
  }

})

通过稍微复杂的比较,您还可以将轻扫分类为向前或向后。


到目前为止,这是最完整的例子。谢谢 :) 我讨厌人们不将答案标记为正确... - thgie

2

使用 enableGestures: true,并且定义变量 gesture = frame.gestures[i];

     // detect swipe   
        if (gesture.direction[0] > gesture.direction[2]) {
         console.log('swipe left')
        }

这是我自己做的,说实话我不记得是左还是右了,但这不是一个漫长的排除过程。


0
在快速分析后,我找到了你所寻找的信息:
var gestureType = frame.gestures[0].type;

if (gestureType === "swipe")
{
    if (frame.gestures[0].direction[0] > 0)
        console.log(">>> swipe >>>");
    else
        console.log("<<< swipe <<<");
}

我在使用 var gestureType = frame.gestures[0].type; 时遇到了 "Uncaught TypeError: Cannot read property 'type' of undefined" 错误。抱歉,之前没有在问题中提及。 - mrEmpty

0

当有一个手势时,框架对象才具有手势。一个框架可以不包含手、手指或手势。您需要检查是否存在手势,然后获取所需的信息。

var frame = controller.frame();
if (frame.gestures.length > 0)
{
  for (var i = 0; i < frame.gestures.length; i++)
  {
   var gesture = frame.gestures[i];
   var type = gesture.type;
   var direction = gesture.direction;
  }
}

0

这是一个对我来说完美运行的代码示例:

var controller = new Leap.Controller({enableGestures: true});

controller.on('gesture', function (gesture){
    console.log(gesture);
    if(gesture.type === 'swipe'){
        handleSwipe(gesture);
    }
});

function handleSwipe (swipe){
    var startFrameID;
    if(swipe.state === 'stop'){
        if (swipe.direction[0] > 0){
            //this means that the swipe is to the right direction
            moveRight();
        }else{
            //this means that the swipe is to the left direction
            moveLeft();
        }
    }
}

controller.connect();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接