はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

Leap対応アプリで審査の壁が越えられない

Leap Motion SDKはWindows Runtimeでも動作するお行儀のいいdllだというのは以前お話したと思います。

実際、Windowsストアアプリとして作成してVisual Studioではなく普通に実行しても動作することまでは確認できていました。

今回、某アプリコンテストに応募しようとストア申請をしたのですが(その前段階のWACK実行時にエラーがでて分かっていたのですが)、セキュリティテストと技術的な適合性でエラーになってしまいました。

image

セキュリティテストは、Leap.dllやLeapCSharp.dll「アプリが利用可能な Windows 保護を使用しない場合、ユーザーはマルウェアの攻撃を受けやすくなります。」とのことで、マルウェアが実行される可能性が高いという事でリジェクトされています。

image

技術的な適合性についても同様で、Leap.dllやLeapCSharp.dllからmsvcp100.dllのAPIを呼び出しているとのことですが、あれ?呼び出していたらなんで動くんだろうとちょっと不思議に思っています。

WACKってっこんなところまでチェックするですね。感心するとともに打てる対策が思い浮かばないです。

対策1:Windowsストアアプリ向けのC++ Runtime PackageLeapを参照して技術的な適合性チェックを回避⇒NG

image

まずは2013版を参照してみましたが、msvcp100.dllへの呼び出し自体が変わらないためWACKのチェックは変わりませんでした。

対策2:Leap Motion SDKはアプリに含まずに環境変数でPathを通してみる⇒NG

アプリ配布時にありがちな方法ですが、問題になったDLLは配布先で用意してもらうとして純粋に自前アセンブリ(+ブリッジ用のLeapCSharp.NET.4.0)のみをパッケージにするために、Lead.dllやLeadCSharp.dllをプロジェクト構成から追い出して、[ビルド]-[クリーン]後に再ビルドしました。

そしてLeap Motion SDKのインストールパス(例:C:\bin\Leap\LeapSDK\lib\x86)にパスを通して実行してみました。

はい、そうですね、ストアアプリなので環境変数で指定してもアクセスできません。

image

結論

ストア申請で、申請担当者のところまでたどり着ければ色々調整が効くような気がするのですが、その前段階の自動チェック部分ではねられてしまうため、機械的にじぇくとされてしまいどうにもなりません。

これは「Windows 8 Clinicの特別診療科目-相談科」に相談した方がよさそうですね。

Gitあたりでソース提供してアプリ配布というのが現実的なんですかねぇ。

 

Leap Motionを使ったWindwosストアアプリサンプルの解説

コードレシピに投稿してあるサンプルを題材にLeap Motionでどのように左右の手やどの指かを判別するのかを説明したいと思います。

説明に使うサンプルコードは以下のものです。ダウンロードしなくてもコードレシピのサイトでブラウザ上でコードを確認できます。

でも、励みにいなるのでダウンロードだけでもしていただきダウンロード数が伸びたらうれしいなって。

-----

Leap Motion Sample for Windows Store Apps

http://code.msdn.microsoft.com/Windows-Store-Apps-with-1e42d1ba

このサンプルアプリケーションは、Leap Motion Deviceから取得した指の位置の情報を使って、画面上に1~10までの数字の表示位置を調整して表示します。横方向は指の位置、縦方向は手の平の位置を使っています。

-----

Modelの構造

このサンプルはLeap Motion周りの定義をLeapModelファイルにのみ記載して、画面定義などはLeap Motionから独立した構成をとっています。

このような構成にすることで、Model部分を差し換えて他のNUI用のサンプルに容易に作り替えることができます。

LeapModel.vb(またはLeapModel.cs)ファイルの中は次のようなクラスが定義されています。

image

Leap Motionデバイスから情報を得たいときは、LeapModelクラスの中でSampleListenerクラスを生成しています。

そうすると、Leap Motionデバイスからフレーム情報が送られてくるとSampleListenerの中で処理をされて、DataイベントとしてLeapModelクラスに通知がやってきます。

