Kinect for Unity3D開發 之 手勢/姿勢(Gesture)識別基礎知識
- 手勢/姿勢識別:
有兩種方法可以為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以便下一次檢測。最好參考已有的例子,複製修改一下不容易錯。