[UE4ぷちコン 映像編3rd]振り返り:360°映像制作

ここは[UE4ぷちコン 映像編3rd]振り返りの子頁です。

概要

  • Panoramic Capture Plugin使ってみた

  • なかなか暴れん坊だが正しく使えば青天井

  • Cubemapを使う手法も安定で高速

  • 360°動画の演出は難しいが面白い

注意事項

本記事内のPanoramic Capture Pluginに関する記述は検証が不十分です

  • できるだけ公式記事ソースコードを参照していますが、正直あんまよくわかってないまま使ってます

  • 最適なセッティングはProject毎に異なるとはいえ、明らかに誤った設定で使っている部分もたぶんあります

  • 常に最新のDocument、ソースコードを参照して下さい

  • 突っ込むつもりで読んで下さい

作業用PCの性能は以下の通り。(2018年代のハイミドルぐらい?)

OS: Windows 10
CPU: AMD Ryzen 7 2700X
GPU: GeForce - GTX 1080 Ti
RAM: 32GB

連番画像出力先:
Samsung SSD 500GB 960EVO M.2 Type2280 PCIe3.0×4 NVMe1.2

Scene Capture Component Cubeを使う手法

Scene Capture Component Cube を使用して360°画像を得る方法。

長所・短所

  • 長所

    • 安定

    • Blueprintで完結

    • 結果のPreviewが容易

      • UE4内でCubemapや再CaptureしたTextureはViewerで確認できる

  • 短所

    • 無改造だと出力解像度が上限4K

      • Cubemap解像度上限に引っ張られる模様。4096 x 2048まで。

      • ほぼ十分だが、昨今の高解像2D動画に慣れた目で見てしまうと…もう一声!と思うかも

    • 撮影面は画角90°で前後上下左右の6枚で固定

      • 画角90°だと、撮影面の境界付近Pixelが疎になっていくのがやや顕著

        • 何かしらアーティファクト出るかも

          • 例えば輪郭線処理をPost Processでやっている場合、境界を跨いで太さが変わってしまう事も

    • 撮影面1つあたりの解像度がCubeMapのSize Xで固定

      • Screen Percentageをアゲてジャギー等を滅するみたいな事はできない

Bloomの注意点

    • 基本的にはあまり気にせず使える

    • 平面投影したCubemapをCapture2Dで再撮影する際にBloomを効かせるので、撮影面の境界ではBloomが途切れない

      • ※平面投影の境界、すなわち球面の真上・真下・背後で効果が途切れる

      • ※平面投影状態でBloom効果が添加される為、球面投影時変形する点は注意

余談:
この記事を書いている時に初めて知ったが、全方向立体視画像に対応するPropertyがScene Capture Component Cubeにあった。環境マッピング以外にCubemapを使う事も普通に想定されているということでよいのかな。

Panoramic Captureを使う手法

公式のPanoramic Capture Pluginを使う手法。

長所・短所

  • 長所

    • 出力解像度上限なし

      • 8Kも可能

    • 撮影面の数・解像度が指定可能

      • 高解像撮影してジャギー回避できる…かもしれない

      • 正直、どの程度撮影面を分割するのが良いのかはProject毎に確認したほうがよい

        • 細かくするほど良くなっていくわけでもない

          • 最終的に平面化される際にどうしても圧縮される部分は出るし…

    • Render Path別の出力が可能

      • Base Color, Scene Depthなど個別に画像出力可能

      • UE外でCompositeして最終出力を得るワークフローであれば必須

  • 短所

    • 重い

      • 基本的にCubemapを使う方法より重い

        • 比較用に画角90°で並行・垂直90°刻みに撮影する設定にしても12回撮影しちゃってる気がする

          • 水平方向360°/90°=4分割、垂直方向180°/90°+1で3分割の4x3=12枚

            • そのうち6枚は真上又は真下方向でRollしただけの絵なのでは…?

              • (水平方向分割数-1)*2枚無駄になってるかも…?

        • あまり検証に時間を割けていないので、間違った使い方をしているかも

        • 撮影パラメータ次第で多少改善はする(後述)

    • やや不安定

      • 誤ったParameterを設定するとCrash、あるいはTextureがバグる(後述)

        • Crashされるとエラー文も読めないので、原因の理解にはC++コードの解読が必須

        • 流石に適切に使えばCrashはしない

      • 5.0EAでPluginを有効化するとProject起動中にCrash

        • まぁこれは仕方ない

    • プレビューには不向き

      • 画像出力しないと結果を確認できない

      • 低解像度撮影設定を別途設けて切り替えて運用するなどで軽減できる(後述)

    • 素の使い勝手はやや微妙

      • パラメータ設定から撮影開始命令まで全てがConsole制御

        • ラップ処理を自分でつくれば改善する(後述)

      • 公式Docすら「詳細はソースコード読んでくれ!」と言い放つ漢仕様

        • コード自体は素直なので読めばわかる

        • 載ってないパラメータもある(後述)

