Распознавание жестов Leap Motion в Unity3D всегда возвращает TYPEINVALID и STATEINVALID

Попытался включить любые/все жесты с помощью Controller.EnableGesture, попытался получить из текущего кадра> жест (0) или из нового CircleGesture (или любого другого типа). Всегда получаю недопустимые жесты... Вот код, я использую статический класс LeapInput из их примера Unity (все, что он делает, это сохраняет контроллер и обновляет текущий кадр).

 void Update()
    {
        LeapInput.Update();
        Frame thisFrame = LeapInput.Frame;
        for (int i = 0; i < thisFrame.Gestures().Count; i++)
            {
                Gesture gesture = thisFrame.Gesture(i);
            }
    }

P.S. да, я включаю жесты в том же экземпляре контроллера.


person CHarnel    schedule 17.08.2013    source источник


Ответы (2)


У вас самые свежие драйвера? (1.0.7+7648 на момент публикации) Вот ваш код в моем классе обработчика, он отлично возвращает круговой жест:

Обновлен код (работает).

Я не обращал внимания на исходный код ОП. .gestures(0) не будет работать, просто измените на .gestures[0], см. пример ниже.

using UnityEngine;
using System.Collections;
using Leap;

public class LeapTest : Leap.Listener {
    public Leap.Controller Controller;

    // Use this for initialization
    public void Start () {
        Controller = new Leap.Controller(this);
        Debug.Log("Leap start");
    }

    public override void OnConnect(Controller controller){
        Debug.Log("Leap Connected");
        controller.EnableGesture(Gesture.GestureType.TYPECIRCLE,true);
    }

    public override void OnFrame(Controller controller)
    {
        Frame frame = controller.Frame();
        GestureList gestures = frame.Gestures();
        for (int i = 0; i < gestures.Count; i++)
        {
            Gesture gesture = gestures[0];
            switch(gesture.Type){
                case Gesture.GestureType.TYPECIRCLE:
                    Debug.Log("Circle");
                    break;
                default:
                    Debug.Log("Bad gesture type");
                    break;
            }
        }
    }
}
person Jerdak    schedule 17.08.2013
comment
Спасибо, я проверю версию драйвера как можно скорее. Вы проверяли, действителен ли жест, который вы получаете, - имеет ли он правильное состояние и тип? - person CHarnel; 18.08.2013
comment
@CHarnel Обновлено и работает, я не заметил, что вы звонили gestures(0) вместо gestures()[0] - person Jerdak; 18.08.2013

Я также собираюсь добавить ответ, так как у меня возникли трудности с этим. Похоже, вы решили свою конкретную проблему, но моя была немного другой. Я вообще не получал никаких данных в массивах жестов.

Я обнаружил, что в дополнение к включению жестов мне также приходилось просматривать историю кадров, чтобы увидеть, были ли какие-либо жесты прикреплены к старым кадрам постфактум. Другими словами, controller.Frame() не обязательно имеет какие-либо данные о жестах, связанные с ним, но пропускает кадры, или в предыдущем опрашиваемом кадре действительно были данные о жестах. Итак, получилось что-то вроде этого (хотя имейте в виду, что вам придется выполнить приведение типов long-int):

Frame lastFrame;
Frame thisFrame;

void Update()
{
    LeapInput.Update();
    lastFrame = thisFrame;
    thisFrame = LeapInput.Frame;

    long difference = thisFrame.Id - lastFrame.Id;

    while(difference > 0){
      Frame f = controller.Frame(difference);
      GestureList gestures = f.Gestures();
      if(gestures.Count > 0){
        foreach(Gesture gesture in gestures){
          Debug.Log(gesture.Type + " found in frame " + f.Id);
        }
      }
      difference--;
    }



}

Как только вы найдете эти жесты во всех ваших пропущенных кадрах или в ваших исторических кадрах, делайте с ними, что хотите.

person scriptocalypse    schedule 18.08.2013
comment
Вы можете получить все жесты между двумя кадрами с помощью frame.Gestures(lastFrame). Вам не нужно перебирать каждый кадр в истории (если вы действительно этого не хотите). - person Charles Ward; 11.06.2014