UnityでLeap Motionを使う



ATLではLeap Motionも機材として提供されています。Leap Motionは2012年から発売されているので目新しさは感じないものの、手のジェスチャーによってコンピューターを操作するためのデバイスの筆頭としてVR/ARとも連携して活用されることもあるかと思います。本記事では、UnityでLeap Motionを使うやり方を紹介したいと思います。

UnityでLeap Motionを使うためには、2016年にLeapから提供されたOrionというライブラリを利用するのが通例です。
Unity Assets for Leap Motion Orion Beta

上のリンク先ページの説明の通り、UnityでLeap Motionを動かすために、Coreと呼ばれるUnity用アセットを使用します。この「Core」をUnityに読み込めば、Unity上に手を表示させて動かしたり、オブジェクトを指で押すといった物理表現ができます。
このCoreアセット(パッケージ)を基本機能として、さらにUnity Modulesと呼ばれるLeap Motionが提供する機能拡張モジュールを追加で組み込んでいけば、できることが広がります。2018年1月時点でモジュールは以下の3種が提供されています。

  • Leap Motion Interaction Engine(1.1.0)
    Coreの機能だけだと、オブジェクトを掴んだりしようとすると衝突判定が過敏すぎて、対象オブジェクトが弾き飛んでいったりします。Interaction Engineモジュールを使うことで、Unity物理空間と現実の手とのインタラクションをより自然に表現できます。Unity & Leap Motionで物を掴んだり投げたり、指でボタンを押したり等の手を使ったインタラクティブ表現をやるなら導入すると良いです。
  • Graphic Renderer(0.1.1)
    モバイル用途やVR/AR検証用に、Unityのドローコールを減らすことができるモジュール。
  • Hands Module(2.1.1)
    リアルな手、ローポリの手、悪魔の爪のような手や半透明の手などなど、いろんな手のモデルを使いたい場合のモジュール。自分でモデリングした手を活用したい時にも利用します

上に挙げたLeap MotionのUnity用パッケージは、Unity自体のバージョンアップの影響もあって更新頻度も多く、Web上の過去記事を参考にすると内容が変わってしまっていることもありますので、基本はLeapMotionが提供する公式ドキュメントを参考にすると良いでしょう。
公式ドキュメント:Getting Started with Unity Modules


Unity上でLeap Motionを使うための手順

1. まずはUnityを起動する以前の設定となりますが、Leap MotionをPCで使うために、PCにデベロッパーキットをインストールしておく必要があります。

2. 次に、Unity上でLeap Motionを動かすために、先述のCoreをUnityに読み込みます。

Unity Assets for Leap Motion Orion Betaのページから、「DOWNLOAD UNITY CORE ASSETS 4.3.3(2018.1.10現在)」ボタンからCoreパッケージをダウンロードし、解凍しておきます。
※ダウンロードするためにはログインユーザーになる必要があるので、未登録の人はここでメールアドレスを使ってユーザー登録する必要があります。

3. Unityを起動しAssetsメニューのImport Package > Custom PackageからOrionをインポートすると、ProjectウインドウにLeapMotionフォルダが読み込まれます。

サンプルシーンも用意されています。Prefabフォルダの中に後述するコントローラーや手のモデルが入っています。

閑話休題:Leap Motionのサイトや、そこで提供しているライブラリ等を見ると気付くのですが、Leap Motionとしては全体的にVR/ARとの併用を重要視しています。ですが本記事ではひとまず、デスクトップアプリのようなLeap Motionだけを使うための設定例を書きます。

4. 考え方としては、Unity上でLeap Motionで認識した手を制御するためのコントローラーとして「LeapHandController」というPrefabをステージ上に配置します。
(※デスクトップアプリの場合はLeapHandControllerを用います。一方VR/ARの場合はLMHeadMountedRigを用います)

配置したLeapHandControllerを選択し、インスペクタパネルのModel Pool項目で、左手と右手に対してどのモデルを使用するかを指定します。

今回はLoPoly_Rigged_Handの左右モデルをステージに配置し、それをModel Poolスロットに設定しました。
Is EnabledとCan DuplicateのチェックはONにします

ドキュメントを読むと、手のモデルはHandModels(名前は任意でOKです)という空の親オブジェクトの子オブジェクトとしてまとめて置くことが推奨されています。そうして用意した親オブジェクトHandModelsを、LeapHandControllerインスペクタのHand Pool>Models Parentスロットに設定しておくことで、複数人の手を同時に表示させる際に役立つそうです。←と書かれていますが、このままでは3つ目の手は表示されないみたいので、さらに何か実装する必要があるかも、、。

5. 以上の設定ができたら、Unityプレビューをすると、Leap Motionで認識した手が表示されます。

6. お好みで、Cameraオブジェクトの中にLeapHandControllerとHandModelsを入れ子にして位置調整すれば、ゲームプレビュー画面上で一人称視点で手を表示しているようなアングルにできます。

表示できました

7. さらにお好みで、Planeで床を作成し、Cubeで立方体を配置してRigidBodyを設定してやると、Cubeと手とで衝突判定できますので、指で押したりできるようになります。その際はHandModelsの中にRigidRoundHand_LとRigidRoundHand_Rを配置し、LeapHandControllerのインスペクタパネルにて、Hand PoolスロットのSizeを2に増やして、そこに追加します。

LoPoly_Rigged…は文字通りローポリの手のモデル。Rigid…は衝突判定用の手のモデルでポリゴンとしては見えないモデルです
いくつかサンプルシーンも用意されています。Prefabフォルダの中に後述するコントローラーや手のモデルが入っています。
Sizeを増やして手のモデルを追加することで、手のモデルをいくつも重ねて表示できます。この場合はスロット1でポリゴンモデル、スロット2で衝突用リジッドモデルを設定しているわけです

ただし冒頭で書いたように、Cubeを掴んだりしようとすると、Core機能だけでは衝突判定がデリケート過ぎるために、Cubeがあらぬ方向に弾け飛んでいったりすると思います。そういう時にはLeap Motion Interaction Engineモジュールを追加してやるのですが、これは次回の記事で説明したいと思います。

指でCubeを押せました。掴もうとするとぶっ飛んでいきますがw

まとめ

ひとまずここまでで、Leap Motionで認識させた手をUnity上で表示させることができたかと思います。この時点でも手を使った面白いデスクトップアプリが作れるでしょうし、次のステップとして、物体を掴んだり投げたり、あるいはVR/AR連携させてみたりと、発展させていくこともできますね。
いずれにせよ、あなたがLeap Motionでやりたいことがモジュール機能として提供されていないかを公式サイトで確認し、実装における参考資料としては公式ドキュメントを読みつつ、何か困ったらフォーラムを覗いてみるといいでしょう。