株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • 【UnrealEngine4】を映像制作で使うためのTips

【UnrealEngine4】を映像制作で使うためのTips

2016/11/28

Tag:

はじめまして、今年DFに入社した開発の澤田です。

今回は、現在自分が携わっているUnrealEngine4(以下UE4)を映像制作向けで使うためのTipsを紹介したいと思います。UE4はコミュニティーが非常に活発で、執筆しようと考えていたネタがいつの間にか他のBlogやウェブサイトで纏まっていることも多く何について書こうか迷いましたが、比較的情報の少ない事柄を書いていこうと思います。参考になれば幸いです。

※検証バージョンはUE4.13になります。バージョンによっては使用できない機能や、操作画面の画像に差異が生じる可能性があります。ご了承ください。

目次

  ・SequencerとCamera
    ・Cinematicsについて
    ・Level SequenceとMaster Sequenceについて
    ・LevelとLevel Sequenceの関係とSpawnable
    ・Cinematic Viewport
    ・Level Sequence
       ・Actorの登録
       ・特殊なトラック
    ・Cameraの管理と挙動について
  ・バッチレンダリング
  ・キャッシュの共有機能

SequencerとCamera

SequencerとCameraについて、簡単に概要と注意すべきポイントを書いていこうと思います。Sequencerを使用するためには、まずエディタ上部のメニューにある、Cinematicsからはじめることができます。

Cinematicsについて

Cinematicsをクリックすると次のようなSequenceを作成することができます。3つの項目がありますが、種類的にはLevel SequenceとMatineeの2種類です。Matineeは4.11以前に使用されているカットシーンを制作するための機能で、Level Sequenceは4.12以降のバージョンに追加されたMatineeよりも強化された機能です。
Table01
seq000

Level SequenceとMaster Sequenceについて

Master SequenceではShotsの数や命名規則などを設定することで、その設定に則ったディレクトリやLevel Sequenceを作成します(作成されるのは、特別なものではなく階層化されたLevel Sequence)。
各環境に合ったワークフローに対応させるためには、Master Sequenceを使用するのではなく、Level Sequenceを用いて構築していく必要があると思います。
seq001

LevelとLevel Sequenceの関係とSpawnable

Level Sequenceは、Level内に配置されているCamera、Charactor、Light、EffectといったActorを制御することができます。
LevelSeqGraph00

これまでのMatineeでは必ずLevel内に読み込んであるものを制御する形になっていましたが、Level SequenceではActorを生成、Spawnさせることが可能になっており、Levelに依存しない管理が可能になりました。必要なAssetをLevel SequenceにSpawnableとして登録しておくことで、異なるLevelに同じ構成のActorをSpawnして動かすことができます。
LevelSeqGraph03

また、Level SequenceでLevel Sequenceを管理することも可能なので、階層的にLevel Sequenceを構築することも可能です。これらの機能により柔軟なシーン構築に対応できます。
LevelSeqGraph02

Cinematic Viewport

Sequencerで作業を行うために映像制作用のビューポートが用意されています。このモードを使うことでフレーム移動などを簡単に行うことができます。
CinemaViewport01
CinemaViewport02
※ショートカット
Table02

Level Sequence

Level Sequenceを開くとSequencerが開き対象のLevel Sequenceが開かれます。UIはタイムラインエディタのようになっていて、各トラックにLevel SequenceやActorを配置して動かしていくことになります。

Actorの登録

基本的にはContents BrowserやLevelのTreeviewからDrag and Dropで登録することができます。そして右クリックのメニューからActorのSpawnable設定を行うことができます。これによりLevelに配置されていたものをSequencerが管理するようになります(LevelのTreeviewからは消えます)。
sequencer_11

Level SequenceからLevelに戻したい場合も右クリックから変更することができます。
sequencer_10

特殊なトラック

次に特殊なトラックについてです。基本的には次の画像を見ていただきたいのですが、気をつけなければいけないのが、混合しがちになるShots、Subscenes、Camera Cutsです。
sequencer_t

