Oculus Rift DK2 + Leap Motion + VR Developer Mount(LeapMotionマウンタ)によるナデナデの作り方

まだまだ不明点が多いですが、現時点におけるOculus Rift DK2にLeap Motionを付けるVR Developer Mount(LeapMotionマウンタ)を用いた「ナデマデ」アプリケーションの作り方をご紹介します。

ナデナデする対象はMMDのモデルデータを用いていますので、ここの手順が理解できればどのモデルでも同じように出来ると思います。

1. 使用しているSDKのバージョン

  • Oculus Rift DK2: SDK 0.4.2 beta(Windows)
  • Leap Motion: LeapDeveloperKit_2.1.5+22693_win(Windows)
  • Unity: 4.5.2f1(Windows)

2. MMD関連

  • MMD4Mecanim (Beta): 20141002版
  • MMD4mface: 201410

3. 開発および実行プラットフォーム

  • Windows 7 Professional SP1
  • GPU: GeForce GTX 680
  • Oculus Rift: Direct HMD Access from Apps

4. Oculus Rift DK2 + Leap Motion + VR Developer Mountの基礎知識

いつもお世話になっている凹みさんの情報をご覧ください。

■VR の世界に手を持ち込める Leap Motion VR の仕組みを調べてみた – 凹みTips
http://tips.hecomi.com/entry/2014/10/02/204247

5. Leap Motionの設定について

Leap Motionの設定画面を開き、[全般]-[システム]の[イメージを許可する]にチェックを入れて[OK]ボタンを押しておいてください。

スクリーンショット 2014-10-09 21.56.09

 

6. Unityプロジェクトの設定

今回はOculus Rift DK2とLeapMotionを使用しますので以下の2つのパッケージを取り込んでください。

ダウンロードしたzipファイルを展開し、「OculusUnityIntegration.unitypackage」をダブルクリックする。

ダウンロードした「LeapOculusPassthrough.unitypackage」をダブルクリックする。

私のところの環境の問題かもしれませんが、DirectX3D 11が有効になっているとUnityのGameビューでうまく表示できないので無効化します。

具体的にはUnityの[Edit]-[Project Settings]-[Player]を実行し、Inspectorビューの[Other Settings]の[Use Direct3D 11]のチェックを外します。

スクリーンショット 2014-10-09 22.21.37

この時点で設定を確実に保存するためにUnityを終了します。

 

7. Leap Motion DLLのアップデート

