Happy My Life

日常とか技術とか

UnrealEngine4とOculusRiftDK2を使った開発メモ

MikulusDK2を参考に、学習を兼ねてUnrealEngine4とOculusRiftDK2を使ってミクさんを鑑賞するアプリケーションを作ってみた。名前はocumiku。語呂が悪いとか細かいことは気にするな。

ocumikuの概要としては - ウィンドウ表示とOculusRiftDK2対応表示が切り替え可能 - OculusRiftDK2を被ることで上下左右からミクさんを鑑賞可能 - 視線を自分(カメラ)に向けてくれる - キーボード、コントローラ(XBOX 360用推奨)で操作可能 という感じで。

ocumiku-app

で、このocumikuを開発するにあたってOculusRiftDK2(というかHMD関連全般?)の制御関連のメモしていく。今回はUE4.6.1を使った場合となる。

HMD系BP一覧

BPは、"Head"で検索すると一覧がでてくる。これだけしかないのだが、逆にこれだけでどうにかする事になる。

ocumiku-app

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のディスプレイモードに関係なく表示することができるようになった。

今回の初期化はこんな感じ。

ocumiku-init

取得できる値の違い

座標を取得するには、"Get Orientation and Position"から取得できる。

get-position

ここで取得できるDevicePositionだがUE4の座標系と異なっている。今回は、Oculusの座標系をUE4側に合わせた(という記述を他で見かけないのだけど、これってウチだけ?ドキドキ)

axis

あと、このDevicePositionだが、初期化(Reset Orientation and Position)を行った時点での、ポジショントラッキング用カメラからの位置や向きを元に、位置や向きを取得する。これはつまり、相対値しか取れない事を意味する。

この場合は、「車の運転席に座って運転する」場合は問題にならないけど、「ポジショントラッキング用カメラの延長上1メートル先に人物を立たせたと想定して何かする」といったようなポジショントラッキング用カメラを起点とする、といったことができない(と思っているのだが、できる方法あるんだったら、教えて下さい)

参考エントリー

他の方のUE4 + OculusRiftでのコンテンツのエントリーも参考になるかと。一通り作ってブログ書いている時にこれらのエントリーを見つけるという本末転倒な感じだったのはナイショだ。

ocumiku作るのに一番大変だったところ

実際は、PhATを使ったミクさん(特にツインテール部分)のコリジョン設定だったりする。このようなコリジョン設定は、割とノウハウの塊ぽい気がしている。設定の仕方によっては、暴れまくって話にならないし。体に髪が平気でめり込んだりするし。未だ納得いくコリジョン設定にはなってないという…。

気がついたら、また何か追加していく。