Leap Motionの紹介



こんにちは、こんにちは!



今日は、偶然に(そして無料でさえ!)偶然手に落ちた、小さいながらも面白いガジェットの簡単なアプリケーションについてお話したいと思います。

私たちは、サイトで「魅力的な」$ 79.99を誇示するLeapMotionというデバイスを検討し、試してみます...

彼についてさらに説明します。



まず、デバイス自体について少し説明します。 これは、手の動きをキャプチャする小さなフラッシュのようなデバイスです。 一種の「キラー」キネクトaとして前進する。 wikiで詳細を読むことができます







すでに述べたように、彼は私がこのガジェットを開発分野の1つとしていた小さな Microsoftのハッカソンで偶然に来ました。 この奇跡のデバイス に関する記事がすでにHabrのオープンスペースに掲載されていることを言及する価値もありますが、 わかりやすいロシア語のチュートリアルは見つかりませんでした。



しかし、ポイントに近い。

アクション自体は約6時間しか続かなかったため、私とチームは自分で新しいテクノロジーをその場で把握する必要がありました。 ルービックキューブのアナログを開発し、これらのツールにUnity3dを使用することが決定されました。これは、このようなタスクに最適です。 ドキュメントはすぐに見つかり、私たちは始めました。



次に、順番に。



1)ドライバー


ドライバーは、作成者自身の公式Webサイトに役立ちます 。 特に問題はありません。唯一の迷惑な要素は、このデバイスを試して、モニターに5本の指を置いて、すべての人に知られている写真を見るために必要な登録でした。



2)SDK


SDK自体には、開発に必要な一連のライブラリと作業例が含まれています。UnitySandboxは、基本的に手の構造を示す同じアプリケーションです。 唯一の変更点は、実際のキューブを感じることができるようになることです! 貧しいキューブで、他のあらゆる種類の汚いトリックを上げたり下げたり、増やしたりすることができます。

興味深いSDKはここで終わります。



3)アプリケーション


SDKのサンプルを使用するのは面白くないので、この奇跡に取り組むために自分の自転車をひねる必要がありました。

さあ、始めましょう。 まず、プロジェクトを作成し、ダウンロードしたSDK(x86用)から取得したライブラリフォルダーに次のdllを追加します。

x86 / LeapCSharp.dll

x86 / Leap.dll



次に、LeapCSharp.NET.3.5.dllファイルをAssetsフォルダーに追加します。

次に、元の名前LeapBehaviorでスクリプトを作成し、メインカメラに割り当てて、次のコードを追加します。



LeapBehavior.cs


