リアルタイム 3D アプリケーションのレンダリング パフォーマンスを改善するひとつとして、シンプルにフレームごとに描画されるオブジェクトの数を減らす方法があります。通常、カメラは 3D シーンで同時にすべてのオブジェクトを撮っていません。他のオブジェクトによってブロックされ、現在のカメラ ビューに入っていないオクルードされたオブジェクトをレンダリング中に安全に省略して、最終イメージを変えることなくパフォーマンスを改善することができます。

Unreal Engine には、視錐台のカメラの外側のメッシュや、カメラから遠すぎるメッシュを間引くなどの、フレームごとにオクルードされたメッシュを除去するいくつかの方法が組み込まれています。しかし、Unreal Engine が実行時に、どのメッシュが他のメッシュにオクルードされているか効果的に判断できないこと場合があります。特に、あるメッシュがもう 1 つのメッシュのバウンディング ボックスの内側にある場合です。この問題は一般的に、Unreal Engine にレンダリングのために取り込まれたコンピュータ支援デザイン (CAD) のデータにおいて、組立部品がケーシングの内側に完全に隠れた様々な小さなパーツで構成されているときに頻繁に発生します。パーツがリアルタイム レンダリングでまったく見えないものであれば、これらのパーツをレベルから完全に隠すか除去することでレンダリング パフォーマンスを改善できることがよくあります。Unreal Engine でレンダリングするためにインポートした、完全にモデル化された車のボンネットの中を見る方法を、プレイヤーやビューアに提供していない場合は、エンジンの内部パーツをフレームごとにレンダリングしてリソースを浪費する必要はありません。
たとえば、次のエンジンの組立部品には、別個のスタティック メッシュ アクタが 542 個存在します。しかし、これらのうち 321 個は完全にケーシング内に入っており、決してカメラには写りません。レベルからオクルードされたジオメトリを除去すると、視覚的な見栄えを変更せずに、残りのジオメトリのレンダリングがはるかに高速になります。


このような場合のために Unreal Editor では、レベルで選択されたスタティック メッシュ アクタをスキャンして完全にオクルードされた、つまり外側のどのビューポイントからも見えないアクタを探すオンデマンドの処理を提供します。プロセスが完全にオクルードされたアクタを特定すれば、それらのアクタをレイヤ上で分離して、レベルから完全に除去するか、内部のディテールを除去してジオメトリを単純化することができます。
この処理は Jacketing (覆いを付けること) と呼ばれることがあります。
隙間
視界から内部のメッシュを隠しているジオメトリの外側のシェルが完全に閉じていないことがあります。外側のジオメトリに小さな隙間 (gap) や途切れがあっても、内部の詳細を見せるのをブロックしています。たとえば、このモーターのチェーンは小さな穴を通って外部のシェルを通過しています。