2014年10月9日現在、Leap Motion Developers( https://developer.leapmotion.com/downloads/unity )で配布されているパッケージに含まれているLeap MotionのDLLは古いバージョンとなっています。
そのため最新のLeap MotionのSDKに含まれているDLLで置き換える必要があります。

最新DLLはLeap Motion SDK 2.1.5のパッケージを展開し、その中のLeapSDK\lib\UnityAssets\Pluginsに含まれる3つのDLLとなります。

・Leap.dll
・LeapCSharp.dll
・LeapCSharp.NET3.5.dll

スクリーンショット 2014-10-09 22.29.56

 

これらのファイルを先ほど作成したUnityのプロジェクトのAssets\Pluginsにコピーします。

Unityは停止した状態で作業してください。

スクリーンショット 2014-10-09 22.40.09

8. Leap Motion Passthroughを統合したOVRPlayerControllerのプレハブ化

Unityを起動し、先ほど作成したプロジェクトファイルを開きます。
次に「LeapOculusPassthrohgh」シーンを開きます。

スクリーンショット 2014-10-09 22.53.40

 

実行すると積み重なったCubeに手が触れるとフワフワと飛んでいくのがわかります。

このとき設定の肝となっているのがOVRPlayerControllerに追加されたHandControllerとQuadです。

凹みさんのところにも写真があるのですが、最後まで展開されていなかったので写真を取り直しました。

スクリーンショット 2014-10-09 22.54.24

さらにHandControllerの設定内容。

スクリーンショット 2014-10-09 23.07.58

このOVRPlayerControllerを別シーンでも使いまわしたいので、プレハブ化してください(HierarchyビューからProjectビューにD&D)。

ここでは名前をMyOVRPlayerControllerとしました。

スクリーンショット 2014-10-09 23.03.38

 

9. 手の位置について(暫定版)

まだ調査中のためはっきりとわかっていません!!!

LeapOculusPassthroughシーンファイルを開き、HierarchyビューのMyOVRPlayerControllerをダブルクリックします。
次にSceneビューにてY軸およびIsoモードで見てください。
次にSceneビューのGizmosメニューを開き、[3D Gizmoz]のスライドを調整して適度にGizmoを小さくしてください。

スクリーンショット 2014-10-09 23.28.22

 

この状態で実行しLeap Motionギズモの位置と手の位置に注目してください。

http://youtu.be/1_–xTMKntQ

Cubeの壁と壁の間は1mです(MyOVRPlayerControllerのColliderの半径は0.5mなのでぎりぎり収まっています)。
このとき、手の位置は「Leap Motion」からの相対位置になります。

つまり手の位置は、「普段の目の位置からOculus Riftの厚み+Leap Motionの厚み分のずれ」があります(要調査)。
このことを念頭において3Dオブジェクトを配置する必要があります。

またカメラからの位置も重要です。動画では約1分ぐらいのところでGキーを押してGridCubeを表示しています。
理想の位置は黄色のキューブです(座標としては(0,0,0))。
Rキーでポジションを調整するとその位置が(0,0,0)となりますのでシーンを開始したらRキーを押して位置を調整すると良いでしょう。

また、この動画において時々大きなブレが発生しています。恐らく手をかざしたことでポジトラが効かなくなったのではないかと思います(要調査)。

10. 新規シーンの作成

新規にシーンの作成をしてください。
適当に床やDirectional Lightなどを設置してください。

次に先ほどプレハブ化したMyOVRPlayerControllerをHierarchyビューにD&Dしてください。

11. 手のモデルのカスタマイズ

Leap MotionのPassthroughモードにおける手の3Dモデルは、MyOVRPlayerController/OVRCameraController/CameraLeft/HandControllerオブジェクトについているHandController.csスクリプトの「Hand Graphics Model」で指定します。

この「Hand Graphics Model」には「左側の手の3Dモデル」を指定します。
あるいは「Separate Left Right」のチェックをつけると左右別々の3Dモデルを指定することもできます。

  • Separate Left Right:未チェック

スクリーンショット 2014-10-10 00.16.09

  • Separate Left Right:チェック

スクリーンショット 2014-10-10 00.16.55

 

手の3DモデルはProjectビューのLeapMotion/Prefabs/HandGraphicsフォルダにありますがそのままでは使用できません。

まず、使用したい3DモデルをHierarchyビューにD&Dします。次にHMD用のスクリプト(HmdFading.cs)をアタッチします。スクリプトファイルはLeapMotion/Scripts/HmdFading.csにあります。

次にHierarchyビューに追加した手のモデルのGameObjectを非アクティブ化します。

スクリーンショット 2014-10-10 00.27.45

最後にMyOVRPlayerController/OVRCameraController/CameraLeft/HandControllerオブジェクトの「Hand Graphics Model」に先ほどHierarchyビューに追加した3Dモデルをセットします。

 

次に当たり判定です。当たり判定はのLeapMotion/Prefabs/HandGraphics/HandPhysicsフォルダにあるRigidHandプレハブを使います。これをMyOVRPlayerController/OVRCameraController/CameraLeft/HandControllerオブジェクトの「Hand Physics Model」にセットします。

 

12. MMDモデルの取り込みとColliderの追加

ここではMMD4Mecanimを使った例を示します。MMD4Mecanimはバージョンアップが頻繁に行われているため、ここで紹介した内容と合わなくなることがありますのでその点はご了承ください。

使用バージョン:MMD4Mecanim(Beta): 20141002版

使い方はMMD4Mecanim付属のマニュアルをご覧ください。

ここではPMDからFBXに変換した後の説明をします。

今回、ナデナデするために変換したFBXデータの髪の毛にColliderを追加する必要があります。

MMD4Mecanimのサイトやドキュメントをよく読むと幾つかの方法が紹介されていますが、ここでは比較的簡単に出来る方法を紹介します。

操作例として黒羽紫鴉さん(@Rinforzando_960)の「OculusChan」を用いています。

http://crow968.blog.fc2.com/blog-entry-24.html

スクリーンショット 2014-10-10 00.44.36

FBXに変換した3DモデルをHierarchyビューにD&Dします。

MyOVRPlayerControllerのPosition(0,1,0), Rotation(0,0,0)とした場合、「OculusChan」の座標と向きをPosition(0,0,0.5), Rotation(0, 180, 0)とします。

スクリーンショット 2014-10-10 00.52.51

次に、Hierarchyに追加した「OculusChan_V1.4」のMMD4MecanimModel.csの[Physics]ボタンを押し、「Generate Colliders」の右にある[Process]ボタンを押します。

スクリーンショット 2014-10-10 00.54.36

そうするとColliderが生成されます。

スクリーンショット 2014-10-10 00.57.43

 

13. 表情の変更スクリプトの設定

MMD4Mecanimで取り込んだデータには表情データ(Morph)が含まれています。

Hierarchyに追加した「OculusChan_V1.4」のMMD4MecanimModel.csの[Morph]ボタンを押すとどのような表情が出来るかがわかります(写真は一部だけ)。

スクリーンショット 2014-10-10 01.03.09
このスライダーを左右に動かすとモデルの表情が色々と変わります。

気に入った表情が出来たら左の名称と、右の値を覚えておいてください。

この表情を制御するためにウダサンさん(@udasan_koubou)のMMD4MFaceスクリプトを使用します。

http://udasankoubou.blogspot.jp/2014/02/unitymmd4mface-mmd4mecanim.html
http://udasankoubou.blogspot.jp/2014/02/unitymmd4mfaceblink-mmd4mecanim.html

このときインスペクタで日本語の入力が出来ませんが、上記の説明の中に解説があるのでよく読んでください。

上記の内容を参考にしてHierarchyに追加した「OculusChan_V1.4」にMMD4MFace.csを2つ追加し、以下のように設定します。

  • 設定例

スクリーンショット 2014-10-10 01.19.49

 

14.当たり判定の設定

Unityでは当たり判定の方法は色々あります。ここではTagとOnTriggerEnter()、OnTriggerExit()で検出する方法を使用することにします。
まずTagを追加します。髪の毛に当たり判定をつけたいので、”Hair”とします。
[Edit]-[Project Settings]-[Tag and Layers]を実行し、[Tags]を開いてElement 0に”Hair”を追加します。

スクリーンショット 2014-10-10 01.34.00

次に3Dモデルに追加したColliderを含むGameObjectに”Hair”タグを設定します。

このときHierarchyの検索欄に”coll hair “と入力して絞り込むと良いでしょう。
ここでは左右と前方の髪の毛だけにTagを設定する例を示します。

スクリーンショット 2014-10-10 01.40.21
次に当たった後の処理です。Leap MotionのPassthroughモードにおける当たり判定は「手のひら」にあります。なのでそこに下記のスクリプトを追加します。

https://github.com/zabaglione/TouchHand

このスクリプトをProjectビューのLeapMotion/Prefabs/HandGraphics/HandPhysics/RigidHand/palmにアタッチしてください。

スクリプトの初期値はこれまでの設定通りであれば変更不要です。

これで完成です。

手が髪の毛の触れると表情が変わるはずです。

 

お疲れ様でした。

 

 

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