第 3 章アプリケーションの開発 があります。 「 Leap::SwipeGesture クラス」固有のバラメータ 固有のパラメータは、「 Leap::SwipeGesture クラス」で表わされ、次のパラメー タ startPosition position d irect ion speed po i ntable 刑」 Vector Vector Vector float 意味 スワイプ・ジェスチャーの開始位置 スワイプ・ジェスチャーの現在位置 スワイプ・ジェスチャーの方向べクトル スワイプ・ジェスチャーの速度 ( mm / 秒 ) Pointable ジェスチャーをしている指 「スワイプ・ジェスチャー」の変更可能な検出設定は、次の値です。 「スワイプ・ジェスチャー」の設定 型 . Gesture. Swipe. MinVelocity float Gesture. Swipe. MinLength float デフォルトの値単位 意味 1 50 1000 mm 検出する最小の長さ mm/ 秒検出する最小の速度 それでは実際に「スワイプ・ジェスチャー」を検出し、目に見えるようにしてみましよう。 ・変数の追加と変更 先ほど「 std::list く Leap::Gesture> 」で定義した、ジェスチャーを保持する「 befo reGestureList 」のリストの型を「 Leap::SwipeGesture 」に変更します。 これで「スワイプ・ジェスチャー」を扱えるようにします。 またパラメータを動的に変更できるように、「 Cinder 」が提供するパラメータ変更 のためのクラスである「 params::InterfaceGl 」を定義します。 パラメータの値として「 minLenagth 」と「 minVeIocity 」も合わせて定義しておき ます。 なお、「 params::InterfaceGl 」を利用するには「 cinder/params/Params. h 」を インクルードします。 126
3-9 [ 3-9 ] ジェスチャーを検出する ジェスチャ - を検出する ここでは、「ジェスチャー」の認識について解説します。 「 Leap Motion 」では、次の 4 つのジェスチャーを認識できます。 ・スクリーンタップ ・キータップ ・サークル ・スワイプ 図 3-23 「 Leap Motion 」が認識できるジェスチャー 117 ②「サークル」は、「 CircleGesture クラス」で表現され、指の円の動きを表わします。 認識ができます。 ほかの SDK のように個別のジェスチャーとしての認識はしませんが、より細かい 分で算出します。 「スワイプ」の方向の判別は、「 SwipeGesture クラス」の「 durection() 」から自 きを表わします。 ①「スワイプ」は、「 SwipeGesture クラス」で表現され、前後左右上下の指の動
[ 3-9 ] ジェスチャーを検出する たとえば「サークル・ジェスチャー」には MinRadius ( 認識する最小の半径 ) と MinArc ( 認識する最小の角度 ) があります。 それぞれデフォルト値が「 5.0mm と」「 1.5 ' pi ラジアン」ですが、これを変更する と次のようになります。 これによって、より大きな円を描かないとサークル・ジェスチャーとして認識しない ようになります。 なお、パラメータは「 Leap::Config::setXXXX() 」で変更しますが、「 Leap::Conf ig::save() 」を呼び出さないと、変更が反映されないことに注意してください。 ・サークル・ジェスチャーのバラメータの取得 mLeap.config() .save() ; mLeap . config() .setFloat("Gesture . Ci rcle . MinArc" mLeap. config() . setFloat("Gesture . circle . MinRadius", 10 . 0 ) ; ・サークル・ジェスチャーのバラメータの変更 スワイプ・ジェスチャー minArc = mLeap. config() . getFloat( "Gesture.Circle.MinArc" ) ; minRadius = mLeap.config() . getFloat( "Gesture. Circ1e.MinRadius 125 図 3-25 スワイプ・ジェスチャー 「スワイプ・ジェスチャー」は、指の「上下」「左右」「前後」の動きを検出します。
第 3 章アプリケーションの開発 1 setDiffuseC010r( ci::c010rA( ( 0 ] or , C010r , ( 010r ) ) ; gl : :vertex( tovec3f( gesture . position() ) ) ; gl : :vertex( toVec3f( gesture.startposition() gl : :begin( GL—LINES ) ; : 1 i newi dth ( 10 ) ; gl : : end ( ) ; / / デフォルトに戻す setDiffuseColor( ci : :ColorA( 0 . 8f , / / 表示座標系を戻す gl : :popMatrices() ; ・ draw() の変更 void draw() gl::clear( ( 010r ( 0 , drawLeapObject() ; drawTexture() ; 《実行結果》 mparams.draw() ; / / パラメーター設定 UI を描画する 0 . 8f , 0 . 8f , これを実行させスワイプの動作をすると、指の軌跡が表示されます。 指の本数を変えて上下させると分かりますが、ジェスチャーは「手」ではなく、 「指」の動きで検出しています。 そのため、指を開いた ( パー ) 状態で「スワイプ」させるとジェスチャーを 5 つ検出し ます。 130
1 2 3 4 5 6 7 8 [ 3-9 ] ジェスチャーを検出する 方向べクトル 方向べクトルから方向を文字列化 ジェスチャーを行なっている手 ( 常に 1 ) ジェスチャーを行なっている手の ID ジェスチャーを行なっているポインタの数 ( 常に 1 ) ジェスチャーを行なっているポインタの ID ジェスチャーの検出時間 スワイプ・ジェスチャーの速度 ・ drawLeapObject() 「表示部分」の変更です。 129 ((mLastFrame. timestamp() ー gesture. frame() . timestamp()) / ( 1 ☆ 1000 * 1000.0f ) ) ; = 1.0f ー autO ( 0 ] or for ( autO gesture : mGestureList ) { gl : :setMatrices( mMayacam. getcamera() ) ; / / カメラ位置を設定する gl : :pushMatrices() ; / / 表示座標系の保持 void drawLeapObject() ・ drawLeapObject() の変更 最後に、「 mParams. draw() 」でパラメータを描画します。 これによって、時間とともにフェードアウトさせています。 色は経過時間から逆算して「白→黒」に変化させます。 それぞれの座標を「 GL_LINES 」で「線」として結びます。 これを表示してみます。 を取得できます。 「 Leap::SwipeGesture では startposition() 」と「 position() 」でスワイプの位置
第 1 章 「 Leap MotionJ の概要 「 Leap M0tion 」でできること 「 Leap Motion 」のハードおよびソフトでできることはシンプルで、次の 5 つです。 ①「手」の検出 ②「指」の検出 ③「ツール」 ( 棒状のもの ) の検出 ④「ジェスチャー」の検出 ⑤モーション 「手」「指」「ツール」は、それぞれの「位置」や「角度」「長さ」などを検出でき ます。 「ジェスチャー」は、「指」や「ツール」の動きの流れからその意味となる動きを検 出します。 「モーション」では「手」「指」「ツール」の動きの流れを知ることができます。 Hand and FingerTracking サークル スクリーン・タップ Gesture キー・タップ スワイプ 図 1 -3 「 Leap Motion 」のハード / ソフトでできること 実際に「 Leap Motion 」を試してみると、確かに指を開いたときには精度よく検 出しプロモーションビデオのようになりますが、指を閉じたり手を縦にしたりすると検 出が外れます。
第 3 章アプリケーションの開発 1 params : : InterfaceG1 ("parameters" , vec2i ( 200 , 40 の ) ; mParams mparams.addparam( "Min Lenagth" , &minLenagth ) ; mparams . addparam( "Min velocity" , &minvelocity ) ; ・ update() データの更新処理を行ないます。 リストを「 Leap::SwipeGesture 」に変更したので、表示にも「スワイプ ・ジェス チャー」特有の値を表示させてみます。 ・「 update() 」の変更 VOid update() / / 検出したジェスチャーの履歴を表示する for ( autO gesture beforeGestureList ) { ss くく GestureTypeToString( gesture . type() ) GestureStateToString( gesture.state() gesture.id() くく ' くく gesture. di rection() くく くく SwipeDi rectionToStri ng( gesture. di rection() ) くく・ くく / / 1 くく / / 4 / / 5 / / 6 / / 7 / / 8 くく くく / / 2 gesture 128 くく gesture. speed() くく ' gesture. durationseconds() くく gesture. pointable() . id() くく ' gesture . hands() .count() くく ' くく くく gesture.pointables() . count() くく ' くく くく くく
[ 3-9 ] ジェスチャーを検出する ・変数の追加と変更 Leap: :Frame lastFrame; std: :1ist<Leap: :SwipeGesture> beforeGestureList; params: : 工 nterfaceGl mparams; float minLenagth; float minvelocity; ・ setup() 127 minveloci ty = mLeap.confi g() . getFloat( "Gesture. Swi pe. Mi nveloci ty" ) ; minLenagth = mLeap. config(). getFloat( "Gesture. swipe. MinLength" ) ; / / 設定を変える mLeap . enableGesture( Leap: :Gesture: :Type: :TYPE—SWIPE ) ; / / ジェスチャーを有効にする void setup() ・「 setup ( ) 」の変更 引数には、「パラメータ名」と変更するための「変数」を指定します。 パラメータの追加には、「 params::InterfaceGI::addParam() 」を呼び出します。 引数には、「タイトル」と「表示位置」を指定します。 続いて「 params::InterfaceGI クラス」のインスタンスを作ります。 取得し、「 Config::getFloat() 」で初期値を取得します。 パラメータは、「 Leap::ControIler::config() 」で「 config クラス」のインスタンスを 「 TYPE_SWIPE 」のみ「 Leap::Controller::enabIeGesture() 」で有効化します。 初期化時に「スワイプ・ジェスチャー」のみを有効と、パラメータの設定をします。
[ 3-9 ] ジェスチャーを検出する Leap: :Gesture: :Type: :TYPE—KEY—TAP ) { el se i f ( type return "key—tap' return i nval i d " / / ジェスチャーの状態を文字列にする Leap : : Gesture : : state : : STATE—START ) { if ( state std: :string GestureStateToString( Leap: :Gesture: :state state ) return else if ( retu rn else if ( return 'start" state "update" state "stop' Leap: :Gesture: :State: Leap: :Gesture: :State: : STATE_UPDATE ) { : STATE_STOP ) { return 《実行結果》 i n val i d " このプログラムを実行すると、 4 つのジェスチャーを認識します。 123 ジェスチャーを複数認識させた場合との精度の違いも含めて参考にしてください。 このあと、それぞれのジェスチャーを個別に動かします。 べると、「キータップ」と「スクリーンタップ」は認識しづらいかもしれません。 今は 4 つのジェスチャーをすべて有効にしているため、「スワイプ」「サークル」と比
第 3 章アプリケーションの開発 円の大きさについて、手首を中心に指で円を描いても認識しますし、腕ごと円を 描くことで、より大きな円を認識させることもできます。 円の向きについては、この例では「時計回り」は「紫色」で描画され、「反時計 回り」は「青色」で描画されます。 P ョ met を「 5 ト新 R ョ山 5 4 マー 23 Ce 畋阯 0 Co し硬 0 0 を 00 53 369 ] 504 : 6 1 ← 120436- 25 ? 501. ・ - 95961 & ト 0128621. ・ P367634 0921033 ) 1 3555 c ツ 0 沁 0054 3493620 1 1 新 ( 824 27. 23 ′ 604 2 ? 1 わ← 0153428 00 51 . ー 0983 の 8 ) 1 ? 31665 c 第 0 地 00 58 243335 6 1 6C ← 848 員 6 2C986. 44836 ) ト 0434029- ・ -0200622. 03 ノ 82 間 ) 1 45 34 学 図 3-28 サークル・ジェスチャー キータップ・ジェスチャー 「キータップ・ジェスチャー」は、指の下向きの動きを検出します。 コンピュータのキーポードを押すような動作です。 「スワイプ・ジェスチャー」で「検出距離」と「速 度」を下げると、同じ動きを検出できますが、「キー タップ・ジェスチャー」は下向きの動きのみ検出し、 状態も指が下がった状態 ( Stop ) のみ通知され ます。 キータップ キータップ・ジェスチャー 図 3-29 136