LeapMotionクラスでは通知の中には指の位置が入っていますのでそれをItemプロパティに設定してあげてPropertyChangedイベントを発行することでBindingしているXAMLへデータを伝搬します。

SampleListenerの構造

SampleListenerクラスの要は「OnFrame」イベントプロシージャです。このイベントプロシージャは基本クラスであるLeap.Listenerに定義されているメソッドで、SampleListenerの中でOverridesして利用しています。

SampleListenerクラスの中の「On~」なメソッドはすべて基本クラスで呼び出しタイミングが制御されているメソッドをOverridesしたものです。

つまり、イベントはすべてLeap SDK側にて用意されていて、情報を得る処理やその他の必要な処理をそれぞれ各イベントが発生したタイミングで実行できるように、お約束に基づいてイベントプロシージャの中にコードを書いていくのがLeap対応プログラミングの基本的な流れになります。

なお、今回のように手や指の位置を得たいときは、OnFrameイベント時の処理を記述するだけで十分です。

どのように左右の手を判断しているか

Leap Motion SDKから得られる情報では、Kinectのように左手や右手という区別がありません。これはLeap Motionデバイスが「手」「指」「指状のもの」の検出に特化しており、手の先がどのように腕につながり、それがどのように胴につながっているかは検出してないからです。

そこで重要になってくるのが次のような判断です。

VB.NET
  1. Dim leapFrame As Frame = _controller.Frame   
  2.   
  3. Dim rightHand As Hand = leapFrame.Hands.Rightmost    
  4. Dim leftHand As Hand = leapFrame.Hands.Leftmost   
C#
  1. Frame leapFrame = _controller.Frame();    
  2.   
  3. Hand rightHand  = leapFrame.Hands.Rightmost;    
  4. Hand leftHand  = leapFrame.Hands.Leftmost;   

OnFrameイベントプロシージャの引数にはControllerがわたってくるので、Frameメソッドを実行して今回のOnFrameイベントに関連したフレームを取得します。

そしてそのフレームのHandsコレクションのRightMostメソッドは一番右に検出された手の位置、LeftMostメソッドは一番左に検出された手の位置になります。

左右どちらの手かをLeap Motionは検出できませんが手の位置関係は把握できるので、このサンプルではLeap Motionが検出した手の中から一番左右にあるものを左右の手と錦するように割り切っています。つまり、Leap Motionで左右を判断したのではなく、検出した位置から左右の手を識別するコードとなります。

 

RightMostとLeftMostを使うときの注意点としては、手が1つしか認識されなかった時は同じ手をこの2つのものが返してきてしまう点です。そのため、以下のようなロジックで手が1つしか検出されなかった時に左右を判断します。

具体的にはLeap Motionの中心位置が0であり、左右はX値のプラスマイナス(向かって左がマイナス値、右がプラス値)で左右を判断します。

VB.NET
  1. If (Not leftFingers.Empty AndAlso leftFingers(0).TipPosition.x < 0) Then   
  2. '左手として判断   
  3.   
  4. End Id   
  5. If (Not rightFingers.Empty AndAlso rightFingers(0).TipPosition.x > 0) Then    
  6. '右手として判断   
  7.   
  8. End Id  
C#
  1. if (!leftFingers.Empty && leftFingers[0].TipPosition.x < 0) {   
  2.    ///左手として判断   
  3.   
  4. }   
  5. if (!rightFingers.Empty && rightFingers[0].TipPosition.x > 0)    
  6.   
  7.    ///右手として判断   
  8.   
  9. }  

さて、いかがだったでしょうか。

Leapからは「左手」「右手」のように手の種別があがってこない点、そして、それを補う上でどのような前提で判断しているかをご理解いただけたでしょうか。

ただし、ここで使った判定法はかなり簡易的なもので、例えば手をクロスしたようなときは左右の手が反対に認識されてしまいます。

そのため、更に精度を上げるには、Leap Motionから得られる「手の方向」を使って肘の方向を予測し、肘の左右で手の左右を判断するという方式など検討する価値があります。もちろんこのようなときも変な方向に手首を意図的に向けるなどセンサーを欺こうとされると制度は落ちてしまいますので、センサーを欺く必要ない、または欺いてしまうと不利益になるようなアプリコンセプトの想定が必要でしょう。

 

