- 手勢/姿勢識別:
有兩種方法可以為Unity項目添加手勢檢測和手勢識別功能。
1. KinectManager,示例場景中MainCamera的一個組件。
2. 以編程方式指定用戶特定的姿勢。需要實現KinectGestures.GestureListenerInterface。KinectScripts / Extras / SimpleGestureListener.cs腳本中有一段示例。
(沒有這個腳本的下載 用於Unity3D的Kinect Wrapper Package)
已有的Gesture
RaiseRightHand / RaiseLeftHand - 左手或右手在肩膀上抬起,保持不變至少1.0秒。
Psi - 雙手抬起肩膀,保持這個姿勢1.0秒。
Tpose - 雙臂張開,垂直於身體(T形姿勢),持續1.0秒。
Stop - 一只手向下(down),另一只手略微在腰部以下的位置抬起(slightly to the side)。
Wave - 右手向左揮動然后向右揮動,或左手向右揮動然后向左揮動。
SwipeLeft - 右手向左滑動。
SwipeRight - 左手向右滑動。
SwipeUp / SwipeDown - 用左手或右手向上或向下滑動
Click - 左手或右手保持至少2.5秒。與光標控制結合使用很有用。
RightHandCursor / LeftHandCursor - 偽手勢,用於移動右手或左手提供光標。
ZoomOut - 開始時,左手和右手位於前面並在放在一起,然后朝着不同的方向移動。
ZoomIn - 開始時,左手和右手相距至少0.7米並且位於前方,然后雙手互相靠近。
Wheel - 開始時,左手和右手放在與肩寬的地方,並且在身體前面,然后是手開始轉動一個假想中的輪子,向左(正角度)或向右(負角度)。
Jump - 臀部中心在1.5秒內至少比之前高出15厘米。
Squat - 臀部中心在1.5秒內至少比之前低15厘米。
Push - 在1.5秒內用左手或右手向前推。
Pull - 在1.5秒內向后拉用左手或右手往后拉。
第二種方法
UserDetected()用於啟動手勢檢測。
UserLost()用於清除變量或釋放分配的資源。
UserDetected() remove the gestures,不被需要,在調用UserLost()之前,它們會自動刪除。
GestureInProgress() - 繼續,在gesture已經被啟動,但是沒有完成,也沒有被取消時用。
GestureCompleted() 完成后調用。
然后就可以添加自己的代碼,用來處理已完成的gesture。
GestureCancelled() 手勢被取消時使用。
如何添加自己的手勢:
傳感器報告Kinect坐標系中被跟蹤的身體部位的三維坐標,以米為單位。
打開 Assets / KinectScripts / KinectGestures.cs
- 找到 Gestures-enum,在末尾加上你要添加的手勢名稱
- 找到 CheckForGesture()-function,有一個很長的switch(),每個case處理一個手勢的檢測,給你的手勢添加一個case。
- 參考RaiseLeftHand,RaiseRightHand,SwipeLeft或SwipeRight 這些簡單的實例。
- 這個switch用來檢查和改變gesture現在的狀態,狀態存在GestureDate這個結構體中,所以為你的手勢創建一個GestureDate。
- 初始狀態是0。在這個狀態下,代碼才檢測用戶是否在做這個手勢。先檢查關節的位置;如果位置合適,再檢查下一個狀態,是否關節到達所需位置,或與前一個狀態的位置的之間的距離(注意這里是兩種情況,1.與身體其他位置相比較,2.與自己之前的某一個時間點相比較),時間間隔通常假設1~1.5s。
- 如果關節位置符合,則認為手勢完成,此時將狀態重置為0以便下一次檢測。最好參考已有的例子,復制修改一下不容易錯。