まずShotsはLevel SequenceをSub Sequenceとしてトラックに配置することができます。重ねて配置することも可能ですが、上位に配置されているLevel Sequenceが終わるまで、下に配置されてるLevel Sequenceは影響が無くなります。
sequencer_02

Subscenesに設定されているLevel Sequenceは、平行に配置されている場合でも同時に再生されるため、各工程を分業で行う場合は、その工程ごとに扱うAssetsをSubscenesに分けることで、他の作業に影響を与えずにシーンの編集を行うことができます。ただし同じオブジェクトの移動などを行おうとすると変換が合成され予想し辛い結果になるため注意してください。
sequencer_03

Camera Cutsは、複数配置されているCameraから、どのCameraをメインにするか決めるトラックです。
sequencer_04

Cameraの管理と挙動について

CameraをLevel Sequenceで管理した場合の挙動について説明します。同一Level Sequenceでは、トラックに上下関係はありませんが、Level SequenceをShotsトラックに登録して階層構造を作っている場合は、登録元のLevel Sequenceの優先度が高くなるという点に注意が必要です。Shotsに登録したSub Sequenceよりも、親のLevel SequenceにCameraの設定が存在すれば親のLevel Sequenceが優先されます。この仕様により、メインのCameraがLevel Sequenceの構成によって変わってくることになります。

次の画像でShotsに関する例を紹介します(実線は所有関係で、点線は制御している関係)。
Level Sequence Aを開いている状態で、次の画像の状態になった場合はCamera AがメインのCameraになります。
※Level Sequence Bを開いている状態ではCamera Bがメインとなりレンダリングを行うことができます。
sequencer_06

次に注意するポイントは、Subsceneに登録したLevel Sequence内に設定されたCamera Cutsは無視されるということです。
※タイムライン上のSubsceneトラックにはCameraのアクティブアイコンが存在しません。
sequencer_07

次の画像でSubsceneの特徴について例を紹介します。画像のような状態でLevel Sequence AにCamera Cutsの指定を行っていない場合は、どのCameraも指定されていない状態になります。
sequencer_08

同様の状況でShotsを使用している場合は、Camera BがメインのCameraになります。
sequencer_09

なお、Subsceneの場合でもCameraの動き自体はアニメーションされるので、
そのCameraをCamera Cutsに登録することでメインのCameraにすることは可能です。
sequencer_12

その場合、次のようにCameraActorが自動で登録されます。
sequencer_05

これらがCameraを扱う上でのShotsとSubsceneの違いになってきます。

バッチレンダリング

次は、少しマニアックな話になりますがバッチレンダリングを行うための仕組みについて紹介します。
Matineeにおいても可能でしたが、Sequencerを使ってレンダリングを行った場合に、Use Separate Processという設定があります。

batch01

これを設定して実行してみると、エディタのEXE、プロジェクトパスやManifestというファイルを渡すことによってレンダリングを行えることがわかります。多くの項目があるためすべてを紹介することはできませんが、基本的にはエディタで設定できるものが渡されているため難しくはないと思います。

・コマンド例

"./UE4Editor.exe" "./ProjectDirectory/ProjectDirectory.uproject" /Game/Developers/sawada/test/ -MovieSceneCaptureManifest="./ProjectDirectory/Saved/MovieSceneCapture/Manifest.json" -game -NoLoadingScreen -ForceRes -Windowed -NOSCREENMESSAGES -ddc=DerivedDataBackendGraph  -NoTextureStreaming -ResX=1920 -ResY=1080 -Windowed -messaging -SessionName="Movie Scene Capture"  -Multiprocess


※コマンド中では”ProjectDirectory”をProject名のように扱っています。

Manifestについては、JSON形式で作られているもので、1度レンダリングを行うと”./ProjectDirectory/Saved/MovieSceneCapture/Manifest.json”というパスに作成されます。このファイルを見てみると出力パスや、レンダリングフレーム情報などさまざまな情報が格納されています。バージョン管理ソフトなどでディレクトリ構造を共有し、用途にあったManifestを自分で作成することでバッチレンダリングを行うことが可能になります。

