Finger - みる会図書館


検索対象: Leap Motionプログラミングガイド 改訂版
23件見つかりました。

1. Leap Motionプログラミングガイド 改訂版

[ 3-7 ] 「指」を検出 「 renderFrameParameter() 」を呼び出し、データの表示を行ないます。 検出した「指の一覧」は、「 Leap::Frame::fingers() 」で取得できます。 「指の一覧」は「 Leap::FingerList クラス」で表わされます。 「 Leap::FingerList クラス」には、いろいろなパラメータがありますが、ここでは検 出した「指の数」 (fingers. count()) と、それぞれの「指の位置」 (finger. tipPositi on()) を表示させてみます。 「 finger. tipPosition() 」は、指先の「 X,Y,Z 座標」を 3 次元座標で取得します。 VOid renderFrameparameter() / / 検出した指の数 SS くく "Finger count / / 指の座標を取得する for ( autO finger mCurrentFrame . fingers() ) { " くく mCurrentFrame. fingers() . count() くく "Yn" SS くく "Finger Position: 、くく finger. tipposition() . x くく くく finger. tipposition() . y くく ' くく finger. tipposition() . z くく "%n" 「 drawLeapObject() 」では、検出した指の位置を球で描画します。 「 gl::drawSphere() 」で、「球」を表示します。 中心座標は、「 finger. tipPosition() 」で取得した指先の 3 次元座標 ( 「 Leap::V ector 」を「 Cinder 」の「 vec3f 」に変換する「 toVec3f() 」を通す ) 、半径は「 10 」と します。 VOid drawLeapObject() / / 指を表示する 93

2. Leap Motionプログラミングガイド 改訂版

