はじめに
話題の Leap Motion が届いたので色々遊んで見ています。精度 / 反応共にかなり気持よく動いてくれていて、Airspace Store というストアがあり、そこからダウンロードしたアプリで遊んでいると時間を忘れてしまいそうです。ただアプリで遊ぶのも良いですが、やはり開発をしたいと思い、まずは手始めに Unity の Sample から触ってみました。
使い方
開発者サイトからサンプルを落としてきます。Examples フォルダ内に UnitySandbox というものがあるので、Assets > Scenes > UnitySandbox.unity でサンプルを開くことができます。
認識した指を人生ゲームのキャラクタみたいな形(Body + Tip)で表して、物体を吸着し、回転させたり拡縮できるものです。以降の開発も考えて、Assets から Export Package しておくと取り回しが楽になります。
スクリプト紹介
LeapController
「LeapUnityBridge.cs」と「LeapUnitySelectionController.cs」がアタッチされています。
- LeapUnityBridge
- LeapInput.cs の Update の呼び出しと、LeapUnityHandController.cs をアタッチした手を作る Script で、いくつかの public なフィールドがあります。例えば Palm Template は手のオブジェクトの手のひら部分の GameObject を指定することができ、デフォルトでは LeapPalm (空オブジェクト)になっています。LeapInput.Update の呼び出しは Update / FixedUpdate の切り替えが可能です。
- LeapInput.cs
- 静的クラスで Leap.Controller(LeapCSharp.NET3.5.dll 内)からやってくるイベントに対応したイベントハンドラを Update のタイミングで呼びます。LeapUnityHandController.cs 内でこれらのイベントが登録されています。
- LeapUnityHandController.cs
- LeapUnityBridge で構築された手にアタッチされた Script。Start で LeapInput の各イベントハンドラを登録、この結果、例えば位置更新などでは、
- LeapInput.Update(Leap.Controller.Frame() で Leap Motion から情報を取得)
- LeapInput.DispatchUpdatedEvents
- LeapInput.PointableUpdated
- LeapUnityHandController.OnPointableUpdated
- LeapUnityHandController.updatePointable
- の順で呼び出しが行われ、結果として指の位置が更新されます。手のマテリアルの交換やコライダの有効/無効などもここでやっています。
- LeapUnityBridge で構築された手にアタッチされた Script。Start で LeapInput の各イベントハンドラを登録、この結果、例えば位置更新などでは、
- LeapUnitySelectionController.cs
- LeapUnityExtensions.cs
- Leap の世界と Unity の世界の座標の仲立ちをする静的クラスです。LeapUnityBridge.cs で設定しているのは見かけましたが、どこで使っているのかは不明。
- LeapFingerCollisionDispatcher.cs
- 直接衝突しなくても RayCast で当たり判定を判定できるためのものです。LeapUnityBridge.cs でそれぞれの Tip(指先)にアタッチされています。Hit した結果は、LeapUnitySelectionController.onRayHit に飛んできますがデフォルトでは空実装になっています。
吸着でなくしてみる
やっつけですが、LeapFinger に Collider と Rigidbody(Use Gravity を off、Is Kinematic を on)、対象のオブジェクトの Tag を外して Rigidbody を追加すれば吸着でなく物理演算できるようになります。
おわりに
アイディア次第で色々出来そうな気がします!
Leap Motion SDK は他の言語もあるので C++ とか JS とかも試してみたいです。