使用或創建手勢
有兩種方法可以將手勢識別添加到你的unity項目中。第一種:找到KinectManager組件,在例子中它被附在MainCamera上。在組件中有兩個列表的屬性“Player1 Gestures”(來自player 1 的手勢)“Player2 Gestures”(來自player2的手勢)。這兩個列表所帶的手勢,整個游戲運行過程中都可以檢測識別。第二種是以編程的方式去實現用戶特定的手勢。你需要實現KinectGestures.GestureListenerInterface接口來添加手勢或者處理任何指定的手勢。這里有一個例子:KinectScripts/Extras/SimpleGestureListener。簡單的描述如下:
UserDetected()用於啟動手勢檢測;
UserLost()用於清理變量或者占用的資源。你並不需要移除UserDetected()中添加的手勢。這些將會在調用UserLost()前自動清除。
GestureInProgress()在一個手勢開始但是還沒有被結束或者取消時調用。
GestureCompleted()在一個手勢結束時調用。你可以在這里添加自己的代碼來處理手勢
GestureCancelled()手勢被取消時調用
識別手勢
以下手勢能被流暢的識別:
◎RaiseRightHand / RaiseLeftHand – 左手或右手舉起過肩並保持至少一秒
◎Psi –雙手舉起過肩並保持至少一秒
◎Stop – 雙手下垂.
◎Wave –左手或右手舉起來回擺動
◎SwipeLeft – 右手向左揮.
◎SwipeRight – 左手向右揮.
◎SwipeUp / SwipeDown – 左手或者右手向上/下揮
◎ Click – 左手或右手在適當的位置停留至少2.5秒.
◎RightHandCursor / LeftHandCursor – 假手勢,用來使光標隨着手移動
◎ZoomOut – 手肘向下,左右手掌合在一起(求佛的手勢),然后慢慢分開.
◎ZoomIn – 手肘向下,兩手掌相聚至少0.7米,然后慢慢合在一起
◎Wheel –想象一下你雙手握着方向盤,然后左右轉動。
◎Jump –在1.5秒內髖關節中心至少上升10厘米
◎Squat -在1.5秒內髖關節中心至少下降10厘米
◎Push – 在1.5秒內將左手或右手向外推
◎Pull -在1.5秒內將左手或右手向里拉
添加你的手勢
這里提供一下關於在Kinect添加手勢識別的過程,你需要有一點C#的基本知識並且了解一點關於Kinect傳感器的基本工作流程。在Kinect的坐標系統中,它提供的是被追蹤對象的三維坐標,以米為單位。
添加一個用戶自定義的識別手勢,首先你需要打開Assets/KinectScripts/KinectGestures.cs腳本文件,然后:
1、 找到Gestures的枚舉,並在這個枚舉的后面添加上你要定義的手勢的名稱
2、 找到CheckForGesture()函數,這里有一個非常長的switch()語句,每一個Gestures枚舉里的手勢都需要在這里使用case語句進行處理。因此,你需要在這里添加一個case語句來處理你新添加的手勢。
3、 當然,你可以看看RaiseLeftHand, RaiseRightHand, SwipeLeft or SwipeRight這些是如何處理的,作為學習的例子。
4、 如你所見,每一個處理手勢的內部還有一個switch語句來檢測和改變手勢的當前狀態。每個狀態用數字來表示(0,1,2,3…),它的狀態根據GestureData結構體存儲的數據變化而改變。這個數據結構體是為每一個在場景中的需要被識別的手勢創建的。
5、 一個手勢的初始狀態是0,在這個狀態下,程序需要識別這個手勢是否開始。要做到這一點,它需要檢查並存儲關節的位置,通常是左右手。如果一個關節的位置符合某個手勢的開始,那么這個手勢的狀態值就加一。在下一個狀態,它需要檢查這個關節是否達到了預期的位置(或者移動了理想的距離)。這個檢查需要在一定的時間內完成,我們通常設置為1-1.5秒。
6、 如果在設置的時間內這個關節被檢測到達到了預期的位置(或者移動了理想的距離),那么那個手勢就被認為識別成功了;否則,視為手勢被取消,狀態將被置為0,並重新開始。