どのようにそれぞれの指を判断しているか

 

 

 

 

手と同様に、指についてもLeap Motionから「親指」「人差し指」「中指」「薬指」「親指」という指種別は上がってきません。

手のグルーピングはできるので、あとは5本の指の指種別を位置関係から判定すればいいのですが、問題は、5本すべてが必ずしも検出されるわけではないという点です。

ちょっとした手の向きですぐに指先をロストしてしまうので、5本全部が検出できなかった時のことも考慮して指種別を特定しなければなりません。

このサンプルでは手の平をLeap Motion側に向けていることを前提として次のようなコードで指種別を特定しています。

VB.NET
  1. Dim finger = (From x In leftFingers Order By x.TipPosition.x Select x).ToList    
  2. For index As Integer = 0 To finger.Count - 1    
  3.     Me.Pos.Finger(index) = finger(index).TipPosition    
  4. Next   
C#
  1. var finger = (from x in leftFingers orderby x.TipPosition.x select x).ToList();    
  2. for (int index = 0; index <= finger.Count - 1; index++)    
  3. {    
  4.     this.Pos.Finger[index] = finger[index].TipPosition;    
  5. }   

 

このコードは左手のケースのコードですが、LINQを使って TipPosition.x順に並べます。手種別の判定から左手はLeap Motionの中心から向かって左に位置している訳なので、X軸はマイナスとなり、TipPosition.x順とは小指→薬指→中指→人差し指→親指に整列させるということになります。

もし検出数が5に満たない場合も、得られた位置を左寄せして小指から順番に認識します。

Windowsストアアプリで始めるLeap Motion入門

2013/09/21に開催される「.NETラボ勉強会 2013年9月」に登壇させていただけることになりました。

 

今回は、

「Windowsストアアプリで始めるLeap Motion入門」

として、Leap MotionをWindowsストアアプリから使う方法について、VB.NET/C#を使って具体的にお話したいと思います。

WindowsストアアプリのフレームワークであるWindows Runtimeから使えるNUIデバイスは少ないのですが(WinSoket経由は除く)、Leap Motion SDKはWindows Runtimeからも使えるため、簡単に手や指の位置を取得することができます。

http://code.msdn.microsoft.com/site/search?query=Leap%20Motion&f%5B0%5D.Value=Leap%20Motion&f%5B0%5D.Type=SearchText&ac=5

また、測定範囲もLeap Deviceの真上20cmくらいまでの範囲なので非常にコンパクトな空間で試すことが出来ます。

NUIは実際に見ていただくことで理解度が比較的に上がり、その後の開発へのモチベーションも生まれると思います。

ぜひ、この機会に一度ごらんいただけたら幸いです。

Leap Motion User Experience Guidelinesの日本語訳

Leap Motionの日本語情報は非常に限られているので公式ドキュメントをざっくり日本語訳にしました。誤訳などあったらお知らせください。

本エントリは

https://developer.leapmotion.com/documentation/GetStarted/Leap_UX_Guidelines.html

の日本語訳となります。

Leap Motion User Experience Guidelines

次に示すUXガイドラインは、Leap対応アプリケーションについて簡単に学び使えるようにするための提言が含まれています。

シンボルは、学んだり覚えたりすることが困難な場合があることに留意してください。

アプリケーションと対話するのに、複雑なジェスチャーを覚えることが必須とならないようにしてください

その代わり、物理的な相互作用と現実世界の行動からインスピレーションが得られるようにします。

物理的にインスパイアされた操作があると、すぐに使えてより直感的で自然なアプリだと感じられるでしょう。

これはあなたの世界なのですから、実世界の制限や不便によって制約を感じることはありません

常に操作する必要はありません。操作の代わりにより想像しやすい任意の方法で代用することが出来ます。なぜ、利用者が物に手を伸ばしてからつかむことを強制する必要があるのでしょうか?なぜ、物を引き寄せてからつかむような操作ができないのでしょうか?--フォースを信じるのです!

