ScreenTapActionメソッドの処理

ScreenTapDirection列挙体の値がScreenTapであった時の処理を記述します。

Leap Motionのフレームを表すFrame型(Leap名前空間)の変数「frame」を宣言します。InteractionBox型(Leap名前空間)の変数「interactionBox」を宣言し、そこにleap.Frame.InteractionBoxプロパティからInteractionBoxオブジェクトを取得します。InteractionBoxオブジェクトは、Leap Motionで認識できる可動範囲となります。InteractionBoxオブジェクトを使用することで、指やツール(=ペンなど)の位置を実際のディスプレイの座標系に変換できます(リスト5を参照)。詳細な図については、Build Insiderの記事「Leap Motionでのタッチ操作はどう開発するのか?」を参照してください。

次に、Leap.Frame.Pointablesプロパティで得られるPointableListオブジェクト内を変数「Pointable」で反復処理しながら、1つずつPointableオブジェクトを処理し、それぞれのタッチ位置を取得していきます。

interactionBoxオブジェクトのNormalizePointメソッドに引数としてPointable.StabilizedTipPositionプロパティ値を渡し、ポインター上の位置を取得します。

変数「windowWidth」と「windowHeight」で表されたクライアント領域のウィンドウがある場合、以下のコードで示す計算式を使用してこのウィンドウ内のタッチ・ポイントの2D座標を得ることができます。

  tx = normalizedPosition.x * windowWidth
  ty = windowHeight - normalizedPosition.y * windowHeight
  touchPoint = New StylusPoint(tx, ty)

dispatcher.Invokeを使って、ワーカースレッドからUIスレッドに処理を任せます。

新しいMediaElementのインスタンス、myMediaオブジェクトを作成します。
LoadBhhaviorとUnloadBehaviorにManualを指定します。これを指定しなければ、エラーが発生するので注意してください。Sourceプロパティに、ソリューション・エクスプローラー内のWAVフォルダ内にある「.wavファイル」を指定します。Playメソッドで「.wavファイル」を再生すると、銃声が鳴ります。

次にImageのインスタンスmyImageオブジェクトを作成します。WidthとHeightに50を指定し、Sourceプロパティに、ソリューション・エクスプローラー内のImageフォルダ内にあるpng画像ファイルを指定します。「銃弾の跡」の画像です。

SetValueメソッドでmyImageオブジェクトの表示されるTopとLeftの位置を指定します。

MainWindowにアクセスし、MainWindowのShowAreaという名前のCanvasにmyImageオブジェクトを追加していきます。これで、銃声とともに銃弾の跡が無数に表示されます。

具体的なコードはリスト5のようになります。

リスト5 空中タップした位置に銃声とともに銃弾の跡の表示されるScreenTapActionメソッドの処理

Private Sub ScreenTapAction(ByVal sd As ScreenTapDirection)
        Select Case sd
        Case ScreenTapDirection.ScreenTap
          Dim frame As Leap.Frame = leap.Frame

          '  Leap Motionで認識できる可動範囲を取得する
          Dim interactionBox As InteractionBox = leap.Frame.InteractionBox
          For Each Pointable As Pointable In leap.Frame.Pointables
            Dim normalizedPosition As Leap.Vector = interactionBox.NormalizePoint(Pointable.StabilizedTipPosition)
 
            tx = normalizedPosition.x * windowWidth
            ty = windowHeight - normalizedPosition.y * windowHeight

            '  ウィンドウ内のタッチ・ポイントの位置を取得する
            touchPoint = New StylusPoint(tx, ty)
          Next

' ワーカースレッドからUIスレッドに処理を任せる
          dispatcher.Invoke(Sub()
            ' MediaElementのインスタンスを作成する。
                  myMedia = New MediaElement
                  myMedia.LoadedBehavior = MediaState.Manual
                 myMedia.UnloadedBehavior = MediaState.Manual
        myMedia.Source = New Uri("WAV/bigshot1.wav", UriKind.Relative)
        myMedia.Play()

' Imageのインスタンスを作成する。
        myImage = New Image
        With myImage
          .Width = 50
          .Height = 50
          .Source = New BitmapImage(New Uri("Image/銃弾.png", UriKind.Relative))

' 銃弾の画像が表示される位置を設定する。
          .SetValue(Canvas.TopProperty, touchPoint.Y)
          .SetValue(Canvas.LeftProperty, touchPoint.X)
        End With

' MainWindowにアクセスする。
        Dim myMainWindow As MainWindow = DirectCast(Application.Current.MainWindow, MainWindow)
  
myMainWindow.ShowArea.Children.Add(myImage)
                                   End Sub)
        Exit Select
    End Select
    End Sub
  ・・・・以下コード略・・・・
End Class

MainWindow.xaml内に[gunModel]を取り込む

まず名前空間として「xmlns:local="clr-namespace:gunLeapMotion"」を定義します。

次にプロパティ要素内に「」と記述します。MainWindow.xaml内に「gunModel」クラスが取り込まれます。リスト6のようになります。

リスト6 「UpDownMode」を取り込んだMainWindo.xaml

<Window x:Class="MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:gunLeapMotion"
  Title="MainWindow" Height="1080" Width="1920" WindowState="Maximized">
  <Window.DataContext>
      <local:gunModel/>
  </Window.DataContext>
    <Canvas>
      <Canvas x:Name="ShowArea"/>
    </Canvas>
</Window>

MainWindow.xaml.vbには何も記述しません。

※注意
サンプルをダウンロードして動かす場合は、「LeapCSharp.NET4.0.dll」や「LeapCSharp.dll」、「Leap.dll」を読者自身のフォルダ内にあるDLLファイルに指定し直さなければ動かない可能性があるので、動かない場合は再指定してください。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30