Распознавание жестов 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--;
}
}
Когда вы найдете эти жесты во всех пропущенных кадрах или исторических кадрах, делайте с ними, как хотите.