利用者は、彼らの意図が増幅されるよりも抑制されたまたはマスクされているように感じているはずです。

たとえば、マウスを使っているときに(モニタ上でマウスカーソルを10インチ動かすためにマウスデバイスを10インチ動かさなくてもすむように)意図が増幅されていることが好きです。ジェスチャー操作の場合も、意図を増幅したり応答を誇張することでよりよい結果を得ることが出来ます。念頭において欲しいのは、人によってはこのあたりが非常に重要で合ったりするので、自分好みにこの効果の感度を変更できるように感度設定へのリンクを用意しておくことです。

利用者の行動に対する動的なフィードバックを提供することに集中することで、より正確にアプリと対話できるようになります。

たとえば利用者は、「押す」ボタンが押されたときを知っておく必要がありますが、ボタン上に手をかざしているかが見えたり、どれくらい押しているかが見えたら効果的です。

画面上のビジュアル(手、ツールまたはデジタルフィードバック)は、シンプルで機能的で邪魔しないものである必要があります。

利用者は、ツールや環境によって作業が邪魔されないように、趣味に走った飾り付けをしないようにします。

破壊または非可逆的な操作に対しては、無害のものよりも意図的な行動を伴うような実装が必要です。

簡単なジェスチャーは簡単な操作のために確保しておきます。逆に、アプリケーションを終了するか、ファイルを削除するなどの非可逆的な操作(操作が完了すると後戻りできない)は、確認プロンプトをだすなどのダブルチェックを伴う実装が必要です。

ナビゲーションとインタラクションの間で2つの操作がある場合、シンプルであるか片方が自動的に処理することで、明確な描画や雰囲気を提供します。複雑な2つの状況の同時提供は混乱や方向感の喪失へと繋がります。

たとえば、3D環境において利用者はアングルと位置決めを同時に行うことは困難です。視野角が利用者の動きにより自動的に移動する場合は、そのオブジェクトを操作すること容易です。同様に大規模なデータセットをナビゲートするときは、利用者にとっては容易に移動するためのビューが良いですが、データの一部を強調するときはビューは固定化されていた方が良いでしょう。

アプリを使うときにチュートリアルや説明がない状況を想像してみてください。

利用者の最初の直感的な推測を正しいものにするためにすべての局面で努力します。それが必要なのであれば何かをする複数の適切な方法を実装します。

Leap Motion Architectureの日本語訳

Leap Motionの日本語情報は非常に限られているので公式ドキュメントをざっくり日本語訳にしました。誤訳などあったらお知らせください。

本エントリは

https://developer.leapmotion.com/documentation/GetStarted/Leap_Architecture.html

の日本語訳となります。

Leap Motion Architecture

Leap Motionコントローラーは、一般的なクライアントOSをサポートしています。Leap MotionソフトウェアはService(Windows)またはdaemon(MacとLinux)として実行されます。ソフトウェアはUSB経由でLeap Motionコントローラーデバイスと接続します。Leap対応のアプリケーションはLeap Motion serviceにアクセスしてモーショントラッキングデータを受信します。Leap Motion SDKは、Leap Motionデータを取得するために、ネイティブインターフェースとWebSocketインターフェースの2つのAPIが用意されています。これらのAPIを使用すると、ブラウザ環境で実行されるJavaScriptなど、いくつかのプログラミング言語でLeap対応のアプリケーションを作成することができます。

注意:

Leap Motion service/daemon127.0.0.1:5905のTCPポートを使ってアプリケーションと通信します。このアドレスとポートがファイアウォールや他のプログラムによって遮断されないようにしてください。

Topics

Application Programming Interfaces

Leap Motion SDKにはLeap Motion serviceからトラッキングデータを取得するためのネイティブインターフェースとWebSocketインターフェースの2つのAPIが用意されています。ネイティブインターフェースは、新しいLeap対応アプリケーションを作成するために使用するDLLです。WebSocketインターフェースやJavaScriptクライアントライブラリを使用すると、Leap対応のWebアプリケーションを作成することが出来ます。

Leap Motion Application Interface

