Leap Motion Orionを用いたヾ(・ω・*)なでなでアプリの作り方

1. 始めに

2016年2月18日にLeap Motionに新たなVRモード用のドライバ・ランタイム「Orion」(ベータ)がリリースされました。

これまでの歴史とOrionの技術的な特徴は中村さんのブログにまとめられていますのでそちらをご覧ください。

Orionはランタイム・ドライバをアップデートするだけでも既存のV2系列のアプリの精度を高めることができます。ですが、せっかくなので最新のUnity環境及びOrionを用いた自作VRアプリの作成手順について説明をします。

2. 環境構築

ダウンロードとインストール

ファイルをダウンロードしたらzipファイルを展開し、中にあるexeファイルを実行してください。
この記事の執筆時点における最新版は3.1.0+39495です。もしバージョンアップが上手くいかない時は、
一度既存のLeap Motionのランタイム・ドライバをアンインストールしてから新たにインストールしてください。

スクロールさせて一番下の方にダウンロード用のページがあります。

ここからUnityパッケージをダウンロードしてください(LeapMotion_CoreAsset_Orion_Beta_4.0.0.unitypackage)。
ダウンロードページにも書かれていますように、PC環境は以下のようになります。

  • Windows 7 64-bit or higher
  • Unity 5.3 with the integrated VR support enabled
  • Leap Motion Orion
  • Oculus SDK 0.8.0

この資料ではこの記事の執筆時点における推奨版の「Unity5.3.3p1」を使用します。

■Oculus Rift DK2について
Oculus Rift DK2(以後DK2)については別のサイトを参照して環境構築してください。

■VR Developer Mountについて

DK2の前にLeap Motionを取り付ける必要があります。公式サイトの下の方で販売しています。

ですが、わざわざ公式の物を買わなくても両面テープで固定しても構いません。
またはUnofficial VR mounterもあります。

3. サンプルによる動作確認

Orionのリリースに合わせて公開されたサンプルアプリがあるので試してみましょう。

4. Leap Motionパッケージのインポートとサンプルシーンの参照

まずUnityを起動し新規にプロジェクトを作成します。

スクリーンショット 2016-03-01 12.22.45

「AngelaNadeNade」。そうです、あれを作ります(笑)。

新規にプロジェクトが作成で来たら先ほどダウンロードした LeapMotion_CoreAsset_Orion_Beta_4.0.0.unitypackage をダブルクリックしてインポートします。

スクリーンショット 2016-03-01 12.25.00
とりあえずデモシーンを見てみましょう。今回はVRモードを利用しますので、Uniyの[Edit]-[Project Settings]-[Player]を実行し、インスペクタに表示された「Other Settings」「Rendering」「Virtual Reality Supported」をチェックします。

スクリーンショット 2016-03-01 14.56.45

デモシーンは Assets/LeapMotion/Scenes/Leap_Hands_Demo_VRです。シーンファイルを開いたら、実行してみましょう。ここまで問題が無ければパススルー(赤外線を通して得られた映像)で映像が出て、DK2の前に手をかざせと手のモデルが表示されると思います。

スクリーンショット 2016-03-01 12.29.34
もしパススルーが表示されない時はLeap Motionのコンフィグレーションを起動して「イメージを許可する」にチェックを入れてから再度試してみてください。

スクリーンショット 2016-03-01 12.35.40

このシーンを使いまわしてもいいのですが、新規シーンを作成してLeap Motionによる手を出す方法も紹介します。

5. 新規シーンにおけるセットアップ

  1. 先程のプロジェクトを開いている状態から、Ctrl+Nキーを押して新規シーンを作成します。
  2. Assets/LeapMotion/Prefabs/の LMHeadMountedRig をシーンに配置します。
  3. シーンに配置したLMHeadMountedRigを展開して、LeapHandControllerを表示します(以下、単に LeapHandController と記述)。
  4. Assets/LeapMotion/Prefabs/HandModelsNonhuman/のCapsuleHand_LとCapsuleHand_RをLeapHandControllerの子要素として配置します。
  5. Assets/LeapMotion/Prefabs/HandModelsPhysical/のRigidRoundHand_LとRigidRoundHand_RをLeapHandControllerの子要素として配置します。
  6. LeapHandControllerをクリックしてインスペクタを表示し、Hand PoolスクリプトのLeft Graphics Model, Right Graphics Model, Left Physic Model, Right Physic Modelにそれぞれ以下のように登録します。

Left Graphics Model  => CapsuleHand_L
Right Graphics Model => CapsuleHand_R
Left Physic Model => RigidRoundHand_L
Right Physic Model => RigidRoundHand_R

スクリーンショットを撮るのも面倒なので動画に撮りましたのでそちらを参照してください。