using UnityEngine; using System.Collections; using Leap; public class LeapBehavior : MonoBehaviour { Controller controller; void Start () { controller = new Controller(); } void Update () { Frame frame = controller.Frame(); //  if(controller.IsConnected) //,     { Frame frame = controller.Frame(); //  ( ) Frame previous = controller.Frame(1); //...   Debug.Log(frame.Fingers.Count); //      } } }
      
      





コントローラーとフレームについて一言。 最初のものは、デバイス自体を管理および制御するために必要です。Frameには、現時点で奇跡のガジェットを「見る」ことができたすべてのものが含まれています。 Frameは、表示されている手、ブラシ、指、および他のすべてのチャームのリストを返すこともできます。

frame.Fingers.Countは、デバイスから見たすべての指を含むリストのサイズを返します。



チェック-動作します。



ただし、いくつかの微妙な点があります。 第一に、リープモーションは、指を1つにまとめることを非常に頻繁に考慮し、次に、どの手が指に属しているか(2つの手が隣り合って交差-広がり-一緒になっている)を判別できないことが多く、貧弱なセンサーは信じられないほどのものを示すことができますが、これらは些細なことです。



指の数が決まったら、今度は自分の位置を見つけようとします。 すべてはまだ簡単です。更新機能を少し変更するだけです。 ログへの出力後、次の行を追加します。



 int IDFinger = 0; Debug.Log(frame.Fingers[IDFinger].TipPosition.x);
      
      





Fingersを使用して、Freamで指のシートを取得し、0番目の位置を取得します。



では、どうにかそれを視覚化してみましょう。 最速かつ最も簡単な方法を使用します。 何らかの種類のオブジェクトを指に取り付けてみましょう。 たとえば、スコープ。 これを行うには、球体をシーンに追加し、スクリプトを追加します(メインカメラから同じスクリプトを削除することを忘れないでください)。



次に、球の位置が指の位置とともに変化するように変更します。 これを行うには、Vector3(X、Y、Zの3つのコンポーネントを含むオブジェクト)を作成します。 センサーから受け取った指の座標で初期化します。 また、指を視覚化するには、fingerControllerという新しいスクリプトを作成します。 その結果、わずかに修正されたスクリプトは次のようになります。



 <h6>fingerController.cs </h6> <source lang="cs"> using UnityEngine; using System.Collections; using Leap; using System; public class fingerController : MonoBehaviour { public int IDFinger = 0; Controller controller; void Start () { controller = new Controller(); } void Update () { if(controller.IsConnected) //controller is a Controller object { Frame frame = controller.Frame(); Frame previous = controller.Frame(1); this.transform.position = new Vector3(frame.Fingers[IDFinger].TipPosition.x, frame.Fingers[IDFinger].TipPosition.y, frame.Fingers[IDFinger].TipPosition.z); } } }
      
      







理論的には、オブジェクト-球体は、IDFingerフィールドに番号が示されている指の後に浮かぶ必要があります。 たとえば、そのように。







球体の色をお気に入りに変更して(背景とは異なるように)、アプリケーションを起動して歓声を上げます-すべてが機能します!

2番目の指の球体を形状に追加します。 プロジェクトを開始したら、指をすべての方向にひねります。 球は指の動きに追従する必要があります。



ここで別の問題が起こります-指の座標は、たとえば-100から100まで非常に鋭く変化し、人にとってはセンチメートルであり、デバイスにとっては深刻です。 したがって、球体が地平線を超えて飛んでいないことを確認するには、メインカメラを遠ざけてより広い範囲をカバーします。



次に、 「rubik's cube」自体を追加し(通常のキューブを使用することもできます)、回転させてみてください。







これを行うには、簡単なスクリプトを作成します。



少なくとも2本の指でキューブを移動して移動できることに同意します。

キューブをフォームにドラッグし、同じ場所のプレハブに追加し、新しいスクリプトを追加して、「enterCube」という名前を入力します。 Box Colliderプロパティを追加し、キューブがトリガーであることをチェックします。 次のコードをコピーします。



enterCube.cs


 using UnityEngine; using System.Collections; using System.Collections.Generic; public class enterCube : MonoBehaviour { private int CountOfFingerInCube = 0; private List<Collider> ListFinger = new List<Collider>(); void Start () { } void FixedUpdate () { if(CountOfFingerInCube==2) { Vector3 vector = new Vector3(0,0,0); vector.x = (ListFinger[0].transform.position.x + ListFinger[1].transform.position.x)/2; vector.y = (ListFinger[0].transform.position.y + ListFinger[1].transform.position.y)/2; vector.z = (ListFinger[0].transform.position.z + ListFinger[1].transform.position.z)/2; this.transform.position = vector; } } void OnTriggerEnter(Collider other) { CountOfFingerInCube++; ListFinger.Add(other); } void OnTriggerExit(Collider other) { CountOfFingerInCube--; ListFinger.Remove(other); } }
      
      







ListFingerについて簡単に説明します。 トリガーに入るすべての指をそれ自体に保存し、終了するとリストから離れる指を削除します。

チェック-キューブは本当に動きます。 ただし、回転しません。 Vector3.Angleを使用して回転角度を見つけることは難しくないと思います。



以下は、現時点での作業の結果です(その後、デバイスのリース時間が経過し、返却する必要がありました)。







ビデオの最初の部分では、両方の指が近すぎると、立方体が異なる方向にスローされることがあります。 これは、センサーの欠陥が原因であり、指の実際の座標を区別できない場合があります。

各指の座標を個別に決定する精度に問題はありません。 デバイスは、1か所で保持しようとすると、わずかな手の動きでも座標の明確な変化に反応します。

つまり、将来的には、Leap motionを使用して、ノートブックの優れたシミュレーターを作成できます。 それは特別なペンで構成されていますが、設定は私たちよりずっと前に行われたため、触れることはできませんでした。



プロジェクトが完了するとすぐに、そのソースへのリンクが表示されます。



ありがとう



PSこのイベントに参加し、この素晴らしいデバイスの開発を助けてくれた友人たちにも感謝しています!



All Articles