完全にオクルードされたメッシュの検出と除去

レベルの他のオブジェクトによって完全にオクルードされたジオメトリを除去して単純化することでレンダリング パフォーマンスを改善する方法について説明します。

Windows
MacOS
Linux

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

jacketing-banner.png

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

たとえば、次のエンジンの組立部品には、別個のスタティック メッシュ アクタが 542 個存在します。しかし、これらのうち 321 個は完全にケーシング内に入っており、決してカメラには写りません。レベルからオクルードされたジオメトリを除去すると、視覚的な見栄えを変更せずに、残りのジオメトリのレンダリングがはるかに高速になります。

542 のアクタからなる完成したエンジン

321 の完全にオクルードされたアクタ

このような場合のために Unreal Editor では、レベルで選択されたスタティック メッシュ アクタをスキャンして完全にオクルードされた、つまり外側のどのビューポイントからも見えないアクタを探すオンデマンドの処理を提供します。プロセスが完全にオクルードされたアクタを特定すれば、それらのアクタをレイヤ上で分離して、レベルから完全に除去するか、内部のディテールを除去してジオメトリを単純化することができます。

このプロセスは「Jacketing」と呼ばれることがあります。

ギャップ

視界から内部のメッシュを隠しているジオメトリの外側のシェルが完全に閉じていないことがあります。外側のジオメトリに小さなギャップや途切れがあっても、内部の詳細を見せるのをブロックしています。たとえば、このモーターのチェーンは小さな穴を通って外部のシェルを通過しています。

オクルージョンするメッシュのギャップ

このような場合は、内部のメッシュを隠した方が良いでしょう。このことから、オクルードされた三角ポリゴンを検出する際に、Jacketing アルゴリズムは小さなギャップ埋めて、ギャップがあたかもメッシュに覆われているかのように処理します。これにより、オクルージョンしているメッシュが完全に塞がっていなくても、内部でオクルードされたパーツを隠すことができます。

オクルージョン テスト中に無視するギャップの最大サイズを設定できます。

念のため、ギャップ サイズのしきい値を大きな値に設定したくなるかもしれません。しかし、このしきい値は、どの三角ポリゴンがスタティック メッシュから安全に除去できるかを評価するメッシュ ターゲット モード (下記を参照) でも使用されます。ギャップのしきい値を大きくしすぎると、ジオメトリ内部の三角ポリゴンが最適に単純化されません。オクルージョンするメッシュの実際のギャップのサイズにできるだけ近いギャップのしきい値を設定してください。

ターゲット

Jacketing の実行結果は次の 2 つのターゲットのいずれかに適用できます。 レベルのスタティック メッシュ アクタ、またはスタティック メッシュ アセットのジオメトリです。

レベル ターゲット

レベル ターゲットで Jacketing ツールを実行すると、レベル内の選択されたスタティック メッシュ アクタ一式にオクルージョン テストが実行されます。すべての角度からアクタのジオメトリを分析して、すべての角度から完全に見えなくなっているアクタを検出します。オクルードされたアクタのリストが作成されたら、処理方法を選択できるようになります。

Unreal Editor UI で次のことができるようになります。

  • オクルードされたアクタに [Jacketing Hidden] という新規コンポーネントタグを付ける Jacketing Hidden タグ

  • Jacketing という名の新規レイヤにオクルードされたアクタを置きます。

  • [Actor Hidden in Game] 設定をオフにしてオクルードされたアクタをビューから隠す。

  • レベルからオクルードされたアクタを除去する。

ブループリントや Python スクリプトからレベル ターゲットのツールを実行すると、オクルードされたアクタのリストが返るので、スクリプトは取るべき適切なアクションを決定できます。

個々のスタティック メッシュ アクタでそれぞれ表された多数の細かいパーツが、比較的単純なジオメトリを持ったボックスまたはシェル内にある場合は、レベル ターゲット モードを選択すると良いでしょう。

レベル ターゲット モードでは、Jacketing ツールは、スタティック メッシュ アセットを変更しません。オクルージョン テストを実行して完全にオクルードされたアクタを検出するだけです。

メッシュ ターゲット

メッシュ ターゲット モードで Jacketing ツールを使用すると、個々の三角ポリゴンのレベルでオクルージョンを検討します。オクルージョン テストの実行後、個々の スタティック メッシュ アセットからオクルードされたと判断された三角ポリゴンがすべて除去されます。これにより、サーフェスの内部からディテールを除去し、オクルージョンしているメッシュを効果的に減らしてシェルを空にします。 

これは、ケーシングやオクルージョンしているメッシュが複雑な内部サーフェスを持っていたり、ジオメトリがオーバーラップした複数のアクタを持っている場合に有効なオプションです。オーバーラップした領域内のジオメトリは可能な限り単純化されます。

