2013-08-17 71 views
2

嘗試使用Controller.EnableGesture啓用任何/所有手勢,嘗試從當前幀>手勢(0)或從新的CircleGesture(或任何其他類型)獲取。 總是會得到無效的手勢...... 這裏是代碼,我使用LeapInput靜態類從他們的Unity示例(它所做的就是保存控制器並更新當前幀)。Unity3D中的Leap Motion手勢識別始終返回TYPEINVALID和STATEINVALID

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

P.是的,我在相同的控制器實例中啓用手勢。

回答

1

你有最新的驅動程序嗎? (1.0.7 + 7648截至這篇文章)這是你的代碼在我的處理程序類,它返回圓形手勢就好:

更新代碼(工作)

我沒有注意OP的原始代碼。 .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; 
      } 
     } 
    } 
} 
+0

謝謝,我會盡快檢查驅動程序版本,你檢查你收到的手勢是否有效 - 是否有適當的狀態和類型? – CHarnel

+0

@CHarnel更新和工作,我沒有注意到你調用'手勢(0)'而不是'手勢()[0]' – Jerdak

0

我還要添加一個答案,因爲我遇到了這個問題。看起來你解決了你的特定問題,但我的情況有點不同。我在Gestures數組中沒有收到任何數據。

我發現,除了啓用手勢之外,我還必須回顧框架歷史記錄,以查看在事實之後是否有任何手勢已附加到舊框架。換句話說,controller.Frame()不一定具有與其相關聯的任何手勢數據,而是跳過的幀,或者先前的輪詢幀確實具有手勢數據。因此,像這樣的工作了(不過要記住,你必須做一些長整型鑄造):

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



} 

一旦你找到你所有的跳幀,或你的歷史框架的那些姿勢,做他們如你所願。

+0

你可以用兩個幀frame.Gestures(lastFrame )''。你不必遍歷歷史中的每一幀(除非你真的想)。 –