Leap Motionベースのデジタルテルミン(.NETを使用)

Kinect for Windowsセンサーの登場以来、私そのようなデバイスのプログラミングに静かな情熱抱いてきました -あなたが書いたプログラムが遠くの人間の動きに反応するのは魔法のような感覚です! 今日は、同様のデバイスであるLeap Motionのプログラミングについて説明します。



実際、Leap Motionは手の位置を認識できる小さなKinectです。 作成者によると( このビデオによく反映されています )、多くの異なるシナリオでコンピューターを制御するために使用できます。 この投稿では、Leap Motion(.NETプラットフォーム上)のプログラミング方法と、それ基づいた単純な楽器( テルミン)の作成方法について説明します。 以下がその1つです。



プログラマー向けのLeap Motion


プログラマーの観点から、Leap Motionは便利なAPIのセットを提供し( ここで説明します )、次のことを可能にします。

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つの方法があります。

この例では、コントローラーのポーリングサイクルを作成するために、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を使用して数時間で他に何ができるかを示しています。

Source: https://habr.com/ru/post/J214907/


All Articles