今月後半に日本でもいよいよGearVRが発売されますね。
僕はGalaxy Note 4のGearVRを有志と共同購入することができたので、早速いろいろ試してみました。

その最中で得られた知見でオーソドックスなものを久々にBlogにしておきます。
※普通に360度動画見たいだけならOculus 360 Videoアプリをおすすめします。あくまでアプリに動画を組み込みたいという方向けへのTipsです。

必要なもの

  • GearVR + Galaxy Note4
  • Oculus Mobile SDK 5.0
  • 再生したい動画ファイル(予め端末内に置いてあるものとします)

PC向けにUnityで360度動画を出力する方法はたくさんあると思います。

Screenshot of warapuri.tumblr.com

No hack, no work • 「Spherical Image Cam」を使ってUnityで全天パノラマ動画を作ろう!

が、UnityではAndroid環境においては、ムービーテクスチャ機能が使えません。
EasyMovieTextureなどの有料アセットを使うという手もありますが、タイトル通り無料でできますのでトライしてみてください。

とはいえ、基本的にやることは同じです

※事前にGearVRのビルド環境を整えて下さい。別サイトへMobileSDKのドキュメントを有志とともに翻訳したので、こちらを見て準備して下さい。
Oculus Mobile Development Documentation(0.5.0)日本語訳/デバイスおよび環境設定
Oculus Unity モバイルインテグレーションガイド(0.5.0)日本語訳/ビルド設定
  1. 法線の反転したSphereモデルを配置します。
  2. Oculus Mobile SDK内の/VrUnity/Unityintegration/UnityIntegration.unityPackageを実行・インポートします
  3. Oculus Mobile SDK内の/VrUnity/SDKExamples/SDKExamples.unityPackageを実行・インポートします
  4. MainCameraを/OVR/Prefabs/OVRCameraRigに差し替える
  5. Sphereモデルへ /Textures/movie_surface.pngを適用します。ShaderはUnlit/Textureに。
    ※MipMapsがOnのテクスチャならなんでもいいです。
  6. /Scripts/MoviePlayerSample.cs の中身を編集します。
    160行目の

    mediaPlayer.Call(
    “setDataSource”,
     “/sdcard/oculus/360Videos/[Samsung] 360 video demo.mp4”
    );

    第二引数(赤字)の部分を再生したい動画のファイルパスに変更します。

  7. ビルド ※Editer上では動画の再生を確認することはできません
  8. 端末をUSB接続した状態でコマンドプロンプト/コンソールを起動。
    出力したapkファイルの有るディレクトリをカレントにセットして、

    > adb install -r builded.apk(ビルドしたapkファイル名)

    を実行すると、端末内にアプリがインストールされるので、起動すれば再生が始まるはずです。

ループ再生をやめたい場合、/Scripts/MoviePlayerSample.cs 162行目の

mediaPlayer.Call(“setLooping”, true);

の第二引数(赤字)をfalseに変えれば完成・・

ちょっと待った!

ビルドしたアプリをGearVRで見て、なんかおかしいと思いませんか?
GearVRのOculus360Videoアプリ等で比較すると分かるのですが、画像が荒い・・解像度が低すぎるのです!!

MoviePlayerSample.csを見直すと、58行目に・・

NOTE: The resolution of the movie texture is hard coded to 960×540 in MediaSurface.cpp.
注:ムービーテクスチャの解像度はMediaSurface.cpp内で960×540に固定されています

とある。
Oculusフォーラム内に情報ありました。

Movie Playing in UnitySDK | Mobile SDK Development | Oculus VR Forums

つまり、OculusPluginのソースコードの一部、MediaSurface.cppを希望の解像度に書き換えて再コンパイルすれば解像度を引き上げられるようです。

早速やってみましょう。
※Android NDK環境がきちんと設定されている必要があります。

MobileSDKフォルダ内の/VRLib/jni/Integrations/Unity内にMediaSurface.cppファイルが有りました!
早速開いて171,172行を編集します。

int width = 960 → 2880;
int height = 540 → 1440;

フォーラムでは4096x2048@30fps までの動作確認がとれているようです。
動画解像度のパフォーマンスについては、MoblieSDKドキュメント内の
Oculus Mobile Development Documentation / Media and Assets の項冒頭でも触れています。
こちらも近未来ラボサイト内で翻訳したもの(残念ながら現在機械翻訳)を置いてありますので参考にしてみてください。
Oculus Mobile Development Documentation(0.5.0)日本語訳 /メディアとアセット

さて、MediaSurface.cppファイルの編集が終わったらコンパイルします。

MobileSDK内の /VRLib/bulid.sh を実行すると、コンパイルが始まります。
※うまく始まらない場合はAndroidNDKの設定に問題があります。

コンパイルが終わると、/VRLib/libs/armeabi-v7a内に libJavaVr.so と libOculusPlugin.so ができているのでlibOculusPlugin.soをUnityプロジェクト内にあるlibOculusPlugin.soに上書きします。

再度Unityプロジェクトをビルドしたら、端末へインストール(コマンドは前述のもの参照)してGearVR上で確認しましょう。

どうですか?解像度が改善されているはずです!お試しあれ!!