1. 程式人生 > >Kinect for Unity3D開發 之 手勢/姿勢(Gesture)識別基礎知識

Kinect for Unity3D開發 之 手勢/姿勢(Gesture)識別基礎知識

  1. 手勢/姿勢識別:

有兩種方法可以為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

  1. 找到 Gestures-enum,在末尾加上你要新增的手勢名稱
  2. 找到 CheckForGesture()-function,有一個很長的switch(),每個case處理一個手勢的檢測,給你的手勢新增一個case。
  3. 參考RaiseLeftHand,RaiseRightHand,SwipeLeft或SwipeRight 這些簡單的例項。
  4. 這個switch用來檢查和改變gesture現在的狀態,狀態存在GestureDate這個結構體中,所以為你的手勢建立一個GestureDate。
  5. 初始狀態是0。在這個狀態下,程式碼才檢測使用者是否在做這個手勢。先檢查關節的位置;如果位置合適,再檢查下一個狀態,是否關節到達所需位置,或與前一個狀態的位置的之間的距離(注意這裡是兩種情況,1.與身體其他位置相比較,2.與自己之前的某一個時間點相比較),時間間隔通常假設1~1.5s。
  6. 如果關節位置符合,則認為手勢完成,此時將狀態重置為0以便下一次檢測。最好參考已有的例子,複製修改一下不容易錯。