凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

Leap Motion が届いたので Unity で動かしてみた

はじめに

話題の 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 の各イベントハンドラを登録、この結果、例えば位置更新などでは、
      1. LeapInput.Update(Leap.Controller.Frame() で Leap Motion から情報を取得)
      2. LeapInput.DispatchUpdatedEvents
      3. LeapInput.PointableUpdated
      4. LeapUnityHandController.OnPointableUpdated
      5. LeapUnityHandController.updatePointable
    • の順で呼び出しが行われ、結果として指の位置が更新されます。手のマテリアルの交換やコライダの有効/無効などもここでやっています。
  • LeapUnitySelectionController.cs
    • 動かす対象の位置 / 回転 / スケーリングの更新をやっているようです。動かす対象は「Touchable」タグがついているもの全てになるので、例えばデフォルトでは SceneObjects > Cube の1つだけですが、Sphere なども追加すれば同じく触れるようになります。

  • LeapUnityExtensions.cs
    • Leap の世界と Unity の世界の座標の仲立ちをする静的クラスです。LeapUnityBridge.cs で設定しているのは見かけましたが、どこで使っているのかは不明。
  • LeapFingerCollisionDispatcher.cs
    • 直接衝突しなくても RayCast で当たり判定を判定できるためのものです。LeapUnityBridge.cs でそれぞれの Tip(指先)にアタッチされています。Hit した結果は、LeapUnitySelectionController.onRayHit に飛んできますがデフォルトでは空実装になっています。
MainCamera
  • DrawGrids.cs
    • OpenGL でグリッドのメッシュを描いています
  • MainMenu.cs
    • OnGUI でパラメタの Enabled/Disabled などのメニューを表示します。
  • MouseOrbit.js
    • マウスでカメラをグリングリン動かすためのスクリプト(JS)です。


以上が使用されているスクリプト全容になります。

吸着でなくしてみる

やっつけですが、LeapFinger に Collider と Rigidbody(Use Gravity を off、Is Kinematic を on)、対象のオブジェクトの Tag を外して Rigidbody を追加すれば吸着でなく物理演算できるようになります。

おわりに

アイディア次第で色々出来そうな気がします!
Leap Motion SDK は他の言語もあるので C++ とか JS とかも試してみたいです。