Jacketing ツールは、保守的なアプローチを用いて安全に除去可能な三角ポリゴンを識別し、表示結果が劣化するのを避けます。見える可能性のある三角ポリゴンは手付かずのまますべて残します。Jacketing ツールはジオメトリの三角ポリゴンを再作成したり単純化したりしません。不要な三角ポリゴンを除去するだけです。 

たとえば、下記の組立部品の内部には外部から決して見えない複雑なジオメトリがあります。メッシュ ターゲットに Jacketing ツールを実行するることにより、内部のディテールをすべて除去できます。ただし、外を向く辺面のジオメトリを除いて、シェルの内向きのサーフェスまでもが除去されます。

内部のジオメトリが複雑な組立部品

Jacketing 後

[アウトプットログ] パネルで、除去できた三角ポリゴンの数など Jacketing ツールの結果を確認できます。

メッシュ ターゲット モードで Jacketing ツールは、スタティック メッシュ アセットを変更します。これらのアセットがレベルのどこか他の場所またはプロジェクトの他のレベルで使用されいる場合、それらのインスタンスも自動的にアップデートされて新規ジオメトリを表示します。

レベルのビューポートの Jacketing

レベルのビューポートに Jacketing を適用するには以下を実行します。

  1. オクルージョン テストで対象にしたいレベルのスタティック メッシュ アクタを選択します。筐体の外側を構成するメッシュおよび内側のメッシュを選択してください。

  2. レベルのビューポートまたは [アウトライナ] で選択したアクタを右クリックして [Jacketing] を選択します。 コンテキスト メニューの Jacketing

  3. [Remove occluded meshes] ウィンドウで、オクルージョン テストの感度を設定し、影響を与えたいターゲットを設定します。 Jacketing の設定

    設定

    説明

    Voxel precision

    オクルージョン テストの感度を制御します。小さなモデルを対象に値を小さくして精度を上げます。

    この設定はコリジョン テストの速さおよびメモリ要件に直接影響します。比較的大きな値から開始して、要求された忠実さが得られるまで値を下げていってください。

    Gap max diameter

    オクルージョン テストで埋まっていると判断されるオクルージョンするボリュームのギャップの最大サイズを設定します。

    この値を低くしすぎないでください。詳細については上の ギャップ セクションを参照してください。

    Action Level

    ツールが Level (レベル) ターゲットか Mesh (メッシュ) ターゲットのどちらを使用するかを選択します。

    Action Type

    Level ターゲットの使用を選択すると Action Type ドロップダウンリストが使用され、Jacketing ツールが完全にオクルードされたアクタのセットに実行することを選択します。詳細については上の レベル ターゲット を参照してください。

  4. Proceed をクリックするとオクルージョン テストを開始します。 Proceed

  5. メッシュ ターゲットを選択すると、修正したメッシュはダーディとしてマークされます。変更内容を保持したければ Unreal Editor を閉じる前に保存してください。

エディタ スクリプトでの Jacketing

レベルのビューポート (および アウトライナ) で提供された Jacketing の操作をブループリントと Python でも同様に実行できます。

前提条件 今回の使用が初めての場合は、 Editor Scripting Utilities プラグイン をインストールしてください。詳細については エディタのスクリプティングと自動化 を参照してください。

実装方法を選んでください。

ブループリント

Python

これらのノードを使用するには、 PlacedEditorUtilityBase クラスなど、エディタのみのクラスから派生したブループリント クラスである必要があります。詳細については、 「ブループリントを使用したエディタのスクリプティング」 を参照してください。

使用する必要があるメインのブループリント ノードは [Mesh Processing > Mesh Actor > Simplify Assembly] です。

Simplify Assembly ノード

以下 2 つのインプットをこのノードに与える必要があります。

  • オクルージョン テストで検討する現在のレベルのアクタがすべて含まれた配列。

  • オクルージョン テストのパラメータを設定する JacketingOptions オブジェクトこれらのオブジェクトの 1 つをセットアップするには以下を実行します。

    1. マイブループリント パネルの + 変数 ボタンをクリックしてブループリントに新規変数を追加します。 変数を追加

    2. Mesh Defeaturing Parameter Object への参照となるように変数の種類を設定します。 Jacketing Options Object Reference

    3. Control を押したまま、変数をブループリント グラフにドラッグして、変数を取得する新規ノードを作成します。 変数をドラッグアンドドロップ

    4. 新規変数ノードの出力ポートから右にドラッグして、 変数 リストから、変更したい設定の Set ノードを選択します。 右にドラッグして Jacketing オプション API を表示

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)
Select Skin
Light
Dark

新しい Unreal Engine 4 ドキュメントサイトへようこそ!

あなたの声を私たちに伝えるフィードバックシステムを含め、様々な新機能について開発をおこなっています。まだ広く使える状態にはなっていないので、準備ができるまでは、ドキュメントフィードバックフォーラムで、このページについて、もしくは遭遇した問題について教えていただけると助かります。

新しいシステムが稼働した際にお知らせします。

フィードバックを送信