Datasmith インポート プロセスをカスタマイズする

ブループリントまたは Python を使用して Datasmith ファイルおよび CAD ファイルをインポートする方法、シーンを Unreal アセットおよびアクタへ変換するための設定変更の方法を説明します。

Datasmith インポート プロセスの目標は、コンテンツ作成ツールでセットアップした一連の 3D オブジェクトをスムーズに Unreal Editor に取り込むことです。これを実行するために、メッシュ、ライト、カメラ、サーフェス マテリアルなどのオブジェクトを、デザインの内容にできるだけ忠実に Unreal Engine の対応するオブジェクトに自動的に変換し、これらのアセットのインスタンスをレベルに自動的に入力します。詳細については、「Datasmith の概要」を参照してください。

ただし、場合によりインポート プロセスを調べて、元のシーンを Unreal Engine アセットに変換する方法を変更したり、アセットに対する処理を変更したりする必要があります。例えば、元のシーンに、Unreal Engine プロジェクトでは必要ないとわかっているパーツがある場合、アセットを作成する前にそれらのオブジェクトを除外する必要があります。これによりコンテンツの異なるピースに対して、Unreal Editor で処理する必要がある数が減り、大規模なシーンのインポートを迅速化することができます。

このページでは、ブループリントや Python スクリプティングを使用して Datasmith インポート プロセスを制御する方法を示します。

インポート プロセスについて

