執筆バージョン: Unreal Engine 4.19
|
こんにちは。アシスタントエンジニアの小倉です。
今回はUE4でも使えるVRシーン単純化ツールの紹介をします。
このツールを使うと、次のような3Dシーンを、1つのメッシュと1つのポストプロセスボリュームだけで実現できます。

Seuratについて
SeuratとはGoogleが4月にオープンソース化した、主にモバイルVRを想定したVRシーン単純化ツールです。
VRシーンではとり得る視点の領域が限られていますが、実際には表示されないメッシュも配置されています。このツールでは、限られた視点の領域から、実際に表示される部分のメッシュを(なるべく見た目を変えずに)再構築することで、表示されないメッシュを減らし、シーンを単純化します。
Seuratの詳細については、公式ブログを参照ください。
Seurat Unreal Pluginを導入する
Seuratによるメッシュの再構築は、複数の視点におけるシーンのキャプチャ画像を用います。UE4ではSeurat Unreal Pluginを用いることで、キャプチャ画像を作成します。
プラグインを使用するために、まずここからプラグインをダウンロードし、Pluginsフォルダをプロジェクトフォルダ内に配置します。
UE4で使用するために、コードを変更します。まず、Seurat.Build.csのコンストラクタに、PCHUsageを追加します。
|
using UnrealBuildTool; public class Seurat : ModuleRules { public Seurat(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; // <= Add PublicIncludePaths.AddRange(new string[] { "Seurat/Public" // ... add public include paths required here ... } ); // ~ 省略 ~ |
次に、プロジェクトの.uprojectのPluginsにSeuratを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
{ "FileVersion": 3, "EngineAssociation": "4.19", "Category": "", "Description": "", "Modules": [ { "Name": "BlogTest419", "Type": "Runtime", "LoadingPhase": "Default" } ], "Plugins": [ { "Name": "Seurat", "Enabled": true } ] } |
コード変更後、プロジェクトをビルドして起動するとプラグインが有効になっています。
次に、キャプチャ用に設定を変更します。[Project Settings][Rendering]を開き、以下の項目のチェックを外します。
- Separate Translucency
- Bloom
- Ambient Occlusion
- AutoExposure

次に、レベルに配置されているDirectional Light選択して次の項目を変更します。
- Intensityを0に変更
- Cast Shadowを無効化

次に、Scene Capture Seuratアクターをレベル配置し、Detailsパネルでキャプチャ設定を行います。

プロパティについて紹介します。
プロパティ名 |
詳細 |
今回の設定値 |
Location |
アクターの座標です。この座標がHeadboxの中心になります。 |
(10, 40, 170) |
Headbox Size |
VRゴーグルをつけたときのとり得る視点の領域です。Headbox内には、表示するメッシュを含まないようにする必要があります。 |
(150, 150, 100) |
Sample Per Face |
1面あたりのキャプチャ画像数です。6面(Top, Front, Left, Right, Back, Bottom)をキャプチャするため、Sample Per Face * 6枚のキャプチャ画像が生成されます。例えば、K16の場合は96枚の画像が生成されます。 |
K16 |
Resolution |
画像の解像度です。例えばK1024を選択すると、1024 * 1024の画像がキャプチャされます。解像度が高いと、キャプチャに時間がかかります。 |
K1024 |
最後に、Detailsパネルにある「Capture」ボタンをクリックします。しばらく待ち「Scene Captured!」 というダイアログが出ればキャプチャは成功です。

Seuratからメッシュを作成する
次に、キャプチャした画像を用いてメッシュを生成します。Seuratのバイナリには、有志が提供するものを用います。ここの「seurat-compiled-msvc2017-x64.zip」をダウンロードします。zipファイル内に「seurat-pipeline-msvc2017-x64.exe」があるので、プロジェクトのIntermediate\SeuratCaptureフォルダ内にコピーします。

seurat-pipeline-msvc2017-x64.exeを実行するために、次のようなbatファイルを作成します。
|
seurat-pipeline-msvc2017-x64.exe -input_path manifest.json -output_path seurat_mesh -triangle_count 288000 -ray_footprint 0.04 -skybox_radius 768 -texture_width 8192 -texture_height 8192 pause |
コマンドラインパラメータの一部について紹介します。
パラメータ名 |
詳細 |
input_path |
入力するmanifest.jsonへのパス(必須) |
output_path |
出力するファイルのパス(必須) |
cache_path |
キャッシュのパス。プログラム終了時にジオメトリがキャッシュされる。キャッシュがあると、次の起動時にキャプチャ画像の読み込みとメッシュ生成をスキップできる |
single_face |
ヘッドボックス周囲の、指定した立方体の一面のみを出力する。全面の出力よりも高速なので、メッシュのプレビューに便利 |
triangle_count |
生成する最大Triangle数 |
ray_footprint |
ジオメトリの継ぎ目を埋めるための値。小さいとジオメトリの隙間が見えることがある |
texture_width |
生成するテクスチャの幅 |
texture_height |
生成するテクスチャの高さ |
skybox_radius |
再構築するメッシュの対象とするジオメトリの範囲。この半径の球外にあるジオメトリはクランプされる |
fast_preview |
品質を落として処理を高速化させる。プレビューに便利 |
作成したbatファイルを実行すると、メッシュ再構築が行われます。成功すると次のようになり、output_pathに指定したフォルダに再構築されたメッシュの.objと、そのテクスチャである.exrが生成されます。
メッシュをUE4へインポートする
最後に、生成された.objと.exrをUE4にインポートします。
FBX Import Optionsを次のように変更します。
- Build Adjacency Bufferを無効化
- Generate Lightmap UVsを無効化
- Import RotationのXを90に変更

次に、インポートしたStatic Meshをクリックして、Use Full Precision UVsを有効にします。

次に、スタティックメッシュに設定しているマテリアルを開き、以下のように変更します。
- マテリアルのBlend ModeをTranslucentに変更
- マテリアルのShading ModelをUnlitに変更
- インポートした.exrテクスチャをEmissiveとOpacityに接続

設定が終わったら、スタティックメッシュを空のレベルに配置します。
このレベルに配置されているのは、Seuratによる再構築を行ったメッシュと、色調を調整するためのポストプロセスボリュームの2つだけです。見た目がまったく同じというわけではありませんが、レベルに配置されていたアクター数を354から2に減らすことができました。

おわりに
Seuratを使って、シーンを単純化することができました。シーンの単純化が必ずしもシーンの最適化に繋がるわけではありませんが、手法の1つとしてお役に立てれば幸いです。
この記事は次のバージョンで作成されました。
Unreal Editor Version: 4.19.2-4033788+++UE4+Release-4.19