

実際、Leap Motionは手の位置を認識できる小さなKinectです。 作成者によると( このビデオによく反映されています )、多くの異なるシナリオでコンピューターを制御するために使用できます。 この投稿では、Leap Motion(.NETプラットフォーム上)のプログラミング方法と、それに基づいた単純な楽器( テルミン)の作成方法について説明します。 以下がその1つです。
プログラマー向けのLeap Motion
プログラマーの観点から、Leap Motionは便利なAPIのセットを提供し( ここで説明します )、次のことを可能にします。
- 指の座標と速度、手のひらの法線、さまざまな「ツール」の位置と速度を含む空間のモデルを受信するための高周波数(60〜100フレーム/秒以上)(Leap Motionは鉛筆と万年筆をよく認識します)
- 主なジェスチャーを認識する:サークル、スワイプ、クリック
- タッチ面をエミュレートします、つまり 画面の前の仮想面に触れる
- 手と指の基本的な動き(動き)を認識し、それらを回転、動き、スケーリングの変換に変換します。
Kinectとは異なり、Leap Motionはカメラから受信した3Dデータへのアクセスを提供しません。
Leap Motionは、.NETを含むさまざまな言語とプラットフォームでプログラムできます。 この記事では、最初の機会である手のモデルへのアクセスを使用することを検討します。
最も単純な動きを追跡します
Visual Studioでの実験では、空のWPFプロジェクトを作成し、メイン画面に色付きの円を追加します。 最初のステップは、指の動きでこの円を画面上で動かす方法を学ぶことです。 そのため、メインページ(XAML)のレイアウトは次のようになります。
WPFページレイアウトMainPage.xaml
<Window x:Class="LeapVoxSample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="768" Width="1024" Background="Black"> <Canvas> <Ellipse x:Name="ptr" Fill="Yellow" Height="30" Width="30"/> </Canvas> </Window>
Leap Motionを使用するには、Leap Motion SDKをダウンロードし、 LeapCSharp.NET4.0.dllへのリンクをプロジェクトに接続する必要があります 。 ただし、これだけではありません。LeapSDKには、プロジェクトの実行可能ファイルと同じディレクトリにあるLeap.dllおよびLeapCSharp.dllライブラリも必要です。 したがって、これらのファイルをLeapSDK \ lib \ x86ディレクトリ(Leap SDKがインストールされているディレクトリ内)で見つけ、それらをVisual Studioプロジェクトにドラッグし、プロパティ「コンパイルアクション=コンテンツ、出力ディレクトリにコピー=新しい場合にコピー」を設定します。


Leapコントローラーとのすべての通信は、 コントローラーオブジェクトを介して行われます。 メインのMainWindows.xaml.csファイルにそのようなオブジェクトを作成します。
Controller Leap = new Controller();
Leap Motionは、手の位置に関するデータをフレームに提供する準備ができました。 フレームを取得するには2つの方法があります。
- ListenerクラスのインスタンスをControllerオブジェクトに渡します。このオブジェクトでは、OnFrameメソッドがオーバーロードされます。 このメソッドは、Leap Motion SDKによって可能な限り最高のフレームレートで自動的に呼び出されます。
- 独自のメソッドを作成します。このメソッドは定期的にControllerクラスをポーリングし、そこから現在のフレームを取得します。 これは、プログラムにすでに自然なループがある場合、または実行のUIスレッドでコードを実行する場合に実行する必要があります。
この例では、コントローラーのポーリングサイクルを作成するために、1秒間に30回起動するDispatcherTimerを使用します。
コントローラーのポーリングサイクルの構成
DispatcherTimer dt = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(1 / 30) }; public MainWindow() { InitializeComponent(); dt.Tick += dt_Tick; dt.Start(); }
dt_Tickメソッドは、モーショントラッキングの基本ロジックに焦点を当てます。 現在のフレーム(フレーム)を取得し、このフレームに指が表示されている場合-指から最初の指を取り出し、その座標を使用して円の位置を変更します。
void dt_Tick(object sender, EventArgs e) { var fr = Leap.Frame(); if (fr!=null && fr.Fingers.Count>0) { var f = fr.Fingers[0]; Canvas.SetLeft(ptr, 512 + f.TipPosition.x); Canvas.SetTop(ptr, 768-f.TipPosition.y); } }
Leap Motionコントローラー上で指を動かすことで、画面の周りで円を動かすことができるようになりました。 この段階のサンプルコードはGitHubで表示できます。
さまざまな高さのソフトウェア生成音
さまざまな高さの音のソフトウェア生成には、 NAudioライブラリを使用します。 プロジェクトにNAudioサポートを追加する最も簡単な方法は、パッケージマネージャーコンソールに入力してNugetを使用することです 。
install-package NAudio
可変ピッチサウンドの生成プロセスについては、MSDNのCharles Petzoldによる記事で詳しく説明されています。 要するに、正弦波の音を生成するクラスを作成し、この波を再現するNAudioメソッドの入力に渡します。 いくつかの微妙な点があります。サウンドをよりスムーズに変化させるには、サウンドの周波数をスムーズに変化させると同時に、オーディオバッファリングの遅延を考慮する必要があります。 これらすべての微妙な点は、プロジェクトに配置する必要があるPortamentoSineWaveOscillator.csクラスで考慮されます。
サウンドを生成するには、 WaveOut型のオブジェクトを作成して初期化し、作成したオシレーターのインスタンスを渡します。
WaveOut WaveGen = new WaveOut(); PortamentoSineWaveOscillator Osc = new PortamentoSineWaveOscillator(44100,120);
ページコンストラクターで初期化を実行します。
WaveGen.Init(Osc); WaveGen.Play();
Osc.Pitchプロパティを変更して、それに応じてピッチを変更し、 Osc.Amplitudeでボリュームを変更するだけです。 指の水平方向の動きが音量を左右し、垂直方向がピッチを左右します。 快適なサウンドを実現するために、オッズは経験的に選択されます。
void dt_Tick(object sender, EventArgs e) { var fr = Leap.Frame(); if (fr!=null && fr.Fingers.Count>0) { var f = fr.Fingers[0]; ... // var p = Math.Abs(f.TipPosition.y / 2); var a = 255 - Math.Abs(f.TipPosition.x); if (p >= 0 && p <= 150) Osc.Pitch = p; if (a >= 0 && a <= 255) Osc.Amplitude = (short)a; } }
この段階でのプロジェクトのバージョンは、 ここから入手できます 。
最後の仕上げ
画面を動き回る通常の円の代わりに、プロジェクトをもう少し美しくするために、パーティクルシステム(パーティクルシステム)に基づく特殊効果を追加できます。 パーティクルのソースであるWPFコントロールのソースコードを提供するCodeProjectのこの記事を基礎としました。 最初のステップで追加した円を置き換えると、最終的なプロジェクトが得られます。そのプロジェクトのソースコードはGitHubで入手できます 。
宿題
実験を続けたい場合、創造性の範囲はほぼ無限です! 特に、次のことができます。
- ポリフォニーとマルチフィンガーコントロールのサポートを追加
- たとえば、ピッチを制御する他の方法を試すには、指の位置ではなく、その速度を基準としてください
- 特殊なサウンド(サンプル)を抽出するためのジェスチャーサポートを追加する
このトピックに興味がある場合は(コメントに書いてください)、一連の記事を続け、Leap Motion、Kinect、およびモバイルデバイスの予期しない使用に関連するさまざまな興味深いものを追加します。 何について聞きたいですか? たとえば、このビデオは、Leap Motionを使用して数時間で他に何ができるかを示しています。