読者です 読者をやめる 読者になる 読者になる

Gear VR向けの全周動画コンテンツの作成と宣伝

概要

Oculus VR社とSamusung社の協業によって、Gear VRと言うOculus社の品質を満たす高性能なスマホスロットインHMDシステムが発売されています。
最近は日本のキャリアでも該当機種を扱う(Galaxy s6シリーズ)為、国内での入手性も良いです。

この Gear VR向けコンテンツを、実写パノラマ動画で作っています。そのまま流すだけならmediaplayerで行けますが、選択肢で分岐したりループ制御やエフェクトがあるコンテンツを作る場合はUnity等のゲームエンジンを用いるのが良いと思います。

参考までに、このエントリでは僕が今お手伝いしているチーム(コンテンツ)のワークフローについて説明します。今後同じような事をする方の参考になれば嬉しいです。

環境

  • GoPro 6台マウント
  • Autopano Video Pro
  • VFX(After Effects,Nuke)
  • Unity5.0.0p2
  • OculusMobileSDK5.0.1
  • EasyMovieTexture 1.30

太字で書いた物はUnityアセットです。Unityではモバイル向け環境でのMovieTextureをサポートしていません。
その為にAndroid上でUnityを使って全周動画を球のメッシュに張り付けて再生する、と言うコンテンツの場合は太字で書いたEasyMovieTextureの助けを借りる必要があります。

この辺りの作成手順やソフトウェアについてはユニティの中の人の @warapuri さんが詳しいです。

www.slideshare.net

ワークフロー上の問題

チームの簡単なワークフロー図は以下の通りです。僕はUnityチームとして参加しています。 f:id:izm_11:20150502140959j:plain 今回は、Gear VR上で出来るだけ高解像度の動画素材を使いたいので 2880x1440 (30FPS)のH264(5.0 High Profile)のmp4を使う、と言う事になりました。

この解像度とプロファイルのmp4は、UnityEditor上でプレビューが出来ませんでした。また、EasyMovieTextureを使ったシーンでは、 該当アセット内のスクリプトのプラットフォーム分岐 #if UNITY_EDITIOR の中身が空っぽだったので、上図で言う赤い矢印の、UnityEditor上でのプレビュー確認が出来ません。

毎回Gear VRにビルドして転送して確認すると言う、人道的ではない開発を行う羽目になるのは嫌なので、ちょっとした工夫をして楽をします。

エディタ拡張による改善

バッチエンコードエンジン

Unityのエディタ拡張で、ffmpegのプロジェクト専用フロントエンドを作成しました。 f:id:izm_11:20150502011659j:plain こんな感じのGUIで、吐き出すのは一番UnityEditor上で負荷が低く、再インポートが速い theora(*.ogv)形式です。

EasyMovieTextureの書き換え

動画ファイルを扱うスクリプトの、空っぽだったUnityEditor上の処理を一通り書きました。
また、再生予定のファイルが例の巨大なmp4ファイルだった場合、自動的にパスを検索してエディタプレビュー用にバッチエンコードしたtheora形式の動画ファイルに動的に差し替える処理を追加しました。

この時、Movietextureを動的に読み込むために、theora形式の動画ファイルは /Assets/Resources以下に配置する必要があります。

また、HMD上でのプレビューについてはUnity 5.1以降だとVR previewが実装されるようです。
現状では拙作の OculusRiftDK2ExtendPreviewなどを併用することで、再生ボタンでDK2の見え方確認が出来ます。

neon-izm/OculusRiftDK2ExtendPreview · GitHub

f:id:izm_11:20150502231340j:plain

ビルドスクリプトの追加

/Assets/Resources以下と、/Assets/StreamingAssets以下のファイルは、Android向けに書き出すときに、基本的に全て転送されます。今回の様に大量の動画ファイルを含むプロジェクトでは、転送時間が最悪になります。
よって、こんな感じのPostProcessBuild.csをAssets/Editor以下に置きます。

using UnityEngine;
using System.Collections;
using UnityEditor;
using UnityEditor.Callbacks;


public class PostProcessBuild : MonoBehaviour {

    [PostProcessScene]
    public static void OnPostprocessScene()
    {
        if (EditorApplication.isPlayingOrWillChangePlaymode)
            return;
        
        // Move assets from Resources
        UnityEngine.Debug.Log(AssetDatabase.MoveAsset("Assets/Resources/TmpMovie", "Assets/TmpMovie"));
        AssetDatabase.Refresh();
    }

    [PostProcessBuildAttribute(1)]
    public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) {
        UnityEngine.Debug.Log(AssetDatabase.MoveAsset("Assets/TmpMovie","Assets/Resources/TmpMovie" ));
        AssetDatabase.Refresh();
    }
}
  • シーンビルド開始時に、theoraファイルが置いてあるフォルダを、別フォルダに移動する
  • ビルド中は/Assets/Resources 以下のサイズが少ないので速くビルドが完了する
  • ビルド後に、元の位置にファイルを戻す

という処理をしています。

ワークフロー改善の結果

Unityエディタ上で音やエフェクトの処理を確認した後に、Android向けに実機ビルドをする、と言う普通のゲームでは当たり前の手順が確立出来ました。
もし今回の様なコンテンツを、こういう工夫無しで作ろうと思うと結構大変だと思うので、同じようなコンテンツを作成したい方は、これらの点に留意しておくと快適だと思います。

最後に

僕がお手伝いしているチームGATE-Dは、現在OculusMobileVR Jamに参加しています。

vrjam.challengepost.com

また、MoguraVRさんに、コンテスト参加チーム紹介ページの一番上で、取り上げて頂きました。
ありがとうございます!

www.moguravr.com

5/11にコンテンツ提出締切と言うことで、チームは若干炎上していますが、鋭意頑張っております。

是非公開されたら、体験して頂けたら嬉しいです!以上宣伝でした。