最後にパススルーモードを有効にするには、HierarchyのLMHeadMountedRig/CenterEyeAnchorにアタッチされているLeap Image Retrieverを有効化し、HierarchyのLMHeadMountedRig/CenterEyeAnchor/LeapSpace/QuadBackgroundを有効化してください。

6. MMD4Mecanimによるモデルのインポート

詳しい手順は他のサイトをご覧いただくとして、ここでは簡易的に記述します。

MMD4Mecanim_Beta_20150821.zipをダウンロードしてください。
http://stereoarts.jp/

ダウンロードしたらzipファイルを展開し、MMD4Mecanim.unitypackageをインポートします。
次にお好きなMMDモデルデータを含むフォルダをUnityの「Project」にD&Dします。
D&Dしたフォルダに「***.MMD4Mecanim」という名前のファイルができるのでそれを選択し、READMEを参照して[同意する]ボタンを押してください。次の画面で[Process]ボタンを押すとMMD(PMX)からfbxに変換されます。

変換したFBXをシーンに配置します。このとき、カメラの位置(LMHeadMountedRig)が(0,0,0)のままなので適当に調整します。

実行してみるとこんな感じです。

表情が硬いので「主婦ユニ」を読むか、こちらのmkt_さんの記事を参照しましょう。

「コッチミンナ」がうまくいかない時はこちらのアセットを使ってみるのも良いでしょう。

使い方はDvorakはしもとさんのサイトを参照。

なおメインカメラはLMheadMountedRig/CenterEyeAnchorにあります。

またウダサンさんの記事を参照するのもよいでしょう。

7. 髪の毛を触るには

大きく3つのステップが必要です。

  1. MMD4Mecanimで取り込んだモデルのPhysicsを有効にする
  2. 手のPhysicsモデルにMMD4MecanimRigidBody.csをアタッチする
  3. VR用に最適化を行う

それぞれ詳しく説明します。

7.1 MMD4Mecanimで取り込んだモデルのPhysicsを有効にする

HierarchyにあるMMD4Mecanimで変換したモデルデータを選択すると「MMD4 Mecanim Model」スクリプトがアタッチされています。[Model]タブの下にある「Physics Engine」を「None」から「Bullet Physics」変更してください。

次に[Physics]タブを開き、CollidersのGenerate Collidersの「Process」ボタンを押します。
次にBullet Physicsの「Join Local World」のチェックを外します。
次にFram Per Secondを75に変更(デフォルトの0は120fpsを意味しています)。

あとはPCの性能に応じて、Use CCDのオン/オフ(オフで処理を軽減)、Iterationsを4(処理軽減)にしてください。詳しくはMMD4Mecanim付属の「MMD4Mecanim リアルタイム版 Bullet Physics.pdf」を参照してください。

7.2. 手のPhysicsモデルにMMD4MecanimRigidBody.csをアタッチする

Leap Motionの物理モデル(RigidRoundHand_LとRigidRoundHand_R)を指の関節や掌にRigidboadyコンポーネントがアタッチされています。Rigidbodyコンポーネントがアタッチされている全てのGameObjectにMMD4Mecanim/Scripts/MMD4MecanimRigidBody.csをアタッチします。

一つ一つ手アタッチするのは大変なので、Hierarchyの上にある検索欄に「rigidbody」と入力するとシーン内でRigidbodyをアタッチしているGameObjectだけ検索されるので、それをすべて選択し、Inspectorの[Add Component]ボタンを押して「MMD4MecanimRigidBody」と入力してアタッチします。これですべてのRigidbodyコンポーネントにまとめてアタッチすることができます。

7.3. VR用に最適化を行う

物理エンジンを用いているので物理エンジンの更新間隔を最適化します。Unityの[Edit]-[Project Settings]-[Time]を起動してFixed Timestepを0.01333333に、Maximum Allowed Timestepも0.01333333に変更します。

これで完成です。プレイするとMMDモデルが目の前にいて物理設定が行われているところを手で触ると動くはずです。

参考動画:

 

おまけ

Leap Motion Orion 3.1で大幅に手の認識精度が上がり、何と手を組んでも認識されます。

市原 俊介

> 5. 新規シーンにおけるセットアップ
> 6. LeapHandControllerをクリックしてインスペクタを表示し、…

の部分で一つ付け加えさせて頂きます。
LeapHandControllerのインスペクタ表示で、「Hand Pool (Script)」でModel PoolのSizeが0になっていると、それより下が表示されないためGraphics ModelやPhysic Modelが設定できなくなります。
「あれ?そうやって登録する欄がないぞ!」という場合には、この値を1や2などに変更すると出てくるようになります。

管理人

補足ありがとうございます。この記事を書いたときのバージョンは固定だったんですが、そのあとのバージョンから若干構造が変わったので、補足して頂いた操作が必要となりました。

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です