「 Leap MotionJ の概要 第 1 章 LEAP 方イルアカウ冫トヘルプ M 0 T ー 0 A P P い 0 M E 。、 LEAP 一 を新 5 0 をを ( 0 ′ ORM 、を i.JN ミ : 1 に ) 、 図 1 -9 App Home EAP P• 0 '1-eapM0tjonAppstorel... 興 。ゾを htt : わ ) 」 eaprnot 1. corn / A P P S 丁 ( ) P E 0 1 ' 0 N SculptinO 第地淑ⅲ第い朝澱ド C ー 0 ヨ te50n10 す ex\krtence. 、引 ) 竊 1 ( 用 el ⅲ 9
[ 3-9 ] ジェスチャーを検出する ・ renderFrameParameter() リストを「 Leap::KeyTapGesture 」に変更したので、表示にもスクリーンタップ・ジェ スチャー特有の値を表示させてみます。 ・「 renderFrameParameter() 」の変更 VOid renderFrameParameter() / / 検出したジェスチャーの履歴を表示する for ( autO gesture : mGestureList ) { ss くく GestureTypeToString( gesture.type() ) くく ' GestureStateTostring( gesture . state() ) くく ' i d ( ) くく一 gesture . くく gesture . duration() くく一 gesture . hands() . count() くく一 . hands() [ 0 ] . id() くく一 gesture gesture . pointables() . count() くく ' gesture . pointable() . id() くく一 gesture . di rection() くく ' gesture . position() くく ' gesture . progress() くく ' くく くく くく くく くく くく / / 1 / / 2 / / 3 / / 4 くく 1 ジェスチャーを行なっている指の ID 2 キータップの方向べクトル 3 キータップした位置 4 キータップの状態 ( 常に 1 ) 145
[ 2-2 ] 「 Leap Motion アプリケーション」の開発環境を整える (Windows 編 ) 図 2-24 インクルードディレクトリの設定 [ 6 ] 「ユーザーマクロ」の「 LEAP_SDK 」の値を、環境に合わせます。 ・共通プロバティ ュ - ザーマ V ( + ・デれみド」 0 マ : フーストッ - ル レライプラ」アン 0 ルース N/A 図 2-22 「 LEAP_SDK 」の値を変更 ~ ヨ 0 01 ゾぬーン一′プ 0 ラ 1 り当 ゾ」】 ~ : 三ン一 ? スア 0 ・・を・ : 0 物本れ 0 転 : グ硺う新箞い・朝 [ 7 ] 続いて「ソリューション」タブを開き、 プロジェクトの右クリックからプロバティを 開きます。 図 2-23 プロジェクトのプロバティを変更 & ビルり にルド向 びまで機第 ( 5 ) を人一ゾーンエりス尢 - う - ュヨ、 ) を 0 ビルカスマイズ ( 日レ のスつ再 - い - トみプカシ設を ( A ) デバ ( 0 ) 外の乃 ) ゾな三′ス物 5 ) ェプ←ラ癶フ , ルダ ( ( x ) Ct ・ 9 玳・ X [ 8 ] 「 C / C + + ー追加のインクルードディレクトリ」の編集から「親またはプロジェクトの 規定値から継承」にチェックを入れます。 Le 叩 : バティベージ 橋ま ( c ) : イプ ( 〔 通 : 第バティ ・ IO バティ テパの + ・デイしク慟 マニフ以トツール “ブト一ム ( p ) : ツ好イプ ( w ] 効 加の、ティレクトリ テパ , グ慣式 共通第語ラ冫タイムサ冢ート 、 Mit ) 物、ラ冫みイム第強 - ′用 響告を 1 ラーとして ) 「一 ( ir を′住 & 、一にに、 . 洋 . 洋 ci ル「一 c ⅲ d ~ r 0. & 5 ⅸ、に ( またはアこ針ぞ Z 健ヴら承 ) はいい ) ) レベル 3 ( / ) しいえ UWX-) マグ当 ) 》》 図 2-25 チェックを入れる 53
第 1 章 「 Leap MotionJ の概要 詳細画面に進みます。 アプリケーションの種類 ( 有料、無料、 web) によってボタンが変わります。 「無料」および「 web アプリケーション」については、そのまま押してしまってもい いでしよう。 TiltYourBall さ第気らはわま歹 . 。 - ー 3 下 0 円入する = ケームのその他のアリ 図 1 - 41 有料アプリケー ション Duck-n-Kill これを物する く 0 ームのその他のアプリ 第し一第一 無料アプリケー 図 1 - 42 ション Vimeo Couch Mode 日 ~ & 0 第・知 ! ツ 4 日・ま い起物 これを有する Ⅵ。 & p ー内′カその他の A 日 ( 01- い T Ⅲい Web アプリケーションへのリンク 図 1 - 43 30
[ 3-7 ] 「指」を検出 void setDiffusecoIor( ci : :C010rA diffusecolor ) gl : : C010r ( diffusecolor ) ; g1Materia1fv( GL_FRONT, GL_DIFFUSE, diffusecolor ) ; [ プログラム解説 ] これで指を伸ばしていると「水色」になり、閉じると「黄色」になります。 《実行結果》 日い g 日・ Ccant : 5 ト朝 10 日 P03 三い ) 亠 39.09C : 6 当 24 心 27 当 63 0 P05 00 : ー 1 & ド 32 ?. 2 ま 883. -65.356 ト旧 0 曰ヨ ) 0 引い 0 い : ウ 84 ! を一 5 ゝ 06 し・第 . 3 】 985 日い 0 を一 POS も 00 : ー 4 主 55 し ! 5 ? / 曾 . ! 4.5 ら 48 F1nqet P ひッ ! 池ル - 53 る 00L : 5 工 047 , & 5584 ! 図 3-13 ・「指骨」 ( 指の骨 ) の検出 ここまでの実行結果 「 Leap Motion V2 」での最大の機能追加の一つである「指骨」 ( 指の骨 ) の 検出について解説します。 「指骨」は、「 Finger クラス」から取得でき、「 Bone クラス」として定義されてい ます。 また、「指骨」の名称は、「 Bone : : Type 列挙体」として定義されています。 97
[ 3-10 ] 「モーション」を取得する Leap: :Frame lastFrame ) mRotationMatrix Leap: :Matrix: :identity() ; Motion() float mscale; Leap: :Matrix mROtationMatrix; Leap: :vector mTranslation; / / 移動量、回転量、拡大率 public: class Motion using namespace Std; 1 / / 前のフレームからの移動量 Motion motion; static MOtion getCurrentMotion( 0bject object, template く typename Object> = 1.0f ; mscale mTranslation Leap: :Vector: :zero() ; 151 if ( object. scaleprobability( 1astFrame ) > 0.4 ) { / / 前のフレームからの拡大縮小 motion . mRotationMatrix Object. rotationMatrix( lastFrame ) ; if ( object. rotationprobability( 1astFrame ) > 0.4 ) { / / 前のフレームからの回転量 object . translation( lastFrame ) ; motion . mTranslation / / 回転を考慮して移動する if ( object. translationprobability( 1astFrame ) > 0.4 ) {
開発環境を構築 第 2 章 [ 5 ] コードを開きます。 クイック起動に : に + 0 ) Leap - M に「 050 代Ⅵ su 引 StudjoExpress 2012 fo 「 W 朝 1d0 Desktop 方イル旧編第 ( 印表示Ⅳ ) カジェクト凹 ビルド劇デバ ( 0 ) チーム ) ツー財 I ) ウインめ ( ヘルプ但 ) テスト 0 ・ 0 お日 つ・ぐ・トローカル W ws デバ , ガー・ t)ebug , W ⅵ 32 ・列ユーシンエクスプローラー ( グこ一バルス ] ー刀 三第い ( 一面に - " d に / ・ pp. な 00N3 を i ” . 乃ユーションスプこ一ラーの検 ( こ + : ) ゾぬーン・ p ・いカ外 ) 三リ 5i れ g れ、 p ー ( を Ci; ・霳し p ) H 日åd ぎ F 5 》を刈「 ( を 、 5 供に ( e 臼ぉ を ( レ、、し” 00 : public Apphative ( public : 外都依■係 ”れ p ( 凝 0 ー d ` ) 0500 ア収 : し、にを、の 1 を 01 を ) ー void 叩 d を ( 0 ー d dr"( ß:void しぐ第 , p : : 、し p ( ) *;void ーで宿 qApp : : リ 5 に、 , ! し、を、に nt 0 レ en ! ) €void し。。 0 p : :drau() APP ー談】 V を ( 、を物暴 p. / / 01 を田、 00 を the 物 i 「 with b 】、 ( を プロバティゾぬ - ー : 肩ン 1 クスプ } ーテ・ - ーご 35 ト・をきりい ' 引、 : リ 0 、学 G こ「物ド 0 宿三 : ら、こ 図 2-10 ソースコードを開く [ 6 ] 解説用に少し整形します。読み替えることができれば、そのままでもかまいません。 解説ではクラス定義にそのまま実装する方法でコードを記述していきます。 うイック朝 (Ctr"+Q) Leap - Mi( 」 0 代Ⅵ S い 1 朝 0 Express 2012 長” W ⅲ d0 、 Desktop 万イ日編第旧表利Ⅵカジェ外 ) ビルド但 ) デバⅵ ( Q ) チーム他 ) ツール田 ウインドウ ( ) ヘルプ旧 ) テスト劇 0 ・ 0 おっ , 0 , トローカル、Ⅶ ) ws デバッガー・ Debug ・物 n ・ゾぬーンヨンクスプローラー を LeapApp !+include - ( ー杯 / ー / 崧 p ョ i ” . 心 ゾぬ ~ 冫 : クスプ 0 ~ ラー 0 新 ( ( + : ) カューンン・ L 部プは方クト ) ・、 ] Leap 》 He 地「翩お リ sing n 強・ 0 、 pa ( 0 5 を d ー レ Re 」 rce 翩 三 ( 1 “、しぐ物 p : 四 01i ( 4 ト、ぞ public : 外部依評聞係 000A い p ・ ・ X .8 リ 5 ~ 0 : Nn ( 当 ) リー ~ を、に 1 ををソ物 ) 三 void に第 PP : ・ ト void 三 void ぐ 1 を第・ 0 を之 he 、け、 *ith bl ( を ( OE 第 APP ー談ー : を ( こ ~ apÅをリー R ざ ~ ドざ・ 6 ー ) プコ ) 行れユーン 1 クスプローラー 出力 冫イルを物しこ 図 2-1 1 解説用に整形 46
[ 3-7 ] 「指」を検出 「 tipPosition() 」などの基本的な情報も「 Leap::PointabIe クラス」がもっている ので、そのままの状態で使うことができます。 ・ drawLeapObject() 次に「描画処理」です。 こでは「 Poitable クラス」を「 Tool クラス」または「 Finger クラス」に変換して、 固有の処理を行ないます。 voi d drawLeapObject() / / 座標を表示する for ( autO pointable : mcurrentFrame. pointables() ) { / / ツール if ( pointable. isT001() ) { setDiffuseC010r( ci::coIorA( 1 , 0 , 0 ) ) ; Leap: : T001 t001 ( pointable ) ; gl: :drawcube( t0Vec3f( pointable. tipposition() ) , vec3f( 10 , 10 , 10 ) ) ; Leap: :Bone: Leap: :Bone: Leap: :Bone: Leap: :Bone: const Leap: :Bone: :Type boneType[] Leap: :Finger finger( pointable ) ; setDiffuseC010r( ci : : ( 010rA ( 0 , 1 , el se { / / 指 :Type : : TYPE—DISTAL , :Type : : TYPE—INTERMEDIATE , :Type : :TYPE—PROXIMAL , :Type : :TYPE—METACARPAL , 105 autO bone = finger. bone( type ) ; boneType ) { for ( auto type
第 3 章アプリケーションの開発 std: FUNCT 工 ON_ くく std : : endl ; :cout くく void mai n ( ) / / リスナーを登録する / / リスナーとのやり取りは別スレッドにて行われる SampleListener listener; Leap: :Contr011er leap; leap. addListener( listener ) ; 〃 1 eap. setP01 i cyFIags( Leap : :control 1 er : : P01 i cyFlag : : POLICY-BACKGROUND-FRAMES ) ; std: :cout くく " 終了するには何かキーを押してください " くく std: :endl ; std::cin . get(); leap. removeListener( listener ) ; [ プログラム解説 ] 「 setPoIicyFIags() 」はコメント化しているので、デフォルトのポリシーが適用され ま このプログラムを実行し、アプリケーションのウインドウを最前面にすると「 onFra me() 」が継続的に発生します。 別のウインドウ ( たとえば「エクスプローラ」や「 Finder 」 ) を最前面にすると、「 on FocusLost() 」が呼び出され、「 onFrame() 」が止まります。 ノヾックグラウンドになったので、「 Leap Motion 」からのデータが通知されなくなりま 再度アプリケーションのウインドウを最前面にすると、「 onFocusGained() 」が呼ば れ、「 onFrame() 」の呼び出しが再開されます。
第 3 章アプリケーションの開発 1 if ( finger. touchzone ( ) = = Leap: : pointable: :zone: :ZONE—HOVERING ) { gl : : C010r ( 0 , 1 , 0 , 1 ー finger.touchDistance ( ) ) ; / / タッチ状態 else if ( finger. touchzone ( ) = = Leap: : pointable: :zone: :ZONE—TOUCHING ) { gl : : ( 01 or ( 1 , 0 , 0 , -finger. touchDistance ( ) ) ; gl : :drawsolidcircle ( vec2f ( x gl : : C01 or ( 0 , 0 , 1 , el se { / / タッチ対象外 タッチの状態は、「 Leap::Pointable::Zone 列挙体」で定義され、「 Leap::Point 指の位置を描画する前に、タッチ状態によって色を変えています。 「 Leap::Pointable::Zone 列挙体」には、次の値があります。 able::touchZone ( ) 」で取得できます。 ZONE_NONE ZONE HOVERING ZONE TOUCHING 値 意味 タッチでもホバーでもない ホバーしている タッチしている また、タッチ状態の度合い ( タッチの深さ ) を取得することもできます。 この値は「 Leap::Pointable::touchDistance ( ) 」で取得できます。 「タッチの状態」 (touchZone ( ) の値 ) と「タッチの Hoveri ng 度合い」 (touchDistance ( ) の値 ) の関係は次のよう になります。 0 「 Leap Motion 」でタッチを判定する 164 Touching