キャッシュの共有機能

複数人で作業する場合は、キャッシュを共有するDDC機能が非常に便利です。これは、Assetを作成した人や編集した人のキャッシュを共有化することで高速化を行う仕組みです。INIファイルに、共有でアクセスできるディレクトリを設定し、起動するときに引数として設定したDDC設定の名前を渡すことによって、共有のキャッシュを読み込んでくれるようになります(キャッシュが存在しない場合は作成します)。

下記shared項目にある”C:\DF\DDC”をキャッシュ保存場所に変更し、”./ProjectDirectory/Config/DefaultEngine.ini”のINIファイルの最後に追記してください(ない場合は作成してください)。

[DerivedDataBackendGraph]
MinimumDaysToKeepFile=7
Root=(Type=KeyLength, Length=120, Inner=AsyncPut)
AsyncPut=(Type=AsyncPut, Inner=Hierarchy)
Hierarchy=(Type=Hierarchical, Inner=Boot, Inner=Pak, Inner=EnginePak, Inner=Local, Inner=Shared)
Boot=(Type=Boot, Filename=%GAMEDIR%DerivedDataCache/Boot.ddc, MaxCacheSize=256)
Local=(Type=FileSystem, ReadOnly=false, Clean=false, Flush=false, PurgeTransient=true, DeleteUnused=true, UnusedFileAge=17, FoldersToClean=-1, Path=../../../Engine/DerivedDataCache)
Shared=(Type=FileSystem, ReadOnly=false, Clean=false, Flush=false, DeleteUnused=true, UnusedFileAge=19, FoldersToClean=-1, Path=C:\DF\DDC, EnvPathOverride=UE-SharedDataCachePath)
Pak=(Type=ReadPak, Filename=%GAMEDIR%DerivedDataCache/DDC.ddp)
EnginePak=(Type=ReadPak, Filename=../../../Engine/DerivedDataCache/DDC.ddp)

・引数の渡し方例

UE4Editor.exe xxxxx.uproject -ddc=DerivedDataBackendGraph

※DerivedDataBackendGraph:DefaultEngine.iniで記入したDDC設定の名前

検証した結果、初回読み込み時に約10分かかっていたLevelがローカルにキャッシュがない状態で1分以下で読み込めるようになり、平均しても10分の1程度になることが確認できました。

しかし、ネットワークやストレージ環境によっては共有のキャッシュを使用するのではなく、そのままローカルでキャッシュを作成した方が良い場合もあるかもしれません。
キャッシュヒットの情報やロード時間については引数で「-logcmds=”LogDerivedDataCache Verbose”」を渡すことによってOutput logに表示されるようになります。作業環境に合わせて使用するか見極めましょう。

・引数の渡し方例

UE4Editor.exe xxxxx.uproject -logcmds="LogDerivedDataCache Verbose" -ddc=DerivedDataBackendGraph

おわりに

今回の記事は以上になります。

UE4は更新頻度が高く、どんどん新しい機能が追加され自由度も高くなっているので、様々なワークフローに合わせて使用することが可能になってきていると思います。ありがたい事に、映像制作の場合はロイヤリティーフリーで使用できますので、もしまだ使われたことのない方は、活用してみてはいかがでしょうか。

参考リンク

・シーケンサーの操作ガイド – Unreal Engine 4 Documentation:
https://docs.unrealengine.com/latest/JPN/Engine/Sequencer/HowTo/
・派生データのキャッシュ – Unreal Engine 4 Documentation:
https://docs.unrealengine.com/latest/JPN/Engine/Basics/DerivedDataCache/


※免責事項※
本記事内で公開している全ての手法・コードの有用性、安全性について、当方は一切の保証を与えるものではありません。
これらのコードを使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご使用ください。

Pocket

コメント

コメントはありません

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*