Parameter設定の注意事項

基本的なパラメータ設定は公式ドキュメントを参照して頂くとして、ここでは扱いに注意が必要なものについて述べる。

カメラ回転追従設定

  • SP.UseCameraRotation

    • 4.20から追加された設定

    • 0でカメラ(Player Camera Managerの制御対象)の回転を無視

    • 漢のbit flag制御

      • 1でPitch、 2でYaw4でRoll、7で全軸追従

      • とりあえず360画像のカメラ回したいなら "SP.UseCameraRotation 7"

スライスの調節

  • SP.HorizontalAngularIncrement

    • 最大値は120(360の約数のうち180未満の最大値)

    • Docに書いてあるが、CaptureHorizontalFOV HorizontalAngularIncrement である事

      • さもなくばCrash

  • SP.VerticalAngularIncrement

    • 最大値は90(180の約数のうち180未満の最大値)

デバッグの調節

  • SP.ConcurrentCaptures

    • 連続で発行(一度にflush)するキャプチャの最大数

    • レンダリング時間の短縮に効く

    • 撮影面の数が理論的な最大値?

      • すなわち (360/SP.HorizontalAngularIncrement) * (180/SP.VerticalAngularIncrement + 1)

      • これより大きい値を設定すると描画結果がバグる事がある。あった(締切2日前)。

        • 詳細未調査

      • 分割数が少ない(12とかの)時も、最大値だと描画結果がバグる事がある。あった(締切2日前)。

        • 詳細未調査。

      • 他のパラメータやハードウェアとの兼ね合いで、理論値で最大の速さになるわけでもないみたい

        • 理論最大値300の時、150を設定してもレンダリング時間に差がなかったりする

      • とりあえず理論値の半分を自動的に設定するようにして今回は使った

サンプリングの調節

  • SP.CaptureSlicePixelWidth

    • 撮影面1つあたりの解像度

    • 球面に張り合わせる際にPixelが不足する値だとCrash

      • 逆に大きめに設定すればSuperなSamplingが可能

        • ジャギ回避、輪郭線出しが捗るなど効果アリ

        • なお重くなる模様

    • (SP.StepCaptureWidth * tan(SP.CaptureHorizontalFOV/2))/(360*tan(SP.HorizontalAngularIncrement/2)) が最低値

      • 直接入力しないほうがいい

      • 設定用アセットでケアしよう(後述)

Bloomの注意点

  • 撮影面を細かくする=境界が増えるという事なので、何も考えず使うと効果が途切れまくる

    • SP.CaptureHorizontalFOVをSP.HorizontalAngularIncrementよりも大きな値にすることである程度回避できる

      • 広めに撮影して中央部分だけ使う挙動になり、隣接する撮影面に描画されるEmissive物体も考慮できる

      • もろちんSP.CaptureHorizontalFOVを広げるほどに重くなるので注意

      • Bloom側でもSize Scaleを下げて効果範囲を抑える対応が必要

        • ただBloom効果範囲はFOVにも連動するので、出力結果を見つつ両者を調整していくことになる

左:症状が出ている状態 右:FOVのみ二倍にした結果

Post Process対応

  • なんとUE4.27.2付属のPluginだとPost Process Material設定が反映されない

    • Answerhubに答えがある

      • プルリクもされてるけど拾われてないのかな…

    • 内部的な撮影に使うScene Capture 2DのAlwaysPersistRenderingStateがfalseである為に反映されない

    • 自分が行った解決手順

      • 適当な新規C++ Classを定義してVS Solution生成

      • (エンジンインストールフォルダ)/Engine/Plugins/Experimental/PanoramicCapture をフォルダごと (自Project)/Plugins 内にコピー

      • AlwaysPersistRenderingStateをtrueにする修正を反映

      • VSでビルド