アプリケーションインターフェースは、DLLとして提供されます。このライブラリは、Leap Motion serviceに接続し、トラッキングデータをアプリケーションに提供します。C++Objective-Cアプリケーションでライブラリをリンクできます。また、JavaVB.NET / C#及びPythonからはそれぞれの言語用バインディングを使って直接ライブラリにリンクすることもできます。

  1. Leap Motion serviceはUSB経由でLeap Motionコントローラーからデータを受信します。そして、その情報を処理してLeap対応アプリケーションにデータを送信します。デフォルトでは、サービスはフォアグランドアプリケーションにトラッキングデータを送信します。しかし、アプリケーションはバックグランドでデータを受信するように要求できます。この要求はユーザーにより拒否できます。
  2. Leap Settings Appは、サービスとは別に実行され、利用者がLeap Motionの設定を構成できます。Leap Settings AppはWindowsならばコントロールパネルアプレットとして、Mac OS Xならメニューバーアプリケーションとして実装されています。
  3. フォアグランドのLeap対応アプリケーションが、Leap Motion serviceからモーショントラッキングデータを受け取ります。Leap対応アプリケーションはLeap Motionネイティブライブラリを使用してLeap Motion serviceに接続できます。
    ネイティブライブラリとの接続は、C++Objective-Cならば直接、JavaVB.NET / C#およびPythonならば言語ラッパーライブラリを貸してリンクできます。
  4. Leap対応アプリケーションがバックグラウンドになったときは、Leap Motion serviceはそのアプリに対してのデータの送信を停止します。バックグランド動作できるアプリケーションであれば、バックグラウンドになったときにデータ受信を要求することが出来ます。バックグラウンドでは、構成設定はフォアグラウンドアプリによって決定されます。
Leap Motion WebSocket Interface

Leap Motion serviceがlocalhostの6437ポートでWebSocketThe サーバーとして動作します。WebSocketインターフェースはJSONメッセージの形式でトラッキングデータを提供します。JavaScriptクライアントライブラリは、JSONメッセージを通常のJavaScriptオブジェクトとしてトラッキングデータを提供します。

  1. Leap Motion serviceは「http://127.0.0.1:6437」でリスニングするWebSocketサーバーを提供します。
  2. Leap Motionコントロールパネルを使って利用者がWebScoketサーバーの有効/無効を設定できます。
  3. サーバーはJSONメッセージ形式でトラッキングデータを送信します。アプリケーションからはサーバーに設定メッセージを送信することができます。
  4. leap.jsクライアントJavaScriptライブラリは、Webアプリケーションで使用されることを前提としています。ライブラリはサーバーへの接続を確立し、JSONメッセージを処理します。JavaScriptライブラリによって提供されるAPIはネイティブAPIの考え方と構造を踏襲しています。

このインターフェースはWebアプリケーションでの使用を想定していますが、WebSocket接続ができればWebアプリケーション以外からも使用することがdけいます。サーバーはRFC6455に準拠しています。

Programming Language Support

Leap Motion ライブラリはC++で記載されています。Leap Motionは、オープンソースツールであるSWIGを使って、VB.NET /C#JavaPythonの言語バインディングを生成しています。SWIGで生成された言語バインディングは対応したプログラミング言語の呼び出しを対応したC++で作成されたLeap Motion ライブラリの呼び出しに変換します。各SWIGバインディングは2つの追加ライブラリを使用しています。JavaScriptとWebアプリケーション開発では、Leap Motion WebScoketのサーバー及びクライアント側のJavaScriptライブラリを提供します。

すべてのライブラリ、コード及びLeap対応アプリケーションやPlug-inを開発するために必要なヘッダファイルは、leap.jsクライアントJavaScriptライブラリを除いてLeap Motion SDKに含まれています。Leap Motion SDKLeap Motion Developer Portalからダウンロードすることが出来ます。SDKパッケージはサポートされている各オペレーティングシステムで利用可能です。JavaScriptクライアントライブラリは別に配布されており、LeapJS GitHub repository からダウンロードすることができます。

C++

