Обнаружение направления жеста смахивания с помощью Leap Motion

Я пытаюсь просто получить направление жеста смахивания с помощью Leap Motion, используя API javascript. Мой код:

$(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){
        // }
    }
});

Я могу получить текущий жест из массива, но не могу получить тип или направление. Есть идеи?

Спасибо.


person mrEmpty    schedule 02.08.2013    source источник


Ответы (5)


Если вам нужны значения вправо, влево, вверх или вниз, вы можете сравнить абсолютное значение горизонтальных и вертикальных координат вектора направления смахивания, чтобы увидеть, является ли смахивание более вертикальным или более горизонтальным (а затем сравнить соответствующую координату с нулем). чтобы увидеть, движется ли свайп вправо или влево, вверх или вниз):

// 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";
              }                  
          }
       }
     }
  }

})

С немного более сложным сравнением вы также можете классифицировать свайпы как вперед или назад.

person Charles Ward    schedule 25.10.2013
comment
Пока самый полный пример. Спасибо :) Я ненавижу, когда люди не отмечают ответ как правильный… - person thgie; 07.01.2014

с enableGestures: true и жест var = frame.gestures[i];

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

вот как я это сделал сам, tbh я не могу вспомнить, если это лево или право, но это не долгий процесс elmination

person devolved    schedule 11.08.2013

После быстрого анализа я нашел информацию, которую вы ищете:

var gestureType = frame.gestures[0].type;

if (gestureType === "swipe")
{
    if (frame.gestures[0].direction[0] > 0)
        console.log(">>> swipe >>>");
    else
        console.log("<<< swipe <<<");
}
person Sga    schedule 02.08.2013
comment
Я получаю сообщение об ошибке Uncaught TypeError: Не удается прочитать тип свойства undefined в vargestureType = frame.gestures[0].type; Извините, должен был отметить это в моем вопросе. - person mrEmpty; 02.08.2013

Объект кадра имеет жест только тогда, когда он есть. Кадр может содержать 0 рук, 0 пальцев или 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;
  }
}
person Marcassin    schedule 02.08.2013

вот пример кода, который отлично работает для меня:

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();
person abisib    schedule 17.08.2013