このような場合は、内部のメッシュを隠した方が良いでしょう。このことから、オクルードされたトライアングルを検出する際に、Jacketing アルゴリズムは小さな隙間を埋めて、ギャップがあたかもメッシュに覆われているかのように処理します。これにより、オクルージョンしているメッシュが完全に塞がっていなくても、内部でオクルードされたパーツを隠すことができます。
オクルージョン テスト中に無視する隙間の最大サイズを設定できます。
念のため、隙間サイズのしきい値をかなり高く設定しておこうと考えるかもしれません。しかし、このしきい値は、どのトライアングルがスタティック メッシュから安全に除去できるかを評価するメッシュ ターゲット モードでも使用されます (下記を参照)。隙間のしきい値を大きくしすぎると、ジオメトリ内部のトライアングルが最適に単純化されません。しきい値は、オクルージョンの対象メッシュの実際の隙間サイズにできるだけ近い値を設定してください。
ターゲット
Jacketing 操作の実行結果は、レベルのスタティックメッシュ アクタ、または スタティックメッシュ アセットのジオメトリ のいずれかのターゲットに適用することができます。
レベル ターゲット
レベル ターゲットで Jacketing ツールを実行すると、レベル内の選択されたスタティック メッシュ アクタ一式にオクルージョン テストが実行されます。すべての角度からアクタのジオメトリを分析して、すべての角度から完全に見えなくなっているアクタを検出します。オクルードされたアクタのリストが作成されたら、処理方法を選択できるようになります。
Unreal Editor UI で次のことができるようになります。
- オクルードされたアクタに [Jacketing Hidden] という新規コンポーネントタグを付ける
- Jacketing という名の新規レイヤにオクルードされたアクタを置きます。
- [Actor Hidden in Game] 設定をオフにしてオクルードされたアクタをビューから隠す。
- レベルからオクルードされたアクタを除去する。
ブループリントや Python スクリプトからレベル ターゲットのツールを実行すると、オクルードされたアクタのリストが返るので、スクリプトは取るべき適切なアクションを決定できます。
個々のスタティック メッシュ アクタでそれぞれ表された多数の細かいパーツが、比較的単純なジオメトリを持ったボックスまたはシェル内にある場合は、レベル ターゲット モードを選択すると良いでしょう。
レベル ターゲット モードでは、Jacketing ツールは、スタティック メッシュ アセットを変更しません。オクルージョン テストを実行して完全にオクルードされたアクタを検出するだけです。
メッシュ ターゲット
メッシュ ターゲット モードで Jacketing ツールを使用すると、個々のトライアングルのレベルでオクルージョンを検討します。オクルージョン テストの実行後、個々の スタティック メッシュ アセットからオクルードされたと判断されたトライアングルがすべて除去されます。これにより、サーフェスの内部からディテールを除去し、オクルージョンしているメッシュを効果的に減らしてシェルを空にします。
これは、ケーシングやオクルージョンしているメッシュが複雑な内部サーフェスを持っていたり、ジオメトリがオーバーラップした複数のアクタを持っている場合に有効なオプションです。オーバーラップした領域内のジオメトリは可能な限り単純化されます。
Jacketing ツールは、保守的なアプローチを用いて安全に除去可能なトライアングルを識別し、表示結果が劣化するのを避けます。見える可能性のあるトライアングルは手付かずのまますべて残します。Jacketing ツールはジオメトリのトライアングルを再作成したり単純化したりしません。不要なトライアングルを除去するだけです。
たとえば、下記の組立部品の内部には外部から決して見えない複雑なジオメトリがあります。メッシュ ターゲットに Jacketing ツールを実行するることにより、内部のディテールをすべて除去できます。ただし、外を向く辺面のジオメトリを除いて、シェルの内向きのサーフェスまでもが除去されます。