C++Leap Motionコントローラー向けの開発をするために、APIヘッダファイルをプログラムに追加し、Leap Motion ライブラリとのリンク、プラットフォームに応じたlibLeap.dylib、Leap.dllまたはlibLeap.soのいづれかを含めてください。

Objective-C

Objective-Cのアプリケーションは、手書きのラッパーコードによってサポートされます。Leap対応のObjective-Cアプリケーションを構築するには、ラッパーヘッダーとObjective-C++コードファイルをLeap Motion  C++ ヘッダーと共にアプリケーションに取り込んでください。(それ以外の場合) 純粋な客観的 C アプリケーションでのラッパーで定義されているクラスを使用することができます。LibLeap.dylib を使用してアプリケーションをリンクし、ライブラリ アプリケーション パッケージに含めます。その後、Objective-Cのアプリケーションでラッパーで定義されたクラスを使用することができます。libLeap.dylibを使用してアプリケーションをリンクすると、アプリケーションパッケージにライブラリが含まれるようになります。

VB.NET / C#

VB.NET / C#のmクラス定義は、.NET Framework 3.5用と.NET Framework 4.0用を提供しています。コードからはLeapCSharp.NET3.5.dllまたはLeapCSharp.NET4.0.dllのどちらか(同一名前空間なのでターゲットプラットフォームに合うほうを選択)を参照します。このライブラリからは、libCSharp.dylib (Mac)、LeapCSharp.dll (Windows)、libCSharp.so (Linux)のいずれかが呼び出されます。中間ライブラリはそれぞれlibLeap.dylib、Leap.dll、libLeap.soになります。

Java

Leap.jarにはLeap Motion Javaクラスが含まれています。コードは、libLeapJava.dylib (Mac)、LeapJava.dll (Windows)、libLeapJava.so (Linux)を読み込みます。各ライブラリにはJavaからの呼び出しを変換し、libLeap.dylib、Leap.dll、libLeap.soにある基本Leap Motion APIを呼び出すネイティブコードが含まれています。中間ライブラリはそれぞれlibLeap.dylib、Leap.dll、libLeap.soになります。

Python

Leap.pyにはLeap Motion Javaクラスが含まれています。コードは、LeapPython.so (MacとLinux)、LeapPython.dll (Windows)を読み込みます。中間ライブラリはそれぞれlibLeap.dylib、Leap.dll、libLeap.soになります。

JavaScript

Leap Motion JavaScriptは2つの主要コンポーネントがあります。最初のコンポーネントLeap Motion serviceによって提供されるWebSocketサーバーです。WebSocketサーバーはWebアプリケーション(もしくはWebSocketに接続できる任意のアプリケーション)からLeap Motion トラッキングデータをJSONフォーマットメッセージとしてアクセスできるようにします。第二のコンポーネントJavaScriptクライアントライブラリのLeap.jsです。Leap.jsはWebSocketのJSON出力をLeap MotionのネイティブAPIと一貫性のある構造に変換するためのオープンソースJavaScript APIです。

Other Languages

利用可能なコミュニティ製の言語バインディングが多数あります。その一部は、Links and Libraries を参照ください。

