MikulusDK2を参考に、学習を兼ねてUnrealEngine4とOculusRiftDK2を使ってミクさんを鑑賞するアプリケーションを作ってみた。名前はocumiku。語呂が悪いとか細かいことは気にするな。
ocumikuの概要としては - ウィンドウ表示とOculusRiftDK2対応表示が切り替え可能 - OculusRiftDK2を被ることで上下左右からミクさんを鑑賞可能 - 視線を自分(カメラ)に向けてくれる - キーボード、コントローラ(XBOX 360用推奨)で操作可能 という感じで。
で、このocumikuを開発するにあたってOculusRiftDK2(というかHMD関連全般?)の制御関連のメモしていく。今回はUE4.6.1を使った場合となる。
HMD系BP一覧
BPは、"Head"で検索すると一覧がでてくる。これだけしかないのだが、逆にこれだけでどうにかする事になる。
WindowとOculusRift DK2での表示切替
UE4では既にOculusRift DK2のプラグインがデフォルトで有効化されているので、Window表示モード <-> OculusRift DK2での表示切り替えは簡単にできる。コンソールコマンドでstereo on/stereo offしたらよい。
しかし、OculusRiftの場合はディスプレイモードとして"Direct HMD Access from Apps"(以下Directモード)と"Extend Desktop to the HMD"(以下Extendモード)の両方に対応する必要がある。Directモードの場合は、Window表示のままでよいのだが、ExtendモードでOculusを起動している場合は、いったんフルスクリーンに変更する必要がある。
問題は、Windowとフルスクリーンをどのように切り替えていくか、という話になるのだが。今回は、コンソールコマンドで"fullscreen"と"windowed"を実行している(もちろん"r.SetRes 1280x720f"といった方法も可能)
これによって、Oculusのディスプレイモードに関係なく表示することができるようになった。
今回の初期化はこんな感じ。
取得できる値の違い
座標を取得するには、"Get Orientation and Position"から取得できる。
ここで取得できるDevicePositionだがUE4の座標系と異なっている。今回は、Oculusの座標系をUE4側に合わせた(という記述を他で見かけないのだけど、これってウチだけ?ドキドキ)
あと、このDevicePositionだが、初期化(Reset Orientation and Position)を行った時点での、ポジショントラッキング用カメラからの位置や向きを元に、位置や向きを取得する。これはつまり、相対値しか取れない事を意味する。
この場合は、「車の運転席に座って運転する」場合は問題にならないけど、「ポジショントラッキング用カメラの延長上1メートル先に人物を立たせたと想定して何かする」といったようなポジショントラッキング用カメラを起点とする、といったことができない(と思っているのだが、できる方法あるんだったら、教えて下さい)
参考エントリー
他の方のUE4 + OculusRiftでのコンテンツのエントリーも参考になるかと。一通り作ってブログ書いている時にこれらのエントリーを見つけるという本末転倒な感じだったのはナイショだ。
- UE4で Oculus Rift 展示 忘備録 : ラビットガーデン(うさぎでもわかるUE4)
- Oculus向けのコンテンツをUE4で制作するためのノウハウ共有♪(Oculus向けの最適化とか品質向上とか) - Qiita
ocumiku作るのに一番大変だったところ
実際は、PhATを使ったミクさん(特にツインテール部分)のコリジョン設定だったりする。このようなコリジョン設定は、割とノウハウの塊ぽい気がしている。設定の仕方によっては、暴れまくって話にならないし。体に髪が平気でめり込んだりするし。未だ納得いくコリジョン設定にはなってないという…。
気がついたら、また何か追加していく。