Kinect v1-Win7 Unity

標準

kinect v1で動作確認→kinect v2へ応用、ということを考えて(v1は自宅置き)、v1で動かす方法をあれこれ思い出していました。

ひとつは、こちらでblog記事にした、Unity Wrapperを使う方法。playbackフォルダにモーションを保存でき、それを再生も出来るのですが、どうやって、汎用モーションの形にするのかがわからず、中座。

もうひとつは、Kinect with MS-SDK(スクリプト/アバターシステム RF Solutions)。kinect v2用のKinect Mocap Animator(10$)が出ているためか、こちらのバージョンは無料になって提供されています。

https://www.assetstore.unity3d.com/jp/#!/content/7747

Unity アセットストアにあるので、そのままインポートしてきます。

=====
<Kinect Gestureの使い方> 引用

2つの方法あり。

1.Main Cameraについている、KinectManagerを見てほしい。

There are two lists – “Player1 Gestures” (these are the gestures expected from player 1) and “Player2 Gestures” (expected from player 2).

The gestures in these lists will be detected during the entire game.

2.もうひとつは、KinectGestures.GestureListenerInterfaceを使ってコーディングする方法である。

For an example look at the KinectScripts/Extras/SimpleGestureListener.cs-script. Here is a short description of its methods:リスナースクリプトの例を載せてある。

UserDetected() can be used to start gesture detection programmatically.

UserLost() can be used to clear variables or to free the allocated resources. You don’t need to remove the gestures added by UserDetected()-method explicitly. They are removed automatically, before the invocation of UserLost().

GestureInProgress()-method is invoked when a gesture is started, but not yet completed or cancelled.

GestureCompleted() is invoked when the gesture is completed. You can add your own code there to handle the completed gestures.

GestureCancelled() is invoked, if the gesture is cancelled.

3.登録されているジェスチャーについて

①右手をあげる/左手をあげる RaiseRightHand / RaiseLeftHand – left or right hand is raised over the shoulder and stays so for at least 1.0 second.
②サイポーズ Psi – both hands are raised over the shoulder and the user stays in this pose for 1.0 seconds.
③Tポーズ Tpose – the hands are to the sides, perpendicular to the body (T-pose), for 1.0 seconds.
④ストップジェスチャー Stop – right hand is down and left hand is slightly to the side, but below the waist, or left hand is down and right hand is slightly to the side, but below the waist.右手または左手を手首位置より下で少し横に振る
⑤波 Wave – right hand is waved left and then back right, or left hand is waved right and then back left. 右手なら、左にウェーブしてから右に戻す。左手ならその逆。
⑥スワイプレフト SwipeLeft – right hand swipes left.右手を右から左にスワイプする
⑦スワイプライト SwipeRight – left hand swipes right.左手を右にスワイプする
⑧スワイプアップ/スワイプダウン SwipeUp / SwipeDown – swipe up or down with left or right hand
⑨クリック Click – left or right hand stays in place for at least 2.5s. Useful in combination with cursor control.右手または左手をその場所に少なくとも2.5秒止める。
⑩右手カーソルまたは左手カーソル RightHandCursor / LeftHandCursor – pseudo gesture, used to provide cursor movement with the right or left hand.
⑪ズームアウト ZoomOut – left and right hands are to the front and put together at the beginning, then the hands move in different directions.両手を自分の前であわせ、横に開く
⑫ズームイン ZoomIn – left and right hands are at least 0.7 meter apart and to the front at the beginning, then the hands get closer to each other. 70cmぐらい離した両手を自分の前で近づけること
⑬ホィール Wheel – left and right hands are shoulder size apart and to the front at the beginning, then the hands start to turn an imaginary wheel left (positive angle) or right (negative angle).肩幅に離した両手を前に出し、ホィールを回すように右回転させるか左回転させる
⑭ジャンプ Jump – the hip center gets at least 15cm above its last position within 1.5 seconds. 腰が少なくとも1.5秒以内に15cm以上浮くこと
⑮スクワット Squat – the hip center gets at least 15cm below its last position within 1.5 seconds 1.5秒以内に、腰が15cm以上沈むこと
⑯プッシュ Push – push forward with left or right hand within 1.5 seconds 1.5秒以内に右手または左手を前に押し出すこと
⑰プル Pull – pull backward with left or right hand within 1.5 seconds 右手または左手を1.5秒以内に後ろに引くこと

4.オリジナルジェスチャーの加え方

Here are some hints on how to add your own gestures to the Kinect gesture-detection procedure. You need some C# coding skills and a bit of basic understanding on how the sensor works. It reports the 3d-coordnates of the tracked body parts in the Kinect coordinate system, in meters.
To add detection of custom gesture, open Assets/KinectScripts/KinectGestures.cs. Then:
1. Find the Gestures-enum. First you need to add the name of your gesture at the end of this enum.
2. Find the CheckForGesture()-function. There is a long switch() there, and its cases process the detection of each gesture, defined in the Gestures-enum. You need to add a case for your gesture at the end of this switch(), near the end of the script. There you will implement the gesture detection.
3. For an example on how to do that, look at the processing of some simple gestures, like RaiseLeftHand, RaiseRightHand, SwipeLeft or SwipeRight.
4. As you see, each gesture has its own internal switch() to check and change the gesture’s current state. Each gesture is like a state machine with numerical states (0, 1, 2, 3…). Its current state along with other data, is stored in an internal structure of type GestureData. This data-structure is created for each gesture that needs to be detected in the scene.
5. The initial state of each gesture is 0. At this state, the code needs to detect if the gesture is starting or not. To do this, it checks and stores the position of a joint, usually the left or right hand. If the joint position is suitable for a gesture start, it increments the state. At the next state, it checks if the joint has reached the needed position (or distance from the previous position), usually within a time interval, let’s say within 1.0 – 1.5 seconds.
6. If the joint has reached its target position (or distance) within the time interval, the gesture is considered completed. Otherwise – it is considered cancelled. Then, the gesture state may be reset back to 0 and the gesture-detection procedure will start again.
To add detection of your own gestures, first try to understand how relatively simple gestures, like RaiseHand or Swipes, work. Then find a gesture similar to the one you need. Copy and modify its code to fit your needs. Hope this helps for a start 😉

Support, Examples and Feedback
E-mail: rumen.filkov@gmail.com; Web: http://rfilkov.com Skype: roumenf Twitter: roumenf

 

広告

コメントは受け付けていません。