Operating System Support

    Leap Motion ソフトウェアは、OS X 10.6以降とWindows 7以降をサポートしています。実験的なα版であるLinux版は開発者が構築する場合のみ利用可能です。

    Setting up a Unity projectの日本語訳

    Leap Motionの日本語情報は非常に限られているので公式ドキュメントをざっくり日本語訳にしました。誤訳などあったらお知らせください。

    本エントリは

    https://developer.leapmotion.com/documentation/Languages/CSharpandUnity/Guides/Setup_Unity.html

    の日本語訳となります。

    Setting up a Unity project

    Leap Motionトラッキングデータ用Unityプラグインを使ってLeap Motion SDKをUnityアプリケーションからアクセスすることが出来ます。この記事では、UnityのProバージョンがサポートしているプラグイン昨日を使用する方法について説明します。ネイティブライブラリプラグインをサポートしていないUnityスタンダード版で使うはCreating Leap Motion apps with Unity (standard license)を参照ください。

    Topics:
    • Leap Motion C# Libraries for Unity
    • Create a project
    • Accessing the Leap Motion API
    • Building 64-bit Windows Unity applications
    • Exiting cleanly on Windows with Unity3D 3.5

    Leap Motion C# Libraries for Unity

    Leap Motion SDKには、プラットフォームごとにアプリケーションのビルドターゲットに応じた複数のバージョンが含まれています。

    UnityエディタでLeap Motion SDKを使用するには、アプリケーションのPluginsフォルダに32ビットライブラリを追加する必要があります。Macであれば32bitと64bitでは同じライブラリファイルを使いますが、Windowsの場合は稼動OSのビット数に応じたライブラリを指定する必要があります。

    Unityの中で以下のライブラリを使用します:

    • 32-bit Windows:

      • LeapSDK/lib/UnityAssets/Plugins/LeapCSharp.NET3.5.dll ? Leap Motion C# library for .NET 3.5
      • LeapSDK/lib/UnityAssets/Plugins/LeapCSharp.dll ? 32-bit Leap Motion C# library for Windows
      • LeapSDK/lib/UnityAssets/Plugins/Leap.dll ? 32-bit Leap Motion library for Windows

       

    • 64-bit Windows:

      • LeapSDK/lib/UnityAssets/Plugins/LeapCSharp.NET3.5.dll ? Leap Motion C# library for .NET 3.5
      • LeapSDK/lib/x64/LeapCSharp.dll ? 64-bit Leap Motion C# library for Windows
      • LeapSDK/lib/x64/Leap.dll ? 64-bit Leap Motion library for Windows

      Note: Do not use the 64-bit libraries in the Unity editor on Windows.

       

    • 32- and 64-bit Mac OS:

      • LeapSDK/lib/UnityAssets/Plugins/LeapCSharp.NET3.5.dll ? Leap Motion C# library for .NET 3.5
      • LeapSDK/lib/UnityAssets/Plugins/LeapCSharp.bundle ? Leap Motion C# bundle for Unity

    Create a project

    まず、辛苦プロジェクトを作成します:

    1. Unityエディタを開く
    2. [ファイル]-[新規プロジェクト]を選択
    3. 名前と保存場所を選択
    4. [プロジェクトの作成]をクリック

    Leap Motionライブラリをプロジェクトに追加します:

    1. UnityプロジェクトのAssetsフォルダに移動
    2. Leap Motion SDKのlibe/UnityAssetsフォルダからUnityプロジェクトのAssetsフォルダのPluginsフォルダにコピー

    注意:

    暮らすプラットフォームビルドを有効にするためにPlauginsフォルダにMacとWindowsの両方のライブラリを配置することが出来ます。しかし、x64のWindowsプラットフォームに対するx86用ビルドを行うための考慮事項についてはBuilding 64-bit Windows Unity applicationsを参照してください。

    Accessing the Leap Motion API

    PluginsフォルダにLeap MotionライブラリとAPIを使うスクリプトを追加できます。Leap Motionクラスは、Leap名前空間として定義されます。Leap Motion APIにアクセスする基本的なMonoBehaviorクラスは次のようになります:

    VB.NET
    Imports UnityEngine
    Imports System.Collections
    Imports Leap
    
    Public Class LeapBehavior
        Inherits MonoBehaviour
        Private _controller As Controller
    
        Public Sub Start ()
            _controller = New Controller
        End Sub
    
        Public Sub Update ()
            Dim _frame As Frame = _controller.Frame()
            'do something with the tracking data in the frame...
        End Sub
    End Class
    
    C#
    using UnityEngine;
    using System.Collections;
    using Leap;
    
    public class LeapBehavior : MonoBehaviour {
        Controller controller;
    
        void Start ()
        {
            controller = new Controller();
        }
    
        void Update ()
        {
            Frame frame = controller.Frame();
            // do something with the tracking data in the frame...
        }
    }
    

    このサンプルではLeap.Listenerサブクラスを使用していないことに注意してください。Unityアプリケーションの場合、UnityエンジンからUpdateメソッドによりLeap Motionコントローラから現在のフレームを取得することで自然なフレームレートを実現できます。

    注意:

    Leap.Listenerサブクラスを使う方法だと、UnityエディタとUnityアプリケーションをWindows上で終了しようとするとにフリーズすることがあります。これは、Unityでマネージコードと案マネージコード間でコールバックを使うときに発生するスレッドの問題によるものです。この問題を回避するには「Exiting cleanly on Windows with Unity3D 3.5」を参照ください。

    Building 64-bit Windows Unity applications

    UnityでLeap対応アプリケーションを構築する場合、Unityエディタは自動的にPluginsフォルダからLeap Motion ライブラリをコピーします。Pluginsフォルダにはクラスプラットフォームビルドが行えるようにWindows x86Mac OSの両方のLeap Motionライブラリをおくことが出来ます。ただし、x86ライブラリとx64ライブラリを共存させることは出来ません。

    WindowsではUnityエディタが開発中にアプリケーションを実行するために、32bit(x86プラットフォーム)ライブラリがPluginsフォルダに入れる必要があります。x64ぷラットファーム用にビルドするためには、Unityがアプリケーションの実行ファイルを出力するフォルダに32bitライブラリをコピーするので、その後に手動で32bitライブラリに対してLeap Motion SDKのlib/x64フォルダから64bitバージョンのライブラリを上書きコピーする必要があります。

    Macでは、Pluginsフォルダに32bitのWindows Leap Motionライブラリか64bit Windowsライブラリのどちらか一方を配置できます。もし、Macで32bitと64bitの両方のWindowsプラットフォーム用にビルドする場合は、Leap Motionライブラリの正しいバージョンを使用して確認する必要があります。アプリケーションを構築した後に、出力フォルダに正しいライブラリをコピーすることによって確認することが出来ます。

    Exiting cleanly on Windows with Unity3D 3.5

    Monoはアプリケーション終了時にスレッドを閉じる方法に問題があるため、Unity3DエディタとLeap対応アプリケーションの終了時にハングします。この問題はWindowsコンピュータで発生し、Unity 4を使う別バージョンのMonoでは発生しません。この問題はLeap Motionイベント処理のLeap Motion Listenerを使用する場合のみ発生します。

    終了時にハングしないようにするためには、次のコードを追加します:

    VB.NET
    #If UNITY_STANDALONE_WIN Then
         _
        Shared External  Sub mono_thread_exit()
    #End If
    
        Sub OnApplicationQuit()
            controller.Dispose()
            listener.Dispose()
    #If UNITY_STANDALONE_WIN AndAlso Not UNITY_EDITOR AndAlso UNITY_3_5 Then
            mono_thread_exit()
    #End If
    
    C#
    #if UNITY_STANDALONE_WIN
      [DllImport("mono", SetLastError=true)]
      static extern void mono_thread_exit();
    #endif
    
      void OnApplicationQuit() {
        controller.Dispose();
        listener.Dispose();
    #if UNITY_STANDALONE_WIN && !UNITY_EDITOR && UNITY_3_5
        mono_thread_exit ();
    #endif
    

    このコードスニペットを使用する場合、Leap.Listenerサブクラスを使わなければなりません。


    Copyright c 2012-2013 Leap Motion, Inc. All rights reserved.

    Leap Motion proprietary and confidential. Not for distribution. Use subject to the terms of the Leap Motion SDK Agreement available at https://developer.leapmotion.com/sdk_agreement, or another agreement between Leap Motion and you, your company or other organization.

    WindowsストアアプリとLeap Motionを組み合わせたサンプル

    非常に簡単なサンプルですが、WindowsストアアプリでLeap Motion SDKからの値を表示するサンプルをコードレシピに投稿しました。

    http://code.msdn.microsoft.com/Windows-Store-Apps-with-1e42d1ba

     

    あとでC#も登録しますが、実行して左手をかざした結果は次のようになります。

    image

     

    Leap Motion SDKからListenerを使って計測値を取得るする方法や、LeapのスレッドからUIスレッドに切り替える方法などのサンプルとなっています。