[ 3-8 ] 「手」を検出する ・「 HandList 」から右手の人差指の取得 for ( autO hand frame . hands() ) { if( hand . isRight() ) { autO finger hand . fingers() .extended() . fingerType(Leap: :Finger: :Type: :TYPE—INDEX) [ 0 ] ; i f ( fi nge r. i sval i d ( ) ) { gl : :drawsphere( tovec3f( finger.tipposition() ) , 10 ) ; もうーっの書き方を紹介します。 「 Finger クラス」では属している手、「 Hand クラス」を取得できます。 このため「中指」の一覧を取得し、それが「右手」か「左手」かという順番で判 : F frame . fingers() . extended() .fingerType(Leap: autO fingers ・「 FingerList 」から右手の人差し指の取得 別することもできます。 inger: :Type: :TYPE—INDEX) ; for ( autO finger : fingers ) { if ( finger. hand() . isRight() ) { gl : :drawsphere( tovec3f( finger. tipposition() ) , 10 ) ; 「 HandList クラス」からたどる場合、取得された指が有効かどうかの判定が入る ため、好みにもよりますが「 FingerList 」からたどるほうが簡潔に記述することがで きます。 手や指の開く度合いを検出 「 Leap SDK VI 」には、「 sphere 」 ( 「 Hand::sphereCenter() 」と「 Hand::spher eRadius() 」 ) と呼ばれる、「手に接する球の大きさを」取得できました。 これは手の開閉度に応じて増減する値で、手を開いているか閉じているか、その 中間状態を取得することができます。 113

3. Leap Motionプログラミングガイド 改訂版

第 3 章 アプリケーションの開発 さまざまな指の取得方法 これらを紹介します。 「 V2 」ではいくつかの指の取得方法が追加されました。 ・ FingerList::extended() 「伸びている指」 (Finger::isExtended()==ture) の一覧を取得します。 ここで検出される指が「 vl 」で検出される指と同等になります。 ・伸びている指の一覧の取得 autO fi ngers = mCurrentFrame. fi ngers() . extended() ; ・ FingerList::fingerType() 特定の指を取得します。 「 fingerType() 」には、「指の種類」 ( 親指 ~ 小指 ) を示す「 Leap::Finger::Ty pe 」を与えます。 たとえば、次のように書くことで、「人差し指」のみ取得できます。 ・人差し指の一覧の取得 autO fingers mCurrentFrame.fingers() . fingerType( Leap: :Finger: :Type: :TYPE—INDEX ) ; ・合わせる 「 FingerList::extended() 」と「 FingerList::fingerType() 」は、「 FingerList 」 の参照を返します。 これによって、メソッドチェーンのように記述できます。 たとえば、次のように書くことで「伸びている人差し指」を取得できます。 ・伸びている人差し指の一覧の取得 mCurrentFrame.fingers() . extended() autO ingers .fingerType( Leap: : Finger: :Type: :TYPE—INDEX ) ; 102

4. Leap Motionプログラミングガイド 改訂版

[ 4-1 ] じゃんけんゲーム mAssets( assets ) mEnterTime = mAssets->getFrame() . timestamp() ; vi rtual state* update() return thi 5 ; protected : / / 指の数から、ポーズを決める Jyankenpose fingercountTopose( Leap: :Hand hand ) / / 伸びている指の数を数える autO count = std: :count-if( hand. fingers(). begin() , hand. fingers() •end() , ロ (const Leap: : Finger& finger) { return finger. i sExtended() ; } ) ; ifC count く = 1 ) { return JyankenPose: :Gu; else if( count く = 3 ) { return Jyankenpose: :choki ; return JyankenPose: :pa; / / アイドル ( 待機 ) 状態 class ldlestate public: publ i ( state ldlestate( GameAssets* assets ) State( assets ) 167

5. Leap Motionプログラミングガイド 改訂版

[ 3-8 ] 「手」を検出する 「手に付随する指」の取得 先ほどはフレームで検出された指すべてを取得しました。 これを「手に付随する指」にすることで、「右手の指」「左手の人差指」といった データの取得が可能になります。 先ほどは「 FingerList クラス」を「 Frame::fingers() 」で取得していましたが、今 Leap: :Bone: Leap: : Bone: Leap: :Bone: Leap: :Bone: 回は「 Hand::fingers() 」で取得します。 これによって「右手」と「左手」の指が取得できます。 ・手の左右によって色を変える void draw() / / 手の位置を表示する autO frame = mLeap . frame() ; for ( autO hand frame . hands() ) { double red hand . isRight() ? 1.0 setDiffuseC010r( ci::coIorA( red, 1.0 , 0 . 5 ) ) ; gl : :drawsphere( tovec3f( hand . palmposition() ) , setDiffuseC010r( ci::c010rA( red, 0 . 5 , 1.0 ) ) ; const Leap: : Bone: :Type boneType[] hand . fingers() ) { for ( autO finger :Type : :TYPE—DISTAL , : Type : :TYPE—工 NTERMEDIATE , :Type : : TYPE—PROXIMAL , :Type : :TYPE—METACARPAL , 10 ) ; for ( autO type boneType ) { autO bone = finger. bone( type ) ; gl : :drawsphere( tovec3f( bone . center() ) , 10 ) ;

6. Leap Motionプログラミングガイド 改訂版

[ 3-7 ] 「指」を検出 ・「指の状態」の検出 まずは「指の状態」です。 前回までのプログラムは指を検出することはできましたが、指を伸ばしていても閉 じていても ( パーでもグーでも ) 指を 5 本検出し、座標が取得できました。 これはこれでよいのですが、指をポインタにする場合など、閉じていては困る場合 があります。 「 Leap Motion SDK VI 」では、指を伸ばした状態のみ検出できましたが、 v2 で は閉じていても検出できるようになったためです。 検出精度は上がりましたが、使うときに少し困ります。 そこで、「 V2 」では「 Finger::isExtended() 」が追加されており、指が伸びている かどうかの状態を取得できます。 これを先ほどのプログラムに追加して実行してみましよう。 ・指の状態を反映する void drawLeapObject() / / 指を表示する fO 「 ( auto finger : mcurrentFrame. fingers() ) { if ( finger. isExtended() ) { gl : :drawsphere( tovec3f( finger. tipposition() ) , [ プログラム解説 ] 10 ) ; 手を「パー」から「チョキ」に変えると、指が 5 本から 2 本に変わるようになります。 先ほどまでは「パー」も「チョキ」も 5 本の指が表示されていたので比べてみてく ださい。 95

7. Leap Motionプログラミングガイド 改訂版

《プログラム》 それではコードを見てみ ましよう。 全体のコードは「 lntera ctionBox02 」にあります。 ・ draw ( ) i f ( ! fi nge r. i sval i d ( ) ) { [ 3-1 1 ] rInteractionBox 」を使う 面 0 州 行 0 Side backSide 「 InteractionBox 」の座標に変換します。 / / 人差し指を取得する Leap: :Finger :TYPE_INDEX retu rn ; finger = mLeap. frame ( ) . fingers ( ) .fingerType ( Leap: : Finger: :Type / / InteractionBox の座標に変換する 161 ここでは、あらかじめ取得した人差し指の座標を変換しています。 の位置の割合で変化します。 点となり、それぞれ右、上、手前方向に「 0 」から「 1 」の範囲の「 InteractionBox 」 「 normalizepoint ( ) 」で返される座標系は「 InteractionBox 」の左下奥が原 変換したい座標を「 Leap::InteractionBox::normalizePoint ( ) 」に指定します。 「 InteractionBox 」は、「 Leap::Frame::interactionBox ( ) 」で取得できます。 si ti on ( ) ) ; iBOX . normalizepoint ( finger . stabilizedTippo Leap: :vector normalizedposition Leap: : 工 nteractionBox iBOX = mLeap. frame ( ) . interactionBox ( ) ;

8. Leap Motionプログラミングガイド 改訂版

第 3 章アプリケーションの開発 「指骨」の「長さ」と「太さ」は数値で表示し、「指骨」の「位置」は、次の「 draw このとき、「 Bone::Type 」で取得したい「指骨」の位置を指定します。 「 Bone クラス」は、前述のとおり「 Finger::bone() 」で取得できます。 [ プログラム解説 ] drawBone( finger. bone( type ) ) ; boneType ) { fO 「 ( autO type Leap: :Bone: :Type: :TYPE—D 工 STAL, Leap: :Bone: :Type: :TYPE—INTERMEDIATE, Leap: :Bone: :Type: :TYPE—PROXIMAL, Leap: :Bone: :Type: :TYPE—METACARPAL, const Leap: :Bone: :Type boneType ロ setDiffuseCOIor( ci::c010rA( 1 , 1 , 0 ) ) ; el se { setDiffusec010r( ci::COIorA( 0 , 1 , 1 ) ) ; if ( finger. isExtended() ) { for ( autO finger : mcurrentFrame . fingers() ) { / / 指を表示する Bone() 」で描画しています。 VOid drawBone( Leap: :Bone bone ) / / 中心 setDiffusec010r( ci::C010rA( 1 , 0 , 0 ) ) ; gl : :drawsphere( tovec3f( bone. center() ) , 100 5 ) ;

9. Leap Motionプログラミングガイド 改訂版

[ 3-7 ] 「指」を検出 これらの情報は、指をよりリアルに表現するときに役に立つでしよう。 それではプログラムを見てみます。 「 renderFrameParameter() 」で「指骨」の「長さ」と「太さ」を表示し、「 draw VOid drawLeapObject() ・ drawLeapObject() ーくく bone . width() くく std: :endl ; ss くく bone. length() くく ' autO bone = finger . bone( type ) ; boneType ) { for ( autO type Leap: :Bone: :Type: :TYPE—D 工 STAL, Leap : : Bone : :Type : : TYPE—INTERMED 工 ATE , Leap: :Bone: :Type: :TYPE—PROX 工 MAL, Leap: :Bone: :Type: :TYPE—METACARPAL, const Leap: :Bone: :Type boneType ロ if ( finger. isExtended() ) { fO 「 ( autO finger : mCurrentFrame. fingers() ) { / / 指の関節の長さと太さを表示する VOid renderFrameparameter() / / フレーム情報の描画 ・ renderFrameParameter() LeapObject() 」で「指骨」の「位置」を表示します。 99

10. Leap Motionプログラミングガイド 改訂版

[ 4-1 ] じゃんけんゲーム 2 秒たっと③「ばん状態」に遷移します。「ばん状態」はコンピュータのポーズ ( グー、チョキ、パー ) およびユーザーの手を検出し、ポーズを決定します。 ポーズを決定したら④「結果状態」に遷移します。 「結果状態」は両者のポーズから「勝ち」「負け」「あいこ」を決めます。 図 4-1 じゃんけんアプリ コードは長いですが、「じゃんけん」のキモの部分は、プレイヤーの指の数を検出 する、下記のコードのみです。 / / 指の数から、ポーズを決める Jyankenpose fingercountTopose( Leap: :Hand hand ) / / 伸びてし、る指の数を数える = std: :count-if( hand. fingers() . begin(), hand. fi ngers() . end(), autO count ロ (const Leap: : Finger& finger) { return finger. isExte nd if( count く = 1 ) { return JyankenPose: :Gu; else if( count く = 3 ) { return JyankenPose: :choki ; return Jyankenpose: :pa; 173