Распознавание жестов 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);
            }
    }

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

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

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

Я обнаружил, что в дополнение к включению жестов мне также пришлось оглянуться назад в истории фреймов, чтобы увидеть, были ли какие-либо жесты прикреплены к старым фреймам после этого. Другими словами, 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--;
    }



}

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

Другие вопросы по тегам