[Output Log (出力ログ)] パネルで、除去できたトライアングルの数など Jacketing ツールの結果を確認できます。
メッシュ ターゲット モードで Jacketing ツールは、スタティック メッシュ アセットを変更します。これらのアセットがレベルのどこか他の場所またはプロジェクトの他のレベルで使用されいる場合、それらのインスタンスも自動的にアップデートされて新規ジオメトリを表示します。
プロジェクト設定
Jacketing ツールを使用するには、ご使用のプロジェクトの Polygon Editing プラグインを有効にします。
Architecture, Engineering, and Construction または Automotive, Manufacturing, and Product Design カテゴリのいずれかのテンプレートから開始した場合は、このプラグインがデフォルトですでに有効になっていることがあります。
Polygon Editing プラグインは 64-bit Windows のみでサポートされています。
レベルのビューポートの Jacketing
レベルのビューポートに Jacketing を適用するには以下を実行します。
- オクルージョン テストで対象にしたいレベルのスタティック メッシュ アクタを選択します。筐体の外側を構成するメッシュおよび内側のメッシュを選択してください。
- レベルのビューポートまたは [アウトライナ] で選択したアクタを右クリックして [Jacketing] を選択します。
- [Remove occluded meshes] ウィンドウで、オクルージョン テストの感度を設定し、影響を与えたいターゲットを設定します。
設定 説明 Voxel precision オクルージョン テストの感度を制御します。小さなモデルを対象に値を小さくして精度を上げます。
この設定はコリジョン テストの速さおよびメモリ要件に直接影響します。比較的大きな値から開始して、要求された忠実さが得られるまで値を下げていってください。
Gap max diameter オクルージョン テストで埋まっていると判断されるオクルージョンするボリュームのギャップの最大サイズを設定します。
この値を低くしすぎないでください。詳細については上の「隙間」セクションを参照してください。
Action Level ツールが Level (レベル) ターゲットか Mesh (メッシュ) ターゲットのどちらを使用するかを選択します。 Action Type Level ターゲットの使用を選択すると Action Type ドロップダウンリストが使用され、Jacketing ツールが完全にオクルードされたアクタのセットに実行することを選択します。詳細については、上記の「[レベル ターゲット]](#レベルターゲット)」を参照してください。 - Proceed をクリックするとオクルージョン テストを開始します。
- メッシュ ターゲットを選択すると、修正したメッシュはダーディとしてマークされます。変更内容を保持したければ Unreal Editor を閉じる前に保存してください。
エディタ スクリプトでの Jacketing
レベルのビューポート (および アウトライナ) で提供された Jacketing の操作をブループリントと Python でも同様に実行できます。
前提条件: 今回の使用が初めての場合は、Editor Scripting Utilities プラグインをインストールしてください。詳細は「エディタをスクリプト化および自動化する」を参照してください。
これらのノードを使用するには、PlacedEditorUtilityBase クラスなど、エディタのみのクラスから派生したブループリント クラスである必要があります。詳細は「ブループリントを使ってエディタをスクリプト化する」を参照してください。
使用する必要があるメインのブループリント ノードは [Mesh Processing > Mesh Actor > Simplify Assembly] です。

以下 2 つのインプットをこのノードに与える必要があります。
- オクルージョン テストで検討する現在のレベルのアクタがすべて含まれた配列。
-
オクルージョン テストのパラメータを設定する JacketingOptions オブジェクト。これらのオブジェクトの 1 つをセットアップするには以下を実行します。
-
マイブループリント パネルの + 変数 ボタンをクリックしてブループリントに新規変数を追加します。
-
Mesh Defeaturing Parameter Object への参照となるように変数の種類を設定します。
-
Control を押したまま、変数をブループリント グラフにドラッグして、変数を取得する新規ノードを作成します。
-
新規変数ノードの出力ポートから右にドラッグして、 変数 リストから、変更したい設定の Set ノードを選択します。
-
JacketingOptions をセットしてレベル ターゲット モードを使用する場合は、 Apply Jacketing on Mesh Actors ノードが全視点からオクルードされたスタティック メッシュ アクタの配列を返します。このリストをイテレーションすることでアクタを処理できます。
たとえば次のブループリント グラフは、レベルのスタティック メッシュ アクタを集めて、レベル ターゲットで Jacketing オクルージョン テストを実行して、ビューポートとワールド アウトライナでアクタを選択します。
unreal.MeshProcessingLibrary.apply_jacketing_on_mesh_actors()
を呼び出すことで、現在のレベルの任意のスタティック メッシュ アクタのセットに対して、オクルージョン テストと Jacketing 処理を実行できます。この関数に以下 2 つのパラメータを渡してください。
- オクルージョン テストで検討する現在のレベルのアクタがすべて含まれた配列。
- オクルージョン テストのパラメータをセットアップする
unreal.JacketingOptions
オブジェクト。unreal.JacketingOptions()
を呼び出してこのオブジェクトの新規インスタンスを作成して、調整したいプロパティをセットアップします。
unreal.JacketingOptions.target
プロパティを unreal.JacketingTarget.LEVEL
に設定すると、完全にオクルードされたと判断されたすべてのメッシュの配列を返します。このリストを自由に処理できます。
# レベルのアクタのリストを取得 -- この場合は
# ビューポートでユーザーが選択したアクタ。
actors = unreal.EditorLevelLibrary.get_selected_level_actors()
# 新規オブジェクトを作成して Jacketing オプションを保持する
options = unreal.JacketingOptions()
# ボクセル のグリッドの解像度をセンチメートルで設定する。
options.accuracy = 0.2
# 埋まっていると判断する最大のギャップをセンチメートルで設定する。
options.merge_distance = 3
# ターゲットを unreal.JacketingTarget.LEVEL または unreal.JacketingTarget.MESH で実行する
options.target = unreal.JacketingTarget.LEVEL
# Jacketing 操作の実行。
# レベル ターゲットで実行すると、関数はオクルードされたアクタのリストを返します。
occluded = unreal.MeshProcessingLibrary.apply_jacketing_on_mesh_actors(actors, options)
# オクルードされたアクタに何か処理をします。
# たとえば、このループはレベルからオクルードされたアクタを削除します。
for a in occluded:
a.destroy_actor()
unreal.JacketingOptions.target
プロパティを unreal.JacketingTarget.MESH
に設定すると関数は値を返しません。単純に、外から見えないと判断されたすべてのトライアングルを除去します。
例:
# レベルのアクタのリストを取得 -- この場合は
# ビューポートでユーザーが選択したアクタ。
actors = unreal.EditorLevelLibrary.get_selected_level_actors()
# 新規オブジェクトを作成して Jacketing オプションを保持する
options = unreal.JacketingOptions()
# ボクセル のグリッドの解像度をセンチメートルで設定する。
options.accuracy = 0.2
# 埋まっていると判断する最大のギャップをセンチメートルで設定する。
options.merge_distance = 3
# ターゲットを unreal.JacketingTarget.LEVEL または unreal.JacketingTarget.MESH で実行する
options.target = unreal.JacketingTarget.MESH
# Jacketing 操作の実行。
# メッシュ ターゲットで実行すると関数は、外から見える
# スタティック メッシュ アセットのジオメトリに変更を直接適用します。
unreal.MeshProcessingLibrary.apply_jacketing_on_mesh_actors(actors, options)