OSVRな空間でモデルさんをくすぐってみる

 OSVR Hacker Development Kit v1.4 をお持ちの皆さん、お待たせいたしました。
「MMDモデルをくすぐれるVR体験ツール」を OSVR Hacker Development Kit v1.4 に対応させる事ができましたので、MikuMikuTickleV05として公開したいと思います。
 なお、OSVR HDK v1.4は、日本では2016年6月に販売が開始されたばかりなのですが、それから3か月ほど経過した2016年9月現在、早くも上位版の2.0が販売されています。
 残念ながら、MikuMikuTickleV05はHDK1.4でしか動作確認ができておらず、2.0ではうまく動かないかもしれません。

 MikuMikuTickleV05は、以下のリンクからダウンロードできます。

MikuMikuTickleV05 ダウンロード

 V04からの主な改善点は、以下のとおりとなります。

・OSVR Hacker Development Kit v1.4に対応しました
・OculusRift用のSDKがなくてもビルド・実行できるようにしました
・お口でもコチョコチョ(ペロペロ?)できるようにしました
・胴体全体をくすぐれるようにしました
・LeapMotion Orionを採用しました。
・LeapMotionのデータを別PCからも取得できるようにしました
・TスタンスのモデルさんもX文拘束できるようにしました。
・他(不具合修正等)

 今回対応したSVR HDKv1.4と、前回まで使用していたOculusDK1との最も大きな違いは、ポジトラの有無でしょう。
 ポジトラが使えるようになった事により、VR空間で頭を動かしやすくなったり、前回までできなかった事ができるようになったりもしたのですが、OSVRのポジトラはCPUパワーの消費も激しいようで、その対策についても検討する事となりました。

 ミニメロンが動作確認に使用した環境は、以下のとおりです。

・デスクトップPC
 (OS:Windows10 Home(64bit)/CPU:Intel(R) Core(TM) i3-3240 3.4GHz/
  メモリ:4.0GB/GPU:NVIDIA GeForce GTX 650)
・Leap Motion
・OSVR Hacker Development Kit v1.4
・Oculus Rift (DK1)
 これらのうち、OSVR HDKv1.4とOculus DK1は、どちらか片方だけあればよく、逆に二つ同時に使う事はできません。

動作させるためには以下の開発環境やライブラリ等が必要です。
・Microsoft Visual Studio Express 2012 for Windows Desktop
・OculusSDK(バージョン 0.2.5c)
 →OculusRift DK1を使うためのライブラリです。OSVR HDKv1.4を使う場合は、なくても大丈夫です。
・OSVR SDK for Windows(32bit)
 →くすぐり漫画をOSVRな空間で読むに書いたとおり、http://osvr.github.io/using/ からダウンロード・インストールします。
・boost_1_61_0
 →くすぐり漫画をOSVRな空間で読むに書いたとおり、http://www.boost.org/users/download/#live からzipファイルをダウンロードし、その中にあるboost_1_61_0というフォルダを、C:\の直下に置きました。
 使うのはヘッダファイルのみですので、ビルド作業等は不要です。
・DirectXTex
 →人気モデルを自分の手でくすぐってみるで書いたとおりhttp://directxtex.codeplex.com/ からダウンロードしてビルド作業を行いました。
・Leap_Motion_SDK_Win_3.1.3
 →LeapMotionの新しいSDKで、Orionとも呼ばれています。前回使用したSDKに比較して、認識性能やパフォーマンスが格段に向上しています。https://developer.leapmotion.com/ にログインしてダウンロードし、圧縮ファイルの中にあるLeap_Motion_SDK_Win_3.1.3というフォルダをCドライブの直下に置きます。そして、そのフォルダの中にあるLeap_Motion_Setup_Win_3.1.3.exeを実行し、LeapMotion用のドライバを更新します。
・Bullet(バージョン2.82)
 →モデルさんをくすぐるついでにスカートをめくってみるでダンロード及びビルドしたものを使用しました。