今作での運用例

Data Assetで各種パラメータを素早く切り替えられるようにしておくと、検証や凡ミス軽減が捗る。


Pluginに付属するCapture用Blueprintサンプルから、パラメータ設定部を抜き出してData Assetの関数にする。

するとCapture用BlueprintはData Assetを切り替えてApply Settingsを呼ぶだけで済む。

左:プレビュー用の高速設定。撮影時間1枚0.4

右:本番用の高品質設定。撮影時間1枚18

レンダリング関連

  • 上述の通り、本番用設定で1枚18秒かかるので、60FPSの30秒動画だと9時間近くレンダリングに持っていかれる。

    • 物理やパーティクル挙動を決定的にできれば分散もできそうではある

  • 本番用は5K

    • 4Kだと輪郭線が若干粗く、8Kは美麗ではあるが出力大変すぎるので5Kに落ち着いた

      • 8Kは1枚57秒かかる。28.5時間…

    • 4Kで出してUE4外で超解像して8Kにできそうだがレギュ違反

    • 5K出力だと12GBの元データを連結して153MBぐらいになる

    • パラメータは正直詰めきれていない

      • もっと撮影面を荒くして高速化しても品質に影響ないかも

      • ソースコード最適化も要検討

  • 元旦以降締め切りまで毎日、寝る前にレンダリングを仕掛ける生活

    • 途中でCrashした事は一度もなし

    • 翌日Aviutlで結合してYouTubeにテストアップロードというのが習慣になった

    • そして「アップした動画のアラ探し」から着手する。案外細かいアラが見つかってよい

      • これが継続的インテグレーションだと言われている[誰によって?][要出典][独自研究]

  • RICOHさんのTHETA用アプリを入れておくと便利

    • 静止画を球面投影状態で確認できる

    • 動画も360°動画メタ情報を埋め前に確認できる

演出関連

  • 視線の誘導

    • 意識高い看板→トイレに駆け込む人→空き缶→赤ヘッドの人が転倒→スプリンクラー→様子を見に来た黄ヘッドの人→青ヘッドの様子を見に行く黄ヘッドの人→ピンチの青ヘッドの人→青ヘッドがなぎ倒すダンボール→大爆発黄ヘッド→壁にぶっささる黄ヘッドの人→安全第一

    • 「事故の連鎖」という手法だと、どの事故から見ても「なぜコレが発生したのか?」というのを痕から探してもらえる…と思う

      • 興味を持ってもらえることが前提ではある…

  • 失敗した点

    • 黄ヘッド大爆発後に出てくる存在とその振る舞いが目立ちすぎ

      • 年末にYouTubeでやってたAKIRAの影響受けすぎ

      • 安全第一を見て欲しいのにそれどころじゃない

        • 中止だ中止

      • 爆発後はクレーターの静止状態にして退屈にさせ、吹っ飛んだ人を探させたほうがいい

      • アレを出す場合でも爆発の収束を遅くするとか煙まみれにするとかで退屈にさせればいい

        • 安全第一を見たあと、ふと爆心地どうなったかなと思って振り向いたら「なんかいる」みたいな流れがベストか

所感

  • 最初に「これ回転できる動画ですよ」の案内を入れなかったことが悔やまれる

    • とりあえず字幕機能で後付した…

  • 普通の2D動画だとカットや構図の技法が必要になるが360°動画なら不要!ワッショイ!

    • 360°動画専用の技法が必要!グワーッ!

    • 基本的に長回しになるので逆に手間になる部分も…

  • 「いちいち視点変えるのめんどくさい問題」に立ち向かう必要あり

    • 参考資料の「プレイヤーが見回すことに対してご褒美を与える」が難しい!

      • 今作は「事故の真相がわかる」が褒美になっている…と思う

        • 各ブルーマンヘッドを注視すると性質がチョットワカルので、事故の連鎖に納得性を持たせられていますか?

          • いつのまにか自分が質問側になるほどわからん…

  • チャレンジとしては面白かった

    • 未知すぎて逆に何やってもいいや感は正直あった

    • みんなも…やりましょうね!