手の動きに合わせて画面上のキャラクターを操作するLeap Motionプログラムを作る
次に3匹の亀の中から任意の亀を選択して移動させる、「選択した亀を移動させる」の作成方法です。
選択した亀を移動する
まずWPFプロジェクトを作成しよう
今回のLeap MotionアプリもWPFで作成します。
これには、Visual Studio 2012(以下、VS 2012)のIDEを起動して、メニューバーから[ファイル]−[新規作成]−[プロジェクト]と選択して、それにより表示される[新しいプロジェクト]ダイアログで「Visual Basic」のテンプレートから「WPF アプリケーション」を選択します(Leap Motionは、.NET Framework 3.5と4.0に対応しています。しかし、.NET Framework 4.5でも動作します。今回のアプリは全て.NET Framework 4.5で作成しています。しかし、あくまでも対応しているのは、.NET Framework 3.5と4.0です。心配な方は、.NET Framework 4.0で作成すると安心でしょう)。[名前]欄には、ここでは「kamesMoveLeapMotion」と指定します。
ソリューション・エクスプローラー内にImagesというフォルダを作成して、3匹の亀の、上向き、下向き、右向き、左向きの、4枚の亀のpng画像(合計12枚の画像)を配置しています。
ダウンロードされたサンプルファイルには、これらの画像ファイルは追加済みです。
WPFの基本的な作成手順は、「第1回.5本の指によるオブジェクトの拡大・縮小」と同じ手順となるので、説明を割愛します。具体的な手順は、第1回の「参照の追加」「プロジェクトのルートに「LeapCSharp.dll」と「Leapd.dll」を追加する」「プロパティを設定する」を参考にしてください。
今回のLeap Motionアプリについて
今回のアプリは、5本の指で、画面を空中で上下、左右に動かすと、3匹の亀の中から選択された1匹の亀が現れて、手の動きに合わせて向きを変えて移動するアプリです(図2参照)。亀を選択する場合は必ず1本の指で選択する必要があります。タッチ・ポイントが亀の上に移ると、その亀が選択されますが、1本以外の2本の指が表示されている場合は選択できませんので、注意してください。
実際に動かした動画は次のようになります。
画面のレイアウト(MainWindow.xaml)
最初に、Image1からImage3と言う名前のImageコントロールを3個配置します。SourceにkameSource1からkameSource3をバインディング、Canvas.LeftにkameLeft1
からkameLeft3をバインディング、Canvas.TopにkameTop1からkameTop3をバインディング、Canvas.RightにkameRight1からkameRight3をバインディング、Canvas.BottomにkameBottom1からkameBottom3をバインディングします。バインディングする名称は、後ほど作成する「kamesUpDownRightLeftModel.vb 」クラス内で定義するプロパティ名です。
次にBorderコントロールを3つ配置し、名前にBorder1からBorder3とつけておきます。BorderThicknessに3を指定して枠線の幅を3とします。CornerRadiusに12を指定して4隅を丸めます。
これらのBorder1からBorder3の子要素として、名前がsourceImage1からsourceImage3という名前のImageを3個配置し、Sourceプロパティに、Imagesフォルダ内の、各右向きの亀の画像を指定しておきます。一番手前に、タッチ・ポイントを表示させるための、paintCanvasという名前のInkPresenterを配置します。(リスト7参照)
リスト7(MainWindow.xaml.vb)
<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="1080" Width="1920" WindowState="Maximized"> <Canvas> <Image x:Name="Image1" Stretch="Uniform" Source="{Binding kameSource1}" Canvas.Left="{Binding kameLeft1}" Canvas.Top="{Binding kameTop1}" Canvas.Right="{Binding kameRight1}" /> <Image x:Name="Image2" Stretch="Uniform" Source="{Binding kameSource2}" Canvas.Left="{Binding kameLeft2}" Canvas.Top="{Binding kameTop2}" Canvas.Right="{Binding kameRight2}" /> <Image x:Name="Image3" Stretch="Uniform" Source="{Binding kameSource3}" Canvas.Left="{Binding kameLeft3}" Canvas.Top="{Binding kameTop3}" Canvas.Right="{Binding kameRight3}" /> <Border x:Name="Border1" BorderThickness="2" CornerRadius="12" Canvas.Left="650" Canvas.Top="10"> <Image x:Name="sourceImage1" Height="132" Canvas.Left="625" Canvas.Top="10" Width="202" Source="Images/kame_right.png"/> </Border> <Border x:Name="Border2" BorderThickness="2" CornerRadius="12" Canvas.Left="915" Canvas.Top="10"> <Image x:Name="sourceImage2" Height="146" Canvas.Left="906" Canvas.Top="10" Width="199" Source="Images/kame2_right.png" /> </Border> <Border x:Name="Border3" BorderThickness="2" CornerRadius="12" Canvas.Left="1151" Canvas.Top="10"> <Image x:Name="sourceImage3" Height="146" Canvas.Left="1151" Canvas.Top="10" Width="190" Source="Images/kame3_right.png"/> </Border> <InkPresenter Name="paintCanvas"/> </Canvas> </Window>
レイアウトは図3のようになります。
モジュールの作成
VS2012のメニューから[プロジェクト]−[モジュールの追加]と選択します。[名前]にはModule1.vbとしておきます。コードはリスト8のようになります。
リスト8(Module.vb)
3つの亀のうち、どの亀が選択されたかの判別に使用するPublic変数Indexを宣言しておきます。
Module Module1 Public Index As Integer End Module
クラスの作成(SwipeDirection.vb)
先のサンプルと全く同じなので割愛します。
クラスの作成(LeapListener.vb)
先のサンプルと全く同じなので割愛します。
クラスの作成(kamesUpDownRightLeftModel.vb)
先のサンプルとほとんど同じですが、亀を移動する距離を先のサンプルでは5を指定していましたが、今回は15という数値を指定しています。
プロパティの宣言が増えているのと、選択された亀の判別をIndexで行い、読み込む亀の種類を決定しています。Indexの値はMainWindow.xaml(後述)で取得します。
詳細は、サンプルをダウンロードしてコードをご覧ください。
プロパティ宣言のコードはリスト9です。
・・・コード略・・・
リスト9 プロパティの宣言(kamesUpDownRightLeftModel.vb)
' --------------------------Image1-------------------------- Private myTop1 As Double Public Property kameTop1 As Double Get Return myTop1 End Get Set(value As Double) myTop1 = value OnPropertyChanged("kameTop1") End Set End Property Private myLeft1 As Double Public Property kameLeft1 As Double Get Return myLeft1 End Get Set(value As Double) myLeft1 = value OnPropertyChanged("kameLeft1") End Set End Property Private myRight1 As Double Public Property kameRight1 As Double Get Return myRight1 End Get Set(value As Double) myRight1 = value OnPropertyChanged("kameRight1") End Set End Property Private mykameSource1 As BitmapImage Public Property kameSource1 As BitmapImage Get Return mykameSource1 End Get Set(value As BitmapImage) mykameSource1 = value OnPropertyChanged("kameSource1") End Set End Property ' ----------------Image2-------------------------- Private myTop2 As Double Public Property kameTop2 As Double Get Return myTop2 End Get Set(value As Double) myTop2 = value OnPropertyChanged("kameTop2") End Set End Property Private myLeft2 As Double Public Property kameLeft2 As Double Get Return myLeft2 End Get Set(value As Double) myLeft2 = value OnPropertyChanged("kameLeft2") End Set End Property Private myRight2 As Double Public Property kameRight2 As Double Get Return myRight2 End Get Set(value As Double) myRight2 = value OnPropertyChanged("kameRight2") End Set End Property Private mykameSource2 As BitmapImage Public Property kameSource2 As BitmapImage Get Return mykameSource2 End Get Set(value As BitmapImage) mykameSource2 = value OnPropertyChanged("kameSource2") End Set End Property ' --------------------Image3------------------------------------ Private myTop3 As Double Public Property kameTop3 As Double Get Return myTop3 End Get Set(value As Double) myTop3 = value OnPropertyChanged("kameTop3") End Set End Property Private myLeft3 As Double Public Property kameLeft3 As Double Get Return myLeft3 End Get Set(value As Double) myLeft3 = value OnPropertyChanged("kameLeft3") End Set End Property Private myRight3 As Double Public Property kameRight3 As Double Get Return myRight3 End Get Set(value As Double) myRight3 = value OnPropertyChanged("kameRight3") End Set End Property Private mykameSource3 As BitmapImage Public Property kameSource3 As BitmapImage Get Return mykameSource3 End Get Set(value As BitmapImage) mykameSource3 = value OnPropertyChanged("kameSource3") End Set End Property ・・・コード略・・・
画面上のキャラクターを手の動きに合わせて操作するLeap Motionプログラム(1)
手の動きに合わせて画面上のキャラクターを操作するLeap Motionプログラム(2)
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 選択した画像を指の動きに合わせて回転させるLeap Motionプログラムを作る
- 画面上の図形を5本の指で操作する基本的なLeap Motionプログラムを作る
- マウス・カーソルで指定した画像の一部を拡大表示するLeap Motionプログラム
- Leap Motionのスクリーン・タップを使った音声の再生と画像の表示
- 張子の虎をキー・タップすると頭が上下に動くLeap Motionプログラムを作る
- 声で選んだアイテムをプレイヤーの身体に装着・連動させるKinectサンプル
- センサーとサウンドの処理を組み込んでアプリを完成させる
- Kinect v2で実現する打楽器のバーチャル演奏
- 顔認識APIを使って写真に黒縁メガネをかける
- 読み込んだ画像に装飾を施し、PictureHUBに保存する