・MMDモデル
 今までデモ動画で使用させて頂いた
 Tda式初音ミク・アペンド Ver1.00(http://seiga.nicovideo.jp/seiga/im2018614)
 Lat式ミクVer2.31(http://www.nicovideo.jp/watch/sm11205201)
の他にも多数のMMDモデルで動作確認をしておりますが、腕や袖をIKで動かすモデルさんなど、まだ正常に召喚できないモデルさんもいらっしゃいます。
 今回Tスタンスモデルに対応した事により、例えばSANYO公式マスコットキャラクター「アイマリンちゃん」(http://www.imarine-project.jp/)を他のモデルさんと同じようにX文拘束してくすぐれるようになったのですが、今年になって登場した「アイマリンちゃん Vol.02」については、腕をIKで動かす構造になっている為、そのままではうまく召喚する事ができません。
 全てのMMDモデルを正常に召喚できるようにする事は、引き続き今後の課題です。

[動作手順]
1、MikuMikuTickleV05プロジェクトの作成
 VisualStudioのファイルメニュー→新しいプロジェクト を選択します。
 テンプレートからVisual C++ を選択し、Win32プロジェクトを選択して、名前欄にプロジェクト名(例えばMikuMikuTickleV05)を入力し、「ソリューションのディレクトリを作成」にチェックが入っている事を確認し、OKボタン→次へボタン→追加のオプションの「空のプロジェクト」をチェック(この時Security Development Lifecycleにチェックが入っている場合はチェックを外す)→完了ボタン の順に押します。
2、リリースビルドへの切り替え
 メニューバーのすぐ下のツールバーの真ん中あたりにあるリストボックスに「Debug」と表示されている場合は「Release」に変更します。
3、ソースの準備
 MikuMikuTickleV05のダウンロード圧縮ファイル(mmt_v05.zip)の中の、MikuMikuTickleV05というフォルダに含まれている、readme.txtを除く全ファイルを、MikuMikuTickleV05.slnの存在するフォルダの中にある、MikuMikuTickleV05というフォルダにコピーします。
4、インクルードディレクトリの設定及びプリプロセッサの定義
 VisualStudioの画面の右の方にあるソリューションエクスプローラという枠の中の、一番上に表示されているプロジェクト名(MikuMikuTickleV05)をクリックして選択状態にし、プロジェクトメニュー→プロパティでプロジェクトのプロパティを表示させます。
 「構成プロパティ」の中の「C/C++」の中の「全般」をクリックし、プロパティページの右側の枠の「追加のインクルードディレクトリ」をクリックします。枠の右端に現れる下向きの矢印のようなマークをクリックし、「編集」を選択して表示されるダイアログボックスの上の枠に、以下の6行の内容を入力します。

C:\Leap_Motion_SDK_Win_3.1.3\LeapSDK\include
C:\OculusSDK\LibOVR\Include
C:\DirectXTex\DirectXTex
C:\bullet-2.82-r2704\src
C:\Program Files (x86)\OSVR\SDK\include
C:\boost_1_61_0

 ただし、OculusSDKを持っていない場合は、2行目を除いた5行を記述します。
 入力が終わったら、OKをクリックします。

 OculusSDKを持っていない場合は、「構成プロパティ」の中の「C/C++」の中の「プリプロセッサ」をクリックし、プロパティページの右側の枠の「プリプロセッサの定義」をクリックします。枠の右端に現れる下向きの矢印のようなマークをクリックし、「編集」を選択して表示されるダイアログボックスの上の枠に、
WITHOUT_LIBOVR
という文字列を追加します。
 入力が終わったら、OKをクリックします。

5、ライブラリディレクトリの設定
 「構成プロパティ」の中の「リンカー」をクリックし、プロパティページの右側の枠の「追加のライブラリディレクトリ」をクリックします。枠の右端に現れる下向きの矢印のようなマークをクリックし、「編集」を選択して表示されるダイアログボックスの上の枠に以下の5行の内容を入力します。

C:\Leap_Motion_SDK_Win_3.1.3\LeapSDK\lib\x86
C:\OculusSDK\LibOVR\Lib\Win32
C:\DirectXTex\DirectXTex\Bin\Desktop_2012\Win32\Release
C:\bullet-2.82-r2704\lib
C:\Program Files (x86)\OSVR\SDK\lib

 ただし、OculusSDKを持っていない場合は、2行目を除いた4行を記述します。
 入力が終わったら、OKをクリックします。
 その後、プロパティページのOKボタンをクリックします。

6、ソースをプロジェクトに追加
 先ほどコピーしたMikuMikuTickleV05のファイルのうち、以下のファイルを プロジェクトメニュー→既存項目の追加 でプロジェクトに追加します。

DXCommon.h
LMCHand.cpp
LMCHand.h
MikuMikuTickle.cpp
pmd.cpp
pmd.h
PMDXBullet.cpp
PMDXBullet.h
PMDXWork.cpp
PMDXWork.h
pmx.cpp
pmx.h
SensorClient.cpp
SensorClient.h
UIPanels.cpp
UIPanels.h

7、OSVRサーバの起動
 OSVR HDKの電源を入れ、C:\Program Files (x86)\OSVR\SDK\binの中の、osvr_server.exe をダブルクリックで起動します。
 起動すると、画面上に黒いウィンドウが現れて、いろいろと文字が表示されます。また同時にポジトラ用IRカメラのLEDが緑色に点灯します。
8、実行
 デバッグメニュー→デバッグなしで実行 で実行します。
 最初は「leap.dllがない」等のエラーが出ますので、その場合は C:\Leap_Motion_SDK_Win_3.1.3\LeapSDK\lib\x86 から以下のファイルを実行形式(MikuMikuTickleV05.exe)と同じフォルダにコピーします。

Leap.dll
msvcp120.dll
msvcr120.dll

 また、以下のファイルをC:\Program Files (x86)\OSVR\SDK\bin からコピーして、実行形式(MikuMikuTickleV05.exe)と同じフォルダに置きます。
osvrClient.dll
osvrClientKit.dll
osvrCommon.dll
osvrUtil.dll

 コピーが終わったら、再度、デバッグメニュー→デバッグなしで実行 で実行します。
 ファイル選択ダイアログボックスが出てくるので、Leap Motion をPCに接続した後で、召喚したいモデルさん(MikuMikuDance用PMDファイル又はPMXファイル)を選択します。
 なお、ファイル選択ダイアログボックスの「開く」ボタンをクリックした時に、OSVRサーバが立ち上がっていなかった場合はOculusRiftDK1を探し、それも見つからなかった場合はプログラムが終了します。
 OSVRを使う場合、画面にモデルが表示された時のHMDの位置と向きが、VR空間内での位置や向きの基準になります。
 操作方法に関しましては、readme.txtを参照頂きたいと思います。

 なお、LeapMotionの設置ついてですが、前回はユーザーの腰の高さくらいの机の上に置いてある事を前提とした卓上モードをデフォルトとしていたのに対し、今回はOSVR HDKの前面にセロハンテープで固定されている事を前提としたマウントモードをデフォルトとしました。
 卓上モードに切り替えるには、[M]キーを押します。

 以前は卓上モードもマウントモードも一長一短有りといった所だったのですが、今回は状況がかなり変わっています。
 まず、LeapMotionのSDKやドライバが新しくなった事で、手の認識精度が大幅に向上し、マウントモードで腕を前方にまっすぐ伸ばした状態でもきちんと手を認識してくれるようになりました。
 逆に卓上モードはHMDのポジトラとの相性があまりよろしくないようで、OSVRと組み合わせるとかなりの違和感があります。このあたりは頑張れば多少改善できるかもしれないのですが、今となっては卓上モードにそれほどのメリットがないと思うので、改善を検討するのは次回以降気が向いたらにしたいと思います。

 なお、LeapMotionが手を認識した時にOSVRのポジトラが著しく不安定になる場合は、一旦[ESC]を押してMikuMikuTickleV05を終了し、LeapMotionの設定画面の「トラブルシューティング」タブの中にある「低リソースモード」にチェックが入っているかどうか確認してみましょう。
 ここにチェックが入っていない場合、チェックを入れてから再度MikuMikuTickleV05を実行すると、ポジトラの不安定さが改善されているかと思います。
 それでも不安定な場合は、MikuMikuTickleを実行するPCではなく別なPCにLeapMotionを接続し、以下に示す方法を試してみて頂きたいと思います。

[LeapMotionのデータをタブレットPCから取得する]
 ミニメロンの所有するデスクトップPCにOSVR HDKを接続し、OSVR Server を立ち上げると、CPUパワーが50%ほど消費されます。すなわち、OSVRのポジトラ用IRカメラの画像からHMDの位置を割り出すのに、これだけのCPUパワーが必要という事なのでしょう。
 この状態でMikuMikuTickleV05を立ち上げると、CPU負荷率は更に30%ほど増加して、80%程度になります。
 LeapMotionが両手を認識すると、CPU負荷率は更に10%ほど増加し、90%程度になります。
 ちなみに10%の増加に収まっているのは、LeapMotionのSDKやドライバを新しくした為です。前回のままの状態では、CPU負荷はもっと増加し、100%に到達してしまいます。
 CPU負荷率が100%に達すると、OSVRのポジトラの精度が著しく低下し、VR体験に致命的なダメージを与えます。
 今回LeapMotion Orionを採用した事で、普通に使う分には問題なくなったのですが、例えばデモ動画を作るために動画キャプチャーソフトを同時に動かした場合、必要なCPUパワーを確保する事ができません。
 そこで、CPU負荷を少しでも低減する為、OSVRかLeapMotionのどちらかのセンサーデータをMikuMikuTickleの動いているPCとは別なマシンから取得できないか検討してみました。
 例えば、OSVR HDK及びIRカメラのUSBケーブルを別マシンに接続し、OSVRサーバはその別マシンで動作させ、そこからMikuMikuTickleのマシンにHMDの姿勢データを送ってもらう事ができれば、MikuMikuTickleの動作するマシンのCPU負荷率は50%ほど低減できる事になります。
 しかしながら、OSVR用の他のアプリケーションは、OSVRのHDMIケーブルを接続したマシンでOSVRサーバが動いている事を前提に作られているので、この方法がMikuMikuTickleでうまくいったとしても、あまり意味がありません。
 一方、LeapMotionの方も、HMDと併用する場合はそれと同じマシンに接続して使うのが一般的なのですが、LeapMotionを接続したPCから他のマシンに手のデータを送る事ができるようになれば、例えばLeapMotionを接続する事ができないスマホによるVRに自分の手を持ち込むといった応用が期待できるかもしれません。
 そこで今回は、上記のデスクトップPCとは別に、Windows10のインストールされたタブレットPCを調達し、それにLeapMotionを接続して手のデータを取得できるようにしてみましたので、その方法を紹介したいと思います。

 今回使用したタブレットPC(価格は2万円程度)は、以下のようなスペックとなっております。

OS:Windows10 Home(32bit)
CPU:Intel(R) Atom x5-Z8300
メモリ:2GB
GPU:インテル(R) HD グラフィックス)

 また、MikuMikuTickleとは別に、以下のリンクからMMTSensorSvrV00をダウンロードする必要があります。

MMTSensorSvrV00 ダウンロード

 LeapMotionのデータをタブレットPCから取得できるようにするための手順は以下のようになります。

1、MMTSensorSvrV00プロジェクトの作成
 まずはVisual Studio ExpressのインストールされたPCで作業を行います。
 VisualStudioのファイルメニュー→新しいプロジェクト を選択します。
 テンプレートからVisual C++ を選択し、Win32コンソールアプリケーションを選択して、名前欄にプロジェクト名(MMTSensorSvrV00)を入力し、「ソリューションのディレクトリを作成」にチェックが入っている事を確認し、OKボタン→次へボタン→追加のオプションの「空のプロジェクト」をチェック(この時Security Development Lifecycleにチェックが入っている場合はチェックを外す)→完了ボタン の順に押します。
2、リリースビルドへの切り替え
 メニューバーのすぐ下のツールバーの真ん中あたりにあるリストボックスに「Debug」と表示されている場合は「Release」に変更します。
3、ソースの準備
 ダウンロードして頂いたmmtssv00.zipの中の、MMTSensorSvrV00というフォルダに含まれている、MMTSensorSvr.cppを、MMTSensorSvr.slnの存在するフォルダの中にある、MMTSensorSvrV00というフォルダにコピーします。
4、インクルードディレクトリの設定
 VisualStudioの画面の右の方にあるソリューションエクスプローラという枠の中の、一番上に表示されているプロジェクト名(MMTSensorSvrV00)をクリックして選択状態にし、プロジェクトメニュー→プロパティでプロジェクトのプロパティを表示させます。
 「構成プロパティ」の中の「C/C++」の中の「全般」をクリックし、プロパティページの右側の枠の「追加のインクルードディレクトリ」をクリックします。枠の右端に現れる下向きの矢印のようなマークをクリックし、「編集」を選択して表示されるダイアログボックスの上の枠に、C:\Leap_Motion_SDK_Win_3.1.3\LeapSDK\include と入力します。
 入力が終わったら、OKをクリックします。
5、ライブラリディレクトリの設定
 「構成プロパティ」の中の「リンカー」をクリックし、プロパティページの右側の枠の「追加のライブラリディレクトリ」をクリックします。枠の右端に現れる下向きの矢印のようなマークをクリックし、「編集」を選択して表示されるダイアログボックスの上の枠にC:\Leap_Motion_SDK_Win_3.1.3\LeapSDK\lib\x86 と入力します。
 入力が終わったら、OKをクリックします。
 その後、プロパティページのOKボタンをクリックします。
6、ソースをプロジェクトに追加
 先ほどプロジェクトフォルダに置いたMMTSensorSvr.cppを プロジェクトメニュー→既存項目の追加 でプロジェクトに追加します。
7、実行
 デバッグメニュー→デバッグなしで実行 で実行します。
 最初は「leap.dllがない」等のエラーが出ますので、その場合は C:\Leap_Motion_SDK_Win_3.1.3\LeapSDK\lib\x86 から以下のファイルを実行形式(MMTSensorSvrV00.exe)と同じフォルダにコピーします。

Leap.dll
msvcp120.dll
msvcr120.dll
 コピーが終わったら、再度、デバッグメニュー→デバッグなしで実行 で実行します。
 コマンドプロンプトが出現して「接続待ち」と表示されれば成功です。
 ファイルメニュー→ソリューションを閉じる を選択し、プロジェクトを閉じます。
8、タブレットPCへ移動
 MMTSensorSvrV00.exe 及び、それと同じフォルダに入っているLeap.dll、msvcp120.dll、msvcr120.dll、それから
mmtssvr.zipの中のMMTSensorSvrフォルダに含まれているport.txtを、タブレットPCにコピーし、一つのフォルダに置きます。
9、実行環境のインストール
 https://www.microsoft.com/ja-jp/download/details.aspx?id=30679 から「Visual Studio 2012 更新プログラム 4 の Visual C++ 再頒布可能パッケージ」のVSU4\vcredist_x86.exeをタブレットPCにダウンロードし、ダブルタップしてインストールします。
10、タブレットPCでの実行
 タブレットPC上で、MMTSensorSvrV00.exeをダブルタップして実行します。
 DOS窓が表示され、「接続待ち」と表示されると思うのですが、この時DOS窓のどこかをタップした時に、タップした場所にカーソルが表示される場合は、動作が中断してしまう場合があるので、設定の変更が必要です。MMTSensorSvrV00.exeを実行しているDOS窓の左上のアイコンをタップして、メニューから「プロパティ」を選び、編集オプションの中の「簡易編集モード」のチェックを外してOKをクリックします。
11、タブレットPCのIPアドレスの確認
 タブレットPC上でタスクマネージャーを開き、パフォーマンスタブをタップして、左側に「CPU」「メモリ」「ディスク」「Wi-Fi」と並んでいる中の「Wi-Fi」をタップします。そして、グラフの下に表示されているIPv4アドレスを確認します(通常は192.168.**.** の形になっていると思います)。
12、MikuMikuTickle側の設定変更
 MikuMikuTickleV05のプロジェクトフォルダの中にあるssvrconfig.txtをメモ帳で開き、1行目の「UseSSvr=0」と書かれている所の0を1に変更します。更に、その下の「SensorServerHost=192.168.*.*」の192.168.*.*を、先ほど確認したタブレットPCのIPv4アドレスに書き換え、上書き保存します。
13、MikuMikuTickle実行
 VisualStudioのファイルメニュー→プロジェクトを開く で MikuMikuTickleV05.slnを選択します。
 プロジェクトが開いたら、デバッグメニュー→デバッグなしで開始 で実行します。
 OSVRサーバーが立ち上がっていれば、モデルさんを選択した後、「センサーサーバーに接続します」と表示され、正常に接続できればすぐに画面が真っ白になって、しばらくするとモデルさんが表示されます。HDKを装着し、LeapMotionに手をかざすと、VR空間に取り込まれた手が見えるはずなのですが、うまく行きましたでしょうか。

 現在OSVRに関しては、日本語の情報が非常に少ないようですが、本記事とMikuMikuTickleV05が、日本でのOSVR対応アプリケーション開発を加速させるきっかけになればと思います。

(2016/9/18)

戻る