ツールバーの [Import (インポート)] ボタンを使用して Datasmith でシーンをインポートするとき (「Unreal Engine に Datasmith コンテンツをインポートする」を参照、インポータは内部で 2 段階のプロセスを実行し、ディスクの .udatasmith、CAD、他のソース ファイルからデータを取り込み、Unreal Editor のアセットおよびアクタに変換します。

  1. インポータは Datasmith シーンというインメモリ データ構造にファイルのコンテンツを読み取ります。これには、Datasmith が元のシーンから抽出できた、オブジェクトのすべてのプロパティ、シーンの 3D オブジェクトの表現、それらの関係が含まれます。

  2. Datasmith シーンがメモリへの読み込みを完了すると、インポート プロセスの第 2 段階でシーンのエレメントをファイナライズしてコンテンツ ブラウザの Unreal Engine アセットに変換します。Datasmith シーン アセットの準備ができると、インポート プロセスは現在のレベルにそのアセットをスポーンします。続いてすべての子、アクタ、スタティック メッシュ アクタ、ライト、カメラなどをスポーンします。

Two-step Datasmith import process

インポート プロセスのカスタマイズ オプション

ツールバーの [Import (インポート)] ボタンではなく、ブループリントまたは Python スクリプトを使用して Datasmith インポート プロセスを開始する場合、上記のプロセスを分割して、2 段階のプロセスを別々に実行できます。これにより Datasmith シーンをメモリ上に構築した後から、アセットとアクタをシーンに追加するファイナライズが完了する前までに独自の処理を挿入できます。

全体のプロセスは次に示すとおり、ブループリントと Python で同じです。

  1. ディスクの .udatasmith ファイルや CAD ファイルの場所から新しいインメモリ Datasmith シーン表現を構築します。

  2. シーンを Unreal アセットに変換する方法に影響するようなシーンの変更を追加で実行します。

    変更が必要なオブジェクトの種類を簡単に特定する 1 つの方法は、シーンのオブジェクトに関するメタデータを活用することです。Datasmith シーンのメタデータにアクセスする方法については、「Datasmith のメタデータを使用する」を参照してください。

  3. インポート プロセスのオプションをセットアップします。これらのオプションは [Import Datasmith (Datasmith のインポート)] ボタンを使用してインポートを開始したときに、Unreal Editor UI でセットアップしたオプションと基本的に同じです。例えば、プロジェクトにインポートされたアセットをインポータが配置するパス、Datasmith シーンから作成するオブジェクトのタイプ、パラメトリック CAD 形式用のテッセレーション設定などを設定します。

  4. インポート プロセスを完了して Datasmith シーンを Unreal アセットにファイナライズします。

  5. 上記で構築した Datasmith シーンが不要になった場合は、使用するメモリ リソースをクリアするためにシーンを破棄してください。

  6. インポート プロセスが完了し、新しいアセットがコンテンツ ブラウザで、新しいアクタが現在のレベルで利用できるようになります (インポート オプションで追加するように要求した場合)。生成された Unreal アセットに追加のポストプロセスを行ったり、コリジョン データまたは LOD を自動作成したりする場合は、ここで実行するのが適切です。「エディタのスクリプト化と自動化」も参照してください。

インポート プロセスのカスタマイズは「Datasmith の再インポート ワークフロー」で説明している再インポート プロセスに影響がある可能性があります。例えば、インポート プロセスを完了する前に Datasmith シーンからメッシュやライトなどのエレメントを削除するスクリプトを使用し、Datasmith シーン アセットを再インポートする場合、再インポート中に前処理スクリプトはスキップされます。結果として元のシーンから除外されたオブジェクトが新しく追加されたものとして検出され、プロジェクトまたはレベルに追加されます。

今のところ、「エディタのスクリプト化と自動化」で説明されているツールと手法を使用して、大部分の変更はインポート「後」に行うことをお勧めします。特定のアセットの作成を回避するなど、インポートのファイナライズ後にアセットやアクタを変更することによって実現できない特定のニーズがある場合にのみインポート中に Datasmith シーンを変更します。

始める前に

  • Datasmith Importer プラグインをプロジェクトに対して必ず有効にしてください。

  • エディタでブループリントおよび Python スクリプトを使用する方法の背景情報については、「エディタのスクリプティングと自動化」の各トピックを参照してください。

次の例では、.udatasmith ファイルおよび CAD ファイルを Unreal Editor にインポートするプロセスをカスタマイズするため、ブループリントや Python を使用する方法を示します。

OS を選択してください。

Blueprints

Python

ブループリントを使用してインポート プロセスをカスタマイズする場合は、主に [Datasmith] > [Scene (シーン)] および [Datasmith] > [Element (エレメント)] カテゴリのノードを使用します。

必要なノードに移動するには、Editor Utility ウィジェット、Editor Utility ブループリントを使用するか、Blueprint クラスを EditorUtilityActor などの Editor-only の基本クラスから派生させる必要があります。以下の例は、Editor Utility ウィジェットでボタンからトリガーされたブループリントを表しています。

目的のフォルダは /Game/ で始まる必要があります。

.udatasmith ファイルをインポートする

この例では、Get Options ノードが Base Options 変数内に基本のインポート設定を含む DatasmithImportOptions クラスを要求します。

Copy Node Graph

customized-DS-import.png

ノード グラフをコピーするには画像の左上をクリックします。

CAD ファイルをインポートする

この例では、最初の Get Options コールが前の例と同じ DatasmithImportOptions クラスを要求します。2 番目のコールで DatasmithCommonTessellationOptions クラスを要求します。このクラスは Options 変数内に手セレーション設定を含みます。3 番目のコールでは DatasmithCADImportOptions クラスを要求します。このクラスは一般的に特別な状況での使用を目的とする追加の CAD 固有の設定を含みます。

Copy Node Graph

customized-CAD-import.png

ノード グラフをコピーするには画像の左上をクリックします。

Python を使用してインポート プロセスをカスタマイズする場合、主要な開始点は unreal.DatasmithSceneElement および unreal.DatasmithCADSceneElement クラスです。これらのクラスには、ファイルからシーンを構築し、共有のベース unreal.DatasmithSceneElementBase クラスで定義された関数を通じてそのシーンでエレメントを作業し、インポートをファイナライズするために必要なすべての関数が用意されています。

.udatasmith ファイルをインポートする

    import unreal

    ds_file_on_disk = "C:\\scenes\\building.udatasmith"
    ds_scene_in_memory = unreal.DatasmithSceneElement.construct_datasmith_scene_from_file(ds_file_on_disk)

    if ds_scene_in_memory is None:
        print "Scene loading failed."
        quit()

    # シーンのデータを修正し、要素をフィルタリングしたり、組み合わせたりする...

    # 特定のキーワードを含む名前を持つメッシュを削除する。
    remove_keyword = "exterior"      # we'll remove any actors with this string in their names.
    meshes_to_skip = set([])         # we'll use this set to temporarily store the meshes we don't need.

    # 上で設定した文字列にマッチする名前のメッシュをシーンから除去する
    for mesh_actor in ds_scene_in_memory.get_all_mesh_actors():
        actor_label = mesh_actor.get_label()
        if remove_keyword in actor_label:
            print("removing actor named: " + actor_label)
            # このアクタのメッシュ アセットをスキップするメッシュのリストに追加する
            mesh = mesh_actor.get_mesh_element()
            meshes_to_skip.add(mesh)
            ds_scene_in_memory.remove_mesh_actor(mesh_actor)

    # インポートする必要ないメッシュをすべて除去する
    for mesh in meshes_to_skip:
        mesh_name = mesh.get_element_name()
        print("removing mesh named " + mesh_name)
        ds_scene_in_memory.remove_mesh(mesh)

    # インポート オプションを設定
    import_options = ds_scene_in_memory.get_options(unreal.DatasmithImportOptions)
    import_options.base_options.scene_handling = unreal.DatasmithImportScene.NEW_LEVEL

    # アセットとアクタを作成することでプロセスを最終的に確定する

    # 目的のフォルダは /Game/ で始める必要があります。
    result = ds_scene_in_memory.import_scene("/Game/MyStudioScene")

    if not result.import_succeed:
        print "Importing failed."
        quit()

    # Datasmith Scene をクリーンアップする
    ds_scene_in_memory.destroy_scene()
    print "Custom import process complete!"

CAD ファイルをインポートする

    import unreal

    # ディスク上のファイルから Datasmith CAD Scene を作成する
    # 目的のフォルダは /Game/ で始める必要があります。
    ds_file_on_disk = "C:\\designs\\Clutch assembly.SLDASM"
    ds_scene_in_memory = unreal.DatasmithSceneElement.construct_datasmith_scene_from_file(ds_file_on_disk)

    if ds_scene_in_memory is None:
        print "Scene loading failed."
        quit()

    # シーンのデータを変更して要素をフィルタではじく、または結合する
    remove_keyword = "_BODY"         # we'll remove any actors with this string in their names.
    meshes_to_skip = set([])         # we'll use this set to temporarily store the meshes we don't need.

    # 上で設定した文字列にマッチする名前のメッシュをシーンから除去する
    for mesh_actor in ds_scene_in_memory.get_all_mesh_actors():
        actor_label = mesh_actor.get_label()
        if remove_keyword in actor_label:
            print("removing actor named: " + actor_label)
            # このアクタのメッシュ アセットをスキップするメッシュのリストに追加する
            mesh = mesh_actor.get_mesh_element()
            meshes_to_skip.add(mesh)
            ds_scene_in_memory.remove_mesh_actor(mesh_actor)

    # インポートする必要ないメッシュをすべて除去する
    for mesh in meshes_to_skip:
        mesh_name = mesh.get_element_name()
        print("removing mesh named " + mesh_name)
        ds_scene_in_memory.remove_mesh(mesh)

    # インポート オプションを設定

    # メイン インポート オプション:
    import_options = ds_scene_in_memory.get_options(unreal.DatasmithImportOptions)
    import_options.base_options.scene_handling = unreal.DatasmithImportScene.NEW_LEVEL

    # CAD のみのサーフェス テッセレーション オプション:
    tessellation_options = ds_scene_in_memory.get_options(unreal.DatasmithCommonTessellationOptions)
    tessellation_options.options.chord_tolerance = 0.1
    tessellation_options.options.max_edge_length = 0
    tessellation_options.options.normal_tolerance = 30
    tessellation_options.options.stitching_technique = unreal.DatasmithCADStitchingTechnique.STITCHING_SEW

    # その他の CAD のみのオプション:
    cad_import_options = ds_scene_in_memory.get_options(unreal.DatasmithCADImportOptions)
    cad_import_options.uv_generation = unreal.CADUVGeneration.KEEP
    cad_import_options.num_threads = 8

    # アセットとアクタを作成することでプロセスを最終的に確定する
    ds_scene_in_memory.import_scene("/Game/MyCADScene")

    # Datasmith Scene をクリーンアップする
    ds_scene_in_memory.destroy_scene()
    print "Custom import process complete!"

インポート オプションを評価する

異なる Datasmith ソースファイルを使って作業する場合、API での唯一の違いはファイルの種類によってインポート操作を制御するオプションが異なる点です。

  • .udatasmith ファイルの場合、上の最初の例が目的のアセットおよびパス名、インポートするデータの種類、ライトマップ解像度設定へのアクセスを与える DatasmithImportOptions オブジェクトへのアクセス方法です。Datasmith でインポート可能なすべてのファイルの種類で使用できます。

  • CAD ファイルの場合、テッセレーション プロセスで使用する設定を制御する DatasmithCommonTessellationOptions オブジェクトと便利だと感じる他の内部デバッグ設定へのアクセスを提供する DatasmithCADImportOptions へアクセスする方法です。

  • Datasmith でサポートされているその他のファイル タイプはの場合、Cinema 4D 用 DatasmithC4DImportOptions など、他のファイルのインポート設定をカプセル化します。

これらのインポート オプションへのアクセスを除いて、シーン内で Datasmith Scene および要素を使って作業するための残りのスクリプトは完全に同じです。

インポート オプション クラスと設定の詳細については、Python API Reference または Blueprint API Reference を参照してください。

Python で DatasmithSceneElement.get_options() を呼び出す、またはブループリントで Get Options ノードを使用する場合、構築したソース タイプに適用しない Datasmith オプションのクラスを指定すると null が返されます。Python では、None が返されるかテストすることができます。ブループリントでは、要求したクラスのインスタンスの有効性を確認するために、Utilities > IsValid に戻り値を渡すことができます。

Python で DatasmithSceneElement.get_options() を使用する、またはブループリントで Datasmith > Scene > Get Options を使用する選択しとして、DatasmithSceneElement.get_all_options() または Datasmith > Scene > Get All Options を使用してシングル マップで構築した Datasmith シーンのための all クラスのオプションを抽出することができます。マップでの各エントリのキー値は、ファイルから構築した Datasmith Scene Element によって所有されるオプションのクラスであり、エントリの値は Datasmith Scene Element によって所有されるそのクラスのインスタンスです。処理するスクリプトの種類が分からない故に DatasmithSceneElement に含めるべきオプション クラスが分からない場合は、このアプローチを使用してすべてを抽出してそれらをイタレートすることができます。

Datasmith Scene について

シーンがどのように構築されているか少し知識があると、インポート前の段階に Datasmith Scene に可能な作業を理解する上で役立ちます。

シーンのコンテンツ

Datasmith Scene はほとんどの場合、さまざまなタイプの 要素 のコンテナです。これらの要素のそれぞれが、インポート後にコンテンツ ブラウザに作成される アセット または 3D 空間での特別なトランスフォームでレベルにスポーンされる アクタ です。

以下は主なアセット要素タイプです。

  • メッシュ:各メッシュ要素は 3D ジオメトリのブロックを表します。インポートを完了すると、各メッシュ要素は「Geometry」フォルダで別々の Static Mesh オブジェクトになります。各メッシュ要素には数多くのマテリアル スロットがあり、各スロットはマテリアル要素と名前で関連づけられています。

  • マテリアル:各マテリアルはジオメトリに必要な明確なサーフェス タイプを表します。インポートを完了すると、各マテリアル要素は「Material」フォルダで別々の Material オブジェクトになります。

  • テクスチャ:各テクスチャ要素は最低 1 つのマテリアルに使用される単一の 2D 画像を表します。インポートを完了すると、各マテリアル要素は「Texture」フォルダで別々の Texture オブジェクトになります。

以下は主なアクタ要素タイプです。

  • Mesh アクタ:各 Mesh アクタ要素はレベル内のメッシュ ジオメトリのインスタンスを表します。インポートを完了すると、各 Mesh アクタ要素はワールド アウトライナーの Static Mesh アクタになります。

  • ライト アクタ:各ライト アクタ要素はシーン内のライト エミッタを表します。インポートを完了すると、各ライト マップ要素はポイント ライト、スポット ライト、エリア ライトをシミュレートするカスタム Datasmith アクタなど、レベル内で基本的なUnreal ライト タイプのインスタンスとなります。これらのライトに対して、強度、カラー、IES プロファイル テクスチャ ファイルなど、さまざまなプロパティの取得と設定が可能です。

  • Camera アクタ:各カメラはソース シーンで設定された視点を表します。インポートを完了すると、各 Camera アクタ要素はレベル内の CineCameraActor になります。これらの Camera アクタに対してアスペクト比率など基本的なプロパティの取得および設定が可能です。

メモリの Datasmith Scene に含まれるデータは、開いてみると .udatasmith ファイルとよく似ています。3ds Max または Sketchup をしている場合は、.udatasmith ファイルを開くと Datasmith Scene オブジェクトがどのように構築されているかが分かります。

Datasmith file XML contents

Datasmith シーンでの作業

上記で概要を説明したエレメントのリストを取得するため、主に Datasmith シーンでインタラクティブに作業します。Python でこれを行うためには、DatasmithSceneElement が派生した DatasmithSceneElementBase クラスで指定した関数を使います。ブループリントでは、上の例で示したように、Datasmith ノード > Scene ノード を使用します。

エレメントのリストを入手したら、特定のエレメントを取得するためにリストでイテレーションを実行できます。次に、そのエレメント用の Python API (DatasmithMeshActorElement など)、またはブループリントでは Datasmith ノード > Element ノード を使用して、特定エレメントに関する情報を取得し設定します。エレメントがアクタ タイプである場合、シーン階層を下位に移動して、子アクタ エレメントを取得することもできます。

既存のエレメントをシーンから削除する場合 (上記の例に示したとおり)、または新しいエレメントを追加する場合も、同じ場所に公開された関数を使って行うことが可能です。たとえば、Python の DatasmithSceneElement クラスに公開された関数またはブループリントの Datasmith > Scene カテゴリのノードを使用して、それらを除去し別の親に追加することで、アクタの階層を再度シャッフルすることができます。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル