くすぐり漫画をOSVRな空間で読む

「MMDモデルをくすぐれるOculusRift専用VR体験ツール」の最新版MikuMikuTickleV04を公開してから、早くも1年と半年が経過してしまいました。
 V04公開時は「次のバージョンはOculusRift製品版で」と考えていたのですが、2016年になって実際に発売された価格は日本から注文の場合約10万円と高額であり、それに加えてミニメロンが現在使用しているPCが推奨スペックを満たしていない為、OculusRift製品版への対応は一旦見送る事にしました。
 しかしながら、これまで使っていたDK1には、いわゆるポジトラの機能がない為、例えば頭をモデルさんの方へ動かしても、それだけではモデルさんにお近づきになる事ができないという問題がありました。
 ポジトラの機能はOculusRiftのDK2には備わっていましたが、既に出荷が終了しています。
 そこで、代案として、OculusRift以外のVRHMDへの対応を検討する事にしました。
 このほど、その検討対象であります OSVR Hacker Development Kit v1.4 をようやく入手する事ができました。
 値段は送料込みで43,964円。ちなみにOculusDK1の値段は35,391円+関税で、大体36,000円くらいだったので、それよりも少し高い額ではありますが、OculusRift製品版に比べれば半額以下の値段となっています。
 SDKの使い方の学習を兼ねて、まずは例によって、ミニメロン作の立体視コミックを読めるようにしてみましたので、その方法を紹介したいと思います。

 今回使用した環境は、以下のとおりです。

CPU:Intel(R) Core(TM) i3-3240 3.4GHz
メモリ:4.0GB
GPU:NVIDIA GeForce GTX 650
VRHMD:OSVR Hacker Development Kit v1.4
OS:Windows10 Home(64bit)
テクスチャ画像ライブラリ:DirectXTex

 開発ツールとしては、前回までと同様に、Visual Studio Express 2012 for Windows Desktopを使用しました。
 テクスチャ画像ライブラリとしては、人気モデルを自分の手でくすぐってみるで導入した、DirectXTexを使用しました。
 ミニメロン作の立体視コミックをお持ちでない方は、DLsite.comから体験版をダウンロードし、中身を任意のフォルダに展開しておくとよいでしょう。
 これらの準備ができている事を前提として、今回実際に試した手順をまとめると、以下のようになります。

1、HDKの配線及び接続
 OSVR Hacker Development Kit v1.4 (以下、HDK)の取り扱い説明書(英語)の図に従って、配線・接続します。
 PCとHDKの電源を入れ、Windowsのデスクトップを右クリックして「ディスプレイ設定」を選ぶと、2つのディスプレイが表示され、片方が縦向きになっていたりしますので、「複数のディスプレイ」の項目で「表示画面を複製する」を選択します。解像度は、1280×720、又は1920×1080とします。
 この状態でHDKのレンズを覗くと、Windowsの画面の一部をレンズ越しに見る事ができます。
2、OSVR SDKの準備
 http://osvr.github.io/using/ から、OSVR SDK for Windows(32bit)をダウンロード・インストールします。
 使っているOSは64bitなのですが、作るアプリケーションはWin32なので、32bitの方をダウンロードしました。
 普通にインストールすると、C:\Program Files (x86)\OSVRの下に、ファイルが展開されます。
3、OSVRサーバーの起動
 C:\Program Files (x86)\OSVR\SDK\binの中の、osvr_server.exe をダブルクリックで起動します。
 起動すると、画面上に黒いウィンドウが現れて、いろいろと文字が表示されます。また同時にポジトラ用IRカメラのLEDが緑色に点灯します。
4、SDK付属デモアプリで動作確認
 C:\Program Files (x86)\OSVR\SDK\binの中の、RenderManagerD3DExample3D.exeを起動して、HDKを装着すると、それぞれの面が色分けされた立方体の内部に入り込む事ができます。
 私の環境では、この時点でHDKの表示モードがダイレクトモードに切り替わり、アプリを終了すると、HDKの画面には何も映らなくなります。
 元の状態に戻す為に、C:\Program Files (x86)\OSVR\SDK\bin の下にある DisableOSVRDirectMode.exe をダブルクリックします。
5、Boostの入手
 自作アプリケーションのC++ソースをコンパイルするのに、Boostというライブラリのヘッダファイルが必要になるので、http://1st.geocities.jp/shift486909/program/boost1.html や http://boostjp.github.io/howtobuild.html を参考に、http://www.boost.org/users/download/#live からダウンロードします。
 必要なのはヘッダファイルだけですので、ビルドする必要はありません。
 私はダウンロードした boost_1_61_0.zip の中のboost_1_61_0というフォルダを、C:\の直下に置きました。
6、プロジェクトの作成
 Visual Studio Express 2012 for Windows Desktop を起動し、ファイルメニュー→新しいプロジェクト を選択します。
 テンプレートからVisual C++ を選択し、Win32プロジェクトを選択して、名前欄に OSVRtest1 と入力します。
 「ソルーションのディレクトリを作成」にチェックが入っている事を確認し、OKボタン→次へボタン→追加のオプションの「空のプロジェクト」をチェック(この時Security Development Lifecycleにチェックが入っている場合はチェックを外す)→完了ボタン の順に押します。
 この時点で、メニューバーのすぐ下のツールバーの真ん中あたりにあるリストボックスに「Debug」と表示されていると思いますが、Windows8.1以降でVisualStudio2012Expressを使う場合、この状態ではDirectX11が使用できないので、「Debug」から「Release」に変更します。
7、インクルードディレクトリの設定
VisualStudioの画面の右の方にあるソリューションエクスプローラという枠の中の、一番上に表示されているプロジェクト名(OSVRTest1)をクリックして選択状態にし、プロジェクトメニュー→プロパティでプロジェクトのプロパティを表示させます。
 「構成プロパティ」の中の「C/C++」をクリックし、プロパティページの右側の枠の「追加のインクルードディレクトリ」をクリックする。枠の右端に現れる下向きの矢印のようなマークをクリックし、「編集」を選択して表示されるダイアログボックスの上の枠に C:\Program Files (x86)\OSVR\SDK\include と入力し、次の行にC:\DirectXTex\DirectXTex と入力し、更に次の行に C:\boost_1_61_0 と入力し、OKをクリックします。
8、ライブラリディレクトリの設定
 「構成プロパティ」の中の「リンカー」をクリックし、プロパティページの右側の枠の「追加のライブラリディレクトリ」をクリックします。枠の右端に現れる下向きの矢印のようなマークをクリックし、「編集」を選択して表示されるダイアログボックスの上の枠に C:\Program Files (x86)\OSVR\SDK\lib と入力し、次の行に C:\DirectXTex\DirectXTex\Bin\Desktop_2012\Win32\Release と入力し、OKをクリックします。
 その後、プロパティページのOKボタンをクリックします。
9、ソースの準備
 今回作成したソースは、ここからダウンロードできます。
 zipファイルから、OSVRTest1.cpp、test.fx、OSVRDist.fx を取り出して、プロジェクトフォルダ(OSVRTest1.vcxprojの置かれているフォルダ)に入れます。
10、ソースをプロジェクトに追加
 プロジェクトメニュー→既存項目の追加 で、OSVRTest1.cpp をプロジェクトに追加します。
11、実行
 デバッグメニュー→デバッグなしで実行 で実行します。
 最初は「leap.dllがない」等のエラーが出ますので、その場合は osvrClient.dll、osvrClientKit.dll、osvrCommon.dll、osvrUtil.dll を、C:\Program Files (x86)\OSVR\SDK\bin からコピーして、OSVRTest1.exe というファイルが生成されたフォルダに置きます。
 無事に実行されると、フォルダ選択用のダイアログボックスが表示されるので、表示するフォルダ(ミニメロン作の立体視コミック(体験版でも可)に含まれる、pagesという名前のフォルダ)を選択し、OKをクリックします。
12、装着
 HDKを装着します。

 以上の手順により、(ほとんどの方は)作品画像の貼られた板が円周状に並んだVR空間に(精神だけ)入り込む事ができるかと思います。
 右矢印キーでページ送り、左矢印キーでページ戻し、スペースキーでフキダシ有無の切り替え、ESCキーで終了です。
 また、W、S、D、Aキーで前後左右に移動、5、6キーで上下に移動、Pで移動量のリセットができます。
 今回はポジトラの機能が入ったので、頭を前後左右に動かす事によっても、VR空間内をある程度は移動する事ができます。

 OSVRについては、日本では入手した人がまだまだ多くないらしく、日本語の資料がほとんど見当たりません。
 今回特に苦労したのは、逆歪み補正と射影変換行列の生成です。
 OculusRiftDK1と同様に、OSVR HDKについてもレンズによる画像の歪みを補正するために、逆歪み補正が必要なのですが、当然OculusDK1とは使用されているレンズが違うため、逆歪み補正の方法も異なります。
 これにつきましては、https://github.com/OSVR/OSVR-Docs/blob/master/Configuring/distortion.md を参考にし、a0、a1等のパラメータについては C:\Program Files (x86)\OSVR\SDK\bin\displays の中にある OSVR_HDK_1_3.json に書かれた distortion のパラメータを割り当てた所、歪みがあまり気にならない程度には補正する事ができるようになりました。
 射影変換行列は、SDKに含まれていたサンプルコードではOSVRのライブラリから取得しているのですが、その行列はOpenGL用であり、DirectXではそのまま使う事はできません。
 ライブラリに渡すパラメータ等によってはDirectX用の射影変換行列も取得できるかもしれないのですが、今回は http://dench.flatlib.jp/opengl/lefthand や http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20090829 を参考にして、OpenGL用の行列をDirectX用の行列に変換して使用しています。

 というわけで、OSVR HDKをC++とDirectXから何とか使えるようになったので、次はいよいよモデルさんにお近づきになりたいと思います。

(2016/8/3)

戻る