Datasmith エクスポート SDK ガイドライン

Datasmith を介して Unreal Engine にサードパーティのコンテンツをエクスポートするアプリケーションを開発するためのガイドラインとベスト プラクティスの概要

Choose your operating system:

Windows

macOS

Linux

このガイドの対象者

このガイドは、Datasmith フレームワークを使用してサードパーティのデザイン アプリケーションから Unreal Engine にシーンをエクスポートしたい 3D アプリケーション開発者を対象としています。

このガイドでは、以下の前提条件を設けています。

  • 経験豊富な C++ プログラマーであること。

  • 3D アプリケーションの開発に精通していること。

  • サードパーティの 3D アプリケーションから Unreal Engine や Twinmotion にモデルをエクスポートする機能を開発中であること。

  • Unreal Engine の仕組みには慣れていないが、学ぶ意欲があること。

学習内容

このページでは、Datasmith SDK を使用してその他のデザイン アプリケーションから Unreal Engine に 3D モデルをエクスポートするためのガイドラインとベスト プラクティスの概要を説明します。大まかには、以下の概要を説明します。

  • Datasmith の設計理念

  • Unreal Engine におけるデータモデルと構造。

  • エクスポート プロセスの各主要部分の個別のチェックリストの付いた、Datasmith エクスポータのための UX ガイドライン。

  • さまざまなシナリオに役立つ API コールとコード例。

ダウンロードと前提条件

このセクションには以下の内容が含まれます。

  • ダウンロードが必要なものと入手できる場所のリスト。

  • 開始するにあたって必要な Datasmith と Unreal Engine の知識の概要とさらなる学習のための資料へのリンク。

Unreal Engine と Datasmith SDK をダウンロードする

Unreal Engine GitHub リポジトリ から Unreal Engine をダウンロードおよびビルドする場合、Datasmith SDK は同梱されています。

GitHub から Unreal Engine のソース コードをダウンロードするには、まず最初に このガイド の説明に従ってレポジトリへのアクセスをリクエストする必要があります。アクセス権が与えられていない場合、404 エラーが表示されます。

Unreal Engine ソース コードをダウンロードしてください。Datasmith SDK は以下の場所にあります。

\Engine\Source\Programs\Enterprise\Datasmith\DatasmithSDK\

Documentation フォルダには、サンプル プロジェクトおよび開発環境の設定方法の手順が含まれます。

Epic Games Launcher から Unreal Engine をダウンロードおよびインストールする場合、Datasmith SDK は Unreal Engine GitHub レポジトリの このフォルダ から別途ダウンロードする必要があります。

Epic Games では、Revit、SketchUp、3ds Max などのいくつかのデザイン アプリケーションのための Datasmith エクスポート プラグインを開発しました。これらのプラグインを参考例として、ご自身の作品に活用してください。

この Datasmith エクスポート プラグインのソース コードは、Epic Games GitHub レポジトリにあり、次の URL からアクセスできます。

\Engine\Source\Programs\Enterprise\Datasmith\

Datasmith を理解する

Datasmith は、さまざまなデザイン アプリケーションを使用して事前構築されたシーンを Unreal Engine にインポートするためのツールとプラグインのコレクションで、FBX や OBJ などの他の一般的なファイルフォーマットの制限を克服するために設計されました。

Datasmith では以下のことが可能です。

  • 大きなメッシュを扱うこと。

  • 以下のような、Unreal Engine が使用するデータを格納すること。

    • LOD

    • コリジョン

    • ライト

    • オブジェクト階層

    • メタデータ

  • テクスチャ ファイルを (2 の累乗、Unreal Engine が処理するフォーマットに) 再フォーマットすること。

Datasmith の特徴と機能の詳細については、「 Datasmith の概要 」ページを参照してください。

データをエクスポートは次の 2 つの手順で行います。

  1. デザイン アプリケーションを解析し、 DatasmithCore API を使用して、 DatasmithScene を構築します。

  2. DatasmithExporter API を使用して、ディスクにシーンをエクスポートします。

API の使用方法については、以下のドキュメントを参照してください。

Unreal Engine のデータ モデル

Datasmith エクスポータを書き始める前に、Unreal Engine がどのように情報を格納し構造化するかを理解しておいてください。

Unreal Engine はプロジェクトと連動します。Unreal プロジェクトには少なくとも 1 つの レベル が含まれ、レベルには 1 つ以上の アクタ が含まれます。アクタには、位置、回転、スケールがあり、異なるレイヤーに存在したり、表示したり非表示にしたり、アニメーションをつけることができます。

各アクタには、以下のような 1 つ以上の コンポーネント があります。

スタティック メッシュは、 マスター マテリアルやマテリアル インスタンス を参照します。順番に、マテリアル アセットはテクスチャ アセットを参照します。

単一のスタティック メッシュは複数のアクタによって参照できます。これは、ジオメトリのインスタンス化と呼ばれます。

Datasmith の設計原則

プラグイン デベロッパーとして、どのソフトウェアからデータをエクスポートするかにかかわらず、ユーザー エクスペリエンスに一貫性を持たせるようにしなければいけません。そのため、下記の Datasmith の設計原則を理解し、徹底することが大切です。これらは私たち (Datasmith デベロッパー チーム) がプラグインを開発する際に使用する原則です。

Datasmith プラグインのタイプ

Datasmith プラグインは以下のいずれかのスキームを使用します。

  • エクスポータ / インポータ コンビネーション。たとえば、3ds Max、Revit、SketchUp は以下を使用します。

    • ソフトウェア側の Datasmith エクスポータ プラグイン

    • Unreal Engine 側の Datasmith ファイル インポータ プラグイン

  • 直接インポータ。たとえば Unreal Engine は、Rhino、Solidworks、Cinema4D に固有のいくつかのファイル フォーマットをインポートできます。

どのワークフローを使用するかは、ケースによって異なります。

エクスポートとインポートのロジック

異なるアプリケーション間でデータを交換するうえで課題の 1 つは、ロジックの一部をどこに配置するかを理解することです。1 つのアプリケーションから別のアプリケーションへデータを変換する際、以下を確認してください。

  • すべてをエクスポートするべきか、一部のエンティティを除外するオプションを提供するべきか。

  • エクスポートする際、小さいオブジェクトを除外するべきか。「小さい」をどう定義するのか。

  • エクスポートする際、ポリゴンの数を減らすべきか。テクスチャ解像度を減らすべきか。

  • 単位とスケールなどを合わせるためのエンティティの再スケーリングはどこで行うのか。

一般的に、私たちのアプローチは、すべてを詳細にエクスポートし (つまり、オブジェクト単位)、後で Unreal Engine や Twinmotion にデータがインポートする際に、オブジェクトのマージ、ポリゴンの削減、その他のデータのデータ準備操作を処理することです。

インポートの際のデータ最適化の詳細については「 Visual Dataprep 」のドキュメントを参照してください。

厳格なルールはありませんが、私たちの一般的なアプローチでは、Datasmith エクスポータで公開されるオプションは最小限 (またはなし) で、Unreal Engine ユーザーがインポート時にほとんどの決定をできるようにすることが最善となります。

このアプローチでは、自分のデータをどれだけ細かくするか、またはどれだけ最適化するかは Unreal Engine や Twinmotion ユーザー次第です。Unreal Engine の Dataprep はそのような決定をするのに適切なツールです。

ソース変更後のデータの再インポート

Datasmith の役目は、一般にデザイン データをもとにリアルタイム ビジュアライゼーションとエクスペリエンスを構築するため、各種ソース アプリケーションからそのデータを Unreal Engine に取り込むことです。多くの場合、Unreal Engine でこれらのビジュアライゼーションやエクスぺリエンスの構築を作業中に、作品に取り込むシーンやデザイン データでは、新しい要件を満たす、あるいは利害関係者のフィードバックを反映するために変更が必要です。

手間とコストがかかる作業のやり直しをなくすには、それらのアップストリームの変更を、Unreal Editor で実行したすべての作業を失わずに取り込めることが必要です。このため、Datasmith はUnreal プロジェクト内のすべての変更を保存する、 再インポート ワークフロー を提供します。

Datasmith SDK の観点から、データの再インポートは次の 2 つのことを意味します。

  1. エンティティには、永続的な固有の識別子が必要です。複数のオブジェクトが同じ名前を持つことができるので、オブジェクト名に頼るのは得策ではありません。

  2. エンティティは、できるだけ高いパフォーマンスでデータの再インポートが可能なハッシュ値で保存しなければいけません。

    Datasmith エンティティが作成される際、オブジェクトのデータに基づいて一意の番号が生成されます。たとえば、2 つのメッシュが同じかどうかを素早く判断するには、手間のかかるアルゴリズムを使って向かい合わせて比較するか、頂点、面、UV の数に基づいた数値を計算するかの、どちらかです。これらの 2 つの値を比較する方が、メッシュが同一かどうかをより早く判断できます。

このページの下の方にその例が記載されています。

環境とライティング

Unreal Engine をレンダリング エンジンと認識して、すべての環境設定とともにモデルをエクスポートしたくなるかもしれませんが、そうした芸術的な決定は、データがエンジンにインポートされた後で Unreal Engine や Twinmotion ユーザーが行うのが最適だということが分かりました。

最も重要な側面は、モデル要素 (ジオメトリ、マテリアル、ライト、メタデータ) をインポートすることです。Unreal Engine や Twinmotion にデータがインポートされたら、ユーザーはマテリアルを変更したり、ライティングを微調整したり、その他の芸術的な作業を行うことができます。

Datasmith エクスポータのための UX ガイドライン

ここまで来たら、おそらくUnreal Engine をコンパイルし、小さなアプリケーションで自分の初めての Datasmith ファイルを作成できたことと思います。おつかれさまでした!

次は、エンドユーザーのためにデータをどのように構成すべきかに関連する、UX の考慮事項です。

エクスポータ UI

Datasmith の設計原則のセクションですでに説明したとおり、Datasmith へのエクスポート時のオプションは最小限にしたいと考えています。以下はその例です。

Revit からの Datasmith エクスポータ

Unreal Engine のエクスポート オプション ダイアログ

ガイドライン

  • アプリケーションの表示およびフィルタリング機能に任せて、WYSIWYG (見た目と結果が同じになる) のエクスポートを優先します。たとえば、Revit はアクティブなビューで表示されているものだけをエクスポートし、SketchUp は画面上に表示されているものだけをエクスポートします。エクスポートするエンティティを選択し、フィルタリングするための、まったく新しい UX を開発する必要はありません。

  • エクスポート時、オプションがまったくないことを優先します。

  • オプションを公開しなければいけない場合、できるだけシンプルにします。上の 3ds Max エクスポータを例として参照してください。

避けること

ジオメトリの詳細、オブジェクト タイプ フィルタリング、UV チャンネルなどのデータ準備と最適化に関するオプション。これは、Unreal Engine ユーザーが Unreal Engine 内で決定するべきです。

進捗状況とエラー メッセージ

Datasmith エクスポータは Unreal Engine でのシーンの転送と再構築に関連するすべてのエンティティを収集します。一部のエンティティはエクスポートできない場合があります。1 つ以上のエンティティがエクスポートできない場合、ユーザーに知らせる必要があります。

さらに、一部のプロジェクトは非常に大きく、エクスポートするのに長時間かかることがあります。ユーザーが進捗状況を確認できるようにする必要があります。

以下はその例です。画像をクリックするとフルサイズで表示されます。

ガイドライン

  • エクスポート中、進捗状況をユーザーに提示する必要があります。

  • ユーザーが Datasmith エクスポート プロセスをキャンセルできるようにする必要があります。

  • エラー メッセージのログを表示し、サポートされていないオブジェクト、欠落しているテクスチャ、その他の問題をユーザーに知らせる必要があります。

あると便利なもの

多くの場合、一部のユーザーからバッチ処理とスクリプトを要求されます。たとえば、SketchUp、3ds Max、または Revit では、ユーザーはネイティブ アプリケーションのスクリプト言語を使用して、Datasmith にバッチ エクスポートすることができます。

避けること

エラーや警告が発生するたびにエクスポート プロセスを中断する、連続するモーダル ダイアログ (OK / キャンセル ウインドウ) を実装しないこと。

便利な API コール

コード例

実装例は、Unreal Engine リポジトリの以下のファイルを参照してください。

/Engine/Source/Programs/Enterprise/Datasmith/DatasmithSketchUpRubyExporter/Private/DatasmithSketchUpExporter.cpp

エクスポートしたファイルとフォルダの構造

Datasmith 「ファイル」は以下の 2 つの部分で構成されます。

  • XML データ構造を使用する .udatasmith ファイル。

  • .udatasmith ファイルに関連するすべてのアセットを含む「サイドカー フォルダ」(関連するフォルダ)。

Example sidecar folder for an .udatasmith file

エクスポート ファイルとその関連フォルダの例。

必須なもの

  • 単一の「 [filename].udatasmith 」ファイルと単一の関連する「[filename]_Assets」フォルダ。

  • 関連するすべてのアセットは、 [filename]_Assets フォルダに格納されます。

  • アセットは、相対パスを使用して「 .udatasmith 」ファイルの XML 構造で参照されます。

避けること

  • 絶対パスでアセットを参照しないこと。

  • アセット含む追加のフォルダやサブフォルダを作成しないこと。以下は、誤ったエクスポートの例です。

    Incorrect file structure

    Textures 」フォルダが Datasmith プロジェクト ファイルの外にあることに注目してください。これは正しくありません。

Datasmith ファイル ヘッダ

私たち (Epic Games) は、データがどこから来たのかを把握するためにヘッダ情報を使用します。私たちのテレメトリは、どのソースからどのタイプのファイルがインポートされたかに関する統計のみを収集します。

以下は、「Datasmith」ファイルのヘッダの例です。

<DatasmithUnrealScene>
    <Version>0.24</Version>
    <SDKVersion>4.25</SDKVersion>
    <Host>Revit</Host>
    <Application Vendor="Autodesk Inc."ProductName="Revit" ProductVersion="2018"/>
    <User ID="1e8adca84ffe2d4d625d54b63fba876d" OS="Windows 10 (Release 1709)"/>

必須なもの

Datasmith 情報は、上記の例と同様に正しく設定する必要があります。

便利な API コール

コード例

実装例は、Unreal Engine リポジトリの以下のファイルを参照してください。

/Engine/Source/Programs/Enterprise/Datasmith/DatasmithSketchUpRubyExporter/Private/DatasmithSketchUpExporter.cpp

スタティック メッシュ アセット

スタティック メッシュ アセット ( IDatasmithMeshElement ) は実際のジオメトリを定義しますが、アクタ ( IDatasmithMeshActorElement ) に参照されるまでは Unreal Engine や Twinmotion のビューポートには表示されません。シーン内の複数の IDatasmithMeshActorElement のインスタンスもスタティック メッシュ アセットを指すことができます。

スタティック メッシュ アセットは以下のデータを保有します。

  • 面、頂点、法線、スムージング マスク

  • UV

  • コリジョン

  • LOD (詳細度)

  • 頂点カラー

  • マテリアル ID と割り当てなど。

以下は、「.udatasmith」ファイル内のスタティック メッシュ アセットのデータ構造の例です。

<StaticMesh name="c96130816d3eee95f82a6c00e553f491" label="Walls_Basic_Wall_Exterior_-_Insulation_on_Masonry">
  <file path="rac_advanced_sample_project-3DView-{3D}_Assets/c96130816d3eee95f82a6c00e553f491.udsmesh"/>
  <Size a="5922000.0" x="855.299927" y="30.300011" z="1139.999878"/>
  <LightmapCoordinateIndex value="-1"/>
  <LightmapUV value="-1"/>
  <Hash value="c0e8334d671cf30ef8ff8a67aa4da25b"/>
  <Material id="9" name="e72f7720bfd15817d3789377231c9646"/>
  <Material id="10" name="5d261e4bd619e79ebea1cfcc1d1a8d8e"/>
  <Material id="11" name="13b3765549b7832c6bc26e8922497ced"/>
</StaticMesh>

必須なもの

  • スタティック メッシュの 名前 は一意である必要があり、連続するエクスポート間で変更してはいけません。これは、その後の再インポートのためにエンティティを追跡するために必要です。3D アプリケーションは通常、この目的に適した GUID を提供しています。

  • スタティック メッシュの ラベル はサニタイジングされ、ユーザーが読み取り可能で、オブジェクトの内容を表すものでなければいけません。

メッシュ アセットの一意の名前

Unreal Engine における、ユーザーが読み取り可能なラベル

  • スタティック メッシュ アセット ( IDatasmithMeshElement ) は、該当するアクタ間で再利用しなければいけません (インスタンス化されている必要があります)。

  • Unreal Engine ユーザーは 左利き用 Z-up 座標を使用し、寸法をセンチメートル単位で測定します。したがって、

    • エクスポータ側で変換しなければいけません。

    • Unreal Engine での画像の反転を防ぐために、マテリアル タイリングで負のスケールの使用を避けるため、UV テクスチャ座標は垂直方向 (Y 軸方向) に反転しなければいけません。

    • スケール変換と座標トランスフォーメーションはアクタ トランスフォームに適用するのではなく、スタティック メッシュにベイクしなければいけません。

      Scale baked into scene geometry

      Scale baked into scene geometry

      スケールをジオメトリにベイクすることにより、アクタ トランスフォームが (2.54 または 0.333 ではなく) 1.0 のスケールに設定されます

    • メッシュ ピボットは、すべてが 0、0、0 にならないように、メッシュで計算しなければいけません。

      A correctly aligned mesh pivot

      An incorrectly aligned mesh pivot

      左:オブジェクトにアラインメントされたメッシュ ピボット (正しい)。右:ピボットが 0、0、0 (誤り)

    • スムージング マスクとシェーディングが正しく機能するために、トライアングルは結合されていなければいけません。

      Smoothing, Normals, etc. are correctly set on the geometry

      Smoothing, Normals, etc. are correctly set on the geometry

      スムージング、法線などがジオメトリで正しく設定されている。

あると便利なもの

  • 追加の LOD を指定すること。

  • コリジョン メッシュを指定すること。

  • ライトマップ UV チャンネル (アンラップ) を指定すること。

避けること

  • エクスポート間で一意性や再現性が保証できないスタティック メッシュの名前。ユーザー指定のオブジェクト名を使用しないこと。

  • アクタ トランスフォーム内に単位の再スケーリングを保存しないこと。

  • ピボットを 0、0、0 のままにしないこと。

  • 結合されるべき何千ものスタティック メッシュ アクタをエクスポートしないこと。たとえば、 ボックス は通常、6 つの面がある単一メッシュであり、それぞれに 1 つの面がある 6 つの個別のメッシュではありません。

便利な API コール

コード例

実装例は、Unreal Engine リポジトリの以下のファイルを参照してください。

/Engine/Source/Programs/Enterprise/Datasmith/DatasmithSketchUpRubyExporter/Private/DatasmithSketchUpExporter.cpp

スタティック メッシュ アクタ

スタティック メッシュ アクタ ( IDatasmithMeshActorElements ) は実際のジオメトリを定義しません。スタティック メッシュ アセット ( IDatasmithMeshElement ) を指しています。いくつかの IDatasmithMeshActorElements が同じスタティック メッシュを参照できることに注意してください。

以下は、「 .udatasmith 」ファイル内のスタティック メッシュ アクタのデータ構造の例です。

<ActorMesh name="1" label="Teapot001" layer="0">
    <mesh name="1"/>
    <Transform tx="16.825752" ty="-18.789846" tz="0.0" sx="1.0" sy="1.0" sz="1.0" qx="0.0" qy="0.0" qz="0.0" qw="1.0" qhex="0000008000000000000000800000803F"/>
    <tag value="Max.superclassof:GeometryClass" />
    <tag value="Max.classof:Teapot" />
    <tag value="Max.handle:1" />
    <tag value="Max.isGroupHead: false" />
    <tag value="Max.isGroupMember: false" />
    <tag value="Max.parent.handle:0" />
</ActorMesh>

<ActorMesh name="2" label="Teapot002" layer="0">
    <mesh name="1"/>
    <Transform tx="16.825752" ty="35.718727" tz="0.0" sx="1.0" sy="1.0" sz="1.0" qx="0.0" qy="0.0" qz="0.0" qw="1.0" qhex="0000008000000000000000800000803F"/>
    <tag value="Max.superclassof:GeometryClass" />
    <tag value="Max.classof:Teapot" />
    <tag value="Max.handle:2" />
    <tag value="Max.isGroupHead: false" />
    <tag value="Max.isGroupMember: false" />
    <tag value="Max.parent.handle:0" />
</ActorMesh>

Two Static Mesh Actors referencing the same Static Mesh Asset (instancing) imported from 3ds Max.

2 つのスタティック メッシュ アクタが 3ds Max からインポートされた同じスタティック メッシュ アセット (インスタンス化) を参照しています。

必須なもの

  • メッシュ アクタの 名前 は一意である必要があり、連続するエクスポート間で変更してはいけません。これは、その後の再インポートのためにエンティティを追跡するために必要です。

  • メッシュ アクタの ラベル はサニタイジングされ (つまり、無効な文字を含まない)、ユーザーが読み取り可能でなければいけません。

  • スタティック メッシュ アセット ( IDatasmithMeshElement ) は、該当するアクタ間で再利用しなければいけません (インスタンス化されている必要があります)。

  • スケールと座標の変換、および座標トランスフォーメーションはアクタ トランスフォームに適用するのではなく、スタティック メッシュにベイクしなければいけません。

あると便利なもの

  • レイヤーの指定。

  • タグとメタデータへのサポート。

便利な API コール

コード例

実装例は、Unreal Engine リポジトリの以下のファイルを参照してください。

/Engine/Source/Programs/Enterprise/Datasmith/DatasmithSketchUpRubyExporter/Private/DatasmithSketchUpComponent.cpp

空のアクタ

空のアクタは、コンポーネントやスタティック メッシュが付属していないアクタです。メタデータを保持するのに役立ち、階層の一部を表す方法として機能します。いつどのように使用するかについての厳格なルールはありません。以下のガイドラインでは、一般的な使用例を説明します。

ガイドライン

空のアクタは以下の用途に使用します。

  • Null オブジェクトを表す (たとえば、3ds Max ヘルパー オブジェクト)。

  • カスタム原点ポイントを表す (たとえば、Revit サイト場所)。

  • 階層を読みやすくするためのその他の要素を表す (たとえば、Rhino のレイヤー、Rhino のブロック原点、Revit のレベルなど)。

  • 独自のジオメトリを持たない複合オブジェクトの先頭を表す (たとえば、Revit カーテン ウォール)。

3ds Max Helper objects translated as Empty Actors

空のアクタとして変換された 3ds Max ヘルパー オブジェクト。

Empty Actors used to represent invisible elements from Revit

Revit からの非表示要素を表すのに使用される空のアクタ。

便利な API コール

コード例

実装例は、Unreal Engine リポジトリの以下のファイルを参照してください。

/Engine/Source/Programs/Enterprise/Datasmith/DatasmithSketchUpRubyExporter/Private/DatasmithSketchUpComponent.cpp

アクタ階層

他の多くの 3D アプリケーションと同様に、Unreal Engine は親/子階層をサポートします。

以下は、「 .udatasmith 」ファイルの親/子関係の例です。

<ActorMesh name="3" label="Box001" layer="0">
        <mesh name="3"/>
        <Transform .../>
        <children visible="true"  selector="false" selection="-1">
            <ActorMesh name="5" label="Box002" layer="0">
                <mesh name="5"/>
                <Transform ..."/>
                <children visible="true"  selector="false" selection="-1">

ガイドライン

  • 自分のアプリケーションのデータ モデルを反映させるためにアクタ階層を使用します。

    3ds Max hierarchy translated as-is to Unreal Engine

    Unreal Engine にそのまま変換された 3ds Max 階層。

  • 自分のアプリケーションのデータ モデルに関連する情報を格納するために必要な場合は、追加の空のアクタを挿入します (たとえば、Ravit レベルは追加の親アクタとしてエクスポートされます)。

    Revit Levels added to the hierarchy become a useful way to orient end users

    階層に追加された Revit レベルは、エンドユーザーの方向付けに有効な方法になります。

避けること

エンドユーザーにとってナビゲートしやすい階層にするために、必要な場合のみスタティック メッシュ アクタの親として空のアクタを使用します。空のアクタが多すぎると階層が乱雑になり、Twinmotion と Unreal Engine の内部で読み取り、使用するのがより難しくなります。

Too many empty Actors

Empty Actors used only when necessary

空のアクタが多すぎる場合。

必要な場合のみ空のアクタを使用した場合。

便利な API コール

コード例

実装例は、Unreal Engine リポジトリの以下のファイルを参照してください。

/Engine/Source/Programs/Enterprise/Datasmith/DatasmithSketchUpRubyExporter/Private/DatasmithSketchUpComponent.cpp

コンポーネントとしてのアクタ

Revit や Archicad などのアプリケーションでは、いくつかのサブ要素があるオブジェクトが一般的です。たとえば、カーテン ウォールは通常、パネルとマリオンで構成され、レーリングは手すりとバラスターで構成されます。

Curtain Walls and Railings in Revit

Revit では、カーテン ウォールとレーリングはサブ要素 (パネル、マリオン、バラスター、手すり) を含む特別なオブジェクトです。

各要素を個々のスタティック メッシュ アクタとしてエクスポートすることも可能ですが、そうするとエクスポートするオブジェクトの数が多くなりすぎ、下に示すとおり、Unreal Engine のワールド アウトライナー が過密になります。

該当する場合、サブ要素をアクタ コンポーネントとしてエクスポートすることを考慮してください。たとえば、カーテン ウォール オブジェクトは次のアクタとコンポーネントの階層を使用してエクスポートできます。

  • カーテン ウォール オブジェクト → 空のアクタ。

    • パネル → スタティック メッシュ アクタ

    • パネル → スタティック メッシュ アクタ

    • マリオン → スタティック メッシュ アクタ

    • マリオン → スタティック メッシュ アクタ

.udatasmith 」ファイル内の階層は以下のようになります。

<Actor name="..." label="Walls_Curtain_Wall_Exterior_Curtain_Wall" layer="Walls">
    <Transform .../>
    <children visible="true"  selector="false" selection="-1">
        <ActorMesh name="..." label="Curtain_Panels" layer="Curtain Panels" component="true">
            <mesh name="..."/>
            <Transform .../>
        </ActorMesh>
        <ActorMesh name="..." label="Curtain_Panels" layer="Curtain Panels" component="true">
            <mesh name=">
            <Transform .../>
        </ActorMesh>
        <ActorMesh name="label="Curtain_Panels" layer="Curtain Panels" component="true">
            <mesh name="..."/>
            <Transform .../>
        </ActorMesh>

ガイドライン

  • カーテン ウォール パネルやバラスターや類似の複合オブジェクトなどの子オブジェクトを表すために、スタティック メッシュ アクタ コンポーネントを使用します。

  • 正常に機能するためには、階層 ( IDatasmithActorElement::AddChild ) とコンポーネント フラグ ( IDatasmithActorElement::SetIsAComponent ) の両方を設定しなくてはいけません。

便利な API コール

コード例

実装例は、Unreal Engine リポジトリの以下のファイルを参照してください。

/Engine/Source/Programs/Enterprise/Datasmith/DatasmithSketchUpRubyExporter/Private/DatasmithSketchUpComponent.cpp

アクタ レイヤー

他の多くの 3D アプリケーションと同様に、Unreal Engine はレイヤーという概念をサポートします。レイヤーは、アクタがシーンの視覚的階層のどこに位置するかを示す、アクタのプロパティです。

次の例は、「 .udatasmith 」ファイルでレイヤーを使用する場合を示しています。

<ActorMesh name="2" label="Sphere001" layer="Layer002">
...
</ActorMesh>
<ActorMesh name="3" label="Box001" layer="Layer004">
...
</ActorMesh>

ガイドライン

  • ソース アプリケーションがレイヤーを使用している場合、Unreal Engine でレイヤーに変換する必要があります。

  • ソース アプリケーションがレイヤーを使用していない場合、Unreal Engine レイヤーに変換できる他のデータがないか考慮します。たとえば、Revit はレイヤーを使用しませんが、エンティティをカテゴリに分類します。

    Revit entities imported on Layers derived from Revit categories

    Revit のカテゴリに由来する、レイヤーにインポートされた Revit のエンティ。

制限事項

  • レイヤー名は一意でなければいけません。

  • Unreal Engine はネスト化したレイヤーをサポートしていません。

Nested Layers in 3ds Max

The same layers imported in Unreal Engine

3ds Max のネスト化したレイヤー。

Unreal Engine にインポートされた同じレイヤー。フラットなレイヤー階層に従います。

便利な API コール

コード例

実装例は、Unreal Engine リポジトリの以下のファイルを参照してください。

/Engine/Source/Programs/Enterprise/Datasmith/DatasmithMaxExporter/Private/DatasmithMaxSceneExporter.cpp

アクタ タグ

Unreal Engine はアクタのためのユーザー定義のタグをサポートしています。Datasmith は、ソース アプリケーションでデータがどのように構造化されているかを説明する技術的な情報を保持するため、アクタ タグを使用します。Unreal Engine ユーザーはこれらのアクタ タグを使用して Python、Blueprint Utilities、Visual Dataprep などによるスクリプト操作を実行できます。

以下は、3ds Max からエクスポートした「 .udatasmith 」ファイル内のスタティック メッシュ アクタでのタグの使用例です。

<ActorMesh ...>
    <mesh name="a8f655367fcc240a8c9eb8d847d58463"/>
    <Transform .../>
    <tag value="Revit.Element.Id.186551" />
    <tag value="Revit.Element.UniqueId.07ae6064-8e02-489e-896d-f7554545ebb2-0002d8b7" />
    <tag value="Revit.DB.FamilyInstance.Mirrored.True" />
    <tag value="Revit.DB.FamilyInstance.HandFlipped.False" />
    <tag value="Revit.DB.FamilyInstance.FaceFlipped.True" />
    <tag value="Revit.Host.Id.156316" />
    <tag value="Revit.Host.UniqueId.9e597f98-694d-4ada-b8ef-0e7459e0b930-0002629c" />
</ActorMesh>
<ActorMesh name="1" label="Teapot001" layer="0">
    <mesh name="1"/>
    <Transform .../>
    <tag value="Max.superclassof:GeometryClass" />
    <tag value="Max.classof:Teapot" />
    <tag value="Max.handle:1" />
    <tag value="Max.isGroupHead: false" />
    <tag value="Max.isGroupMember: false" />
    <tag value="Max.parent.handle:0" />
</ActorMesh>

アクタ タグに何を入れるかに関する厳格なルールはありませんが、私たちはソース アプリケーションに固有の情報を保持するためにタグを使用する手法を採用しました。

たとえば、3ds Max の場合、(3ds Max 内での) オブジェクトのタイプ、グループに属しているかどうかなどに関する情報を保持するためにタグを使用することにしました。

Revit の場合、Revit エンティティの内部構造を記述した情報を格納しておくという、同様のアプローチを採用しました。

Actor Tags on Actor Components from Revit

Actor Tags from 3ds Max

Revit からのアクタ コンポーネントへのアクタ タグ。

Unreal Engine にインポートされた同じレイヤー。フラットなレイヤー階層に従います。フラットなレイヤー階層に従います。

ガイドライン

  • インポート元のアプリケーション名をタグの初めに付けます。(例:Revit.TagName または Max.TagName)。

  • ソース アプリケーションでデータがどのように構造化されているかに関する技術的な情報を表すため、タグを使用します。その他のユーザー定義のデータを格納するには、代わりにメタデータを使用してください。

便利な API コール

コード例

実装例は、Unreal Engine リポジトリの以下のファイルを参照してください。

/Engine/Source/Programs/Enterprise/Datasmith/DatasmithSketchUpRubyExporter/Private/DatasmithSketchUpComponent.cpp

メタデータ

Datasmith は、エンティティの BIM 情報 (またはその他のカスタム データ) を格納するのに使用できる、キーと値のペアを保持します。

3ds Max metadata translated into Unreal Engine

3ds Max からのメタデータ (左)、Unreal Engine に変換されたもの (右)。

制限事項

  • キーと値のペアは、文字列しか持つことができません。つまり、浮動小数点や単位などは文字列に含む (「ベイクされる」) 必要があります (たとえば、「10 mm」)。

  • 階層的なプロパティはサポートされていないので、アンダースコア区切り記号 ( _ ) を使用して階層を平坦化する必要があります。 要素 タイプ のプロパティがテキスト文字列を連結して処理され、グループ化された状態を維持している、以下の Revit の例を参照してください。

A simulated flattened hierarchy using metadata from Revit

Revit のメタデータを使用してシミュレートし平坦化した階層。

便利な API コール

コード例

実装例は、Unreal Engine リポジトリの以下のファイルを参照してください。

/Engine/Source/Programs/Enterprise/Datasmith/DatasmithMaxExporter/Private/DatasmithMaxSceneExporter.cpp

カメラ アクタ

Datasmith は Unreal Engine でカメラを作成できますが、ユースケースによって、3D アプリケーションからのカメラのエクスポートを適宜行ってください。ユーザーがカメラを明確に設定する場合もあります (たとえば、3ds Max の物理カメラ)。また、他のアプリケーション コンセプトから派生してカメラが作られることもあります (たとえば、Revit のビューや SketchUp のブックマーク)。

Unreal Engine カメラに関して考慮する重要な要素の 1 つは、エクスポート時に設定する必要がある、次のような物理ベースの特性があることです。

  • センサーの幅

  • アスペクト比

  • 露出値

  • ホワイト ポイント

  • 被写界深度など

以下は、「 .udatasmith 」ファイルの、タグと特性をもつカメラの実装例です。

<Camera name="1856" label="PhysCamera001" layer="0">
        <LookAt Actor="1857"/>
        <Transform tx="706.201538" ty="468.560883" tz="0.0" sx="1.0" sy="1.0" sz="1.0" qx="0.0"     qy="0.0" qz="-0.758784" qw="0.651344" qhex="0000000000000000A33F42BF79BE263F"/>
        <SensorWidth value="36.0"/>
        <SensorAspectRatio value="1.333333"/>
        <DepthOfField enabled="0"/>
        <FocusDistance value="850.27594"/>
        <FStop value="8.0"/>
        <FocalLength value="40.0"/>
        <LookAtRollAllowed enabled="0"/>
        <Post>
            <CameraISO value="5999.997559"/>
            <ShutterSpeed value="59.999973"/>
            <FStop value="8.0"/>
        </Post>
        <tag value="Max.superclassof: camera" />
        <tag value="Max.classof:Physical" />
        <tag value="Max.handle:1856" />
        <tag value="Max.isGroupHead: false" />
        <tag value="Max.isGroupMember: false" />
        <tag value="Max.parent.handle:0" />
        <tag value="Max.Target.handle:1857" />
</Camera>

Unreal Engine の CineCameraActor。

ガイドライン

被写界深度や露出など、ポスト プロセスで定義される写真効果の設定も任意です。自身の Datasmith エクスポートのコンテキストでは定義されていないかもしれない、ソース アプリケーションにおけるライティングとカメラの密接な関係が必要です。

制限事項

  • Unreal Engine カメラは斜めのカメラ (2 点の視点) をサポートしていません。たとえば、Ravit ではカメラの視点を変える「クロップド」ビューがありますが、Datasmith (ひいては Unreal Engine) はこのタイプのカメラ変換をサポートしていません。

便利な API コール

コード例

実装例は、Unreal Engine リポジトリの以下のファイルを参照してください。

  • /Engine/Source/Programs/Enterprise/Datasmith/DatasmithMaxExporter/Private/DatasmithMaxCameraExporter.cpp

  • /Engine/Source/Programs/Enterprise/Datasmith/DatasmithSketchUpRubyExporter/Private/DatasmithSketchUpCamera.cpp

テクスチャ アセット

Unreal Engine では、テクスチャは色だけでなくさまざまな情報を表します。サンプリングされ、ライティングとシェーディングに正しく影響を与えるには、テクスチャの使用目的 (texturemode) を示さなければいけません。想定される用途は以下のとおりです。

  • ディフューズ

  • スペキュラ

  • ノーマル

  • NormalGreenInv

  • 移動

  • その他

  • バンプ

  • IES

これは、ライトがマテリアルにどのように作用するかに直接影響するため (sRGB と RGB カーブ)、色空間も指定する必要があります (通常、ガンマ補正かsRGB)。

以下は、「 .udatasmith 」ファイルの、テクスチャ アセットの実装例です。

<Texture name="sitework_planting_gravel_mixed_0" texturemode="0" texturefilter="3" textureaddressx="0" textureaddressy="0" rgbcurve="-1.000000" srgb="0" file="rac_advanced_sample_project-3DView-{3D}_Assets/sitework.planting.gravel.mixed.png">

    <Hash value="b10e41741cfee286a5fcf3b288de78f5"/>

</Texture>

ガイドライン

  • テクスチャの用途に応じて、色空間 (ガンマ / sRGB) を正しく設定しなくてはいけません。

    • sRGB 色空間は通常、アルベド テクスチャに使用されます。

    • リニア色空間は通常、法線、高さ、バンプのマップに使用されます。

  • テクスチャ名 (filename ではない) は サニタイジング されていなくてはいけません (つまり、無効な文字を含まない)。

  • テクスチャは、他のアセットと同じフォルダに配置しなくてはいけません。

    Textures should be exported in the same folder as the other Assets

    テクスチャは、他のアセットと同じフォルダにエクスポートする必要があります。

避けること

  • 絶対パスを使用しないこと。

  • テクスチャを他のアセットとは別のフォルダに配置しないこと。

  • エクスポート中、テクスチャをトランスフォームする必要はありません。Datasmith インポータがトランスフォームを処理します。

    • DatasmithCore API でテクスチャを「.uasset」ファイルに変換する必要はありません。

    • テクスチャの再フォーマット、サイズ変更、異なるフォーマットへの変換を行う必要はありません。

Incorrect placement of texture files

この画像は、テクスチャを表現するための「``.uasset`」ファイルの **間違った** 使い方を示しています。

便利な API コール

コード例

実装例は、Unreal Engine リポジトリの以下のファイルを参照してください。

/Engine/Source/Programs/Enterprise/Datasmith/DatasmithSketchUpRubyExporter/Private/DatasmithSketchUpMaterial.cpp

マテリアル

シンプルな PBR エクスポート

次の例は、アルベド マップと高さマップを含む基本的な PBR マテリアルを作成するために、どのようにテクスチャを「Datasmith」ファイルにエクスポートできるかを示しています。

Rhino の元のマテリアル

この例では、以下の Rhino のマテリアルを使用します。

A material in Rhino

マテリアルの設定は以下のとおりです。

Albedo map

Height map

アルベド マップ

高さマップ

作成される「Datasmith」ファイル

作成される「Datasmith」ファイルは以下のようになります。

<Texture name="c02622dee4b6e6e08265ed1a8ed947e3" label="ColorChecker_sRGB_from_Lab_D50" texturemode="0" texturefilter="3" textureaddressx="0" textureaddressy="0" rgbcurve="1.000000" srgb="1" file="rhino_diffuse_and_bump_Assets/ColorChecker_sRGB_from_Lab_D50.bmp">
        <Hash value="2eac7dc7c873963f39791a4c7e9a6f74"/>
</Texture>
<Texture name="82c22916309f2f098d35b2856b2caf5c" label="Heightmap_normal" texturemode="6" texturefilter="3" textureaddressx="0" textureaddressy="0" rgbcurve="1.000000" srgb="0" file="rhino_diffuse_and_bump_Assets/Heightmap.png">
        <Hash value="cafca7197e3f5a46480b09f329f9eabd"/>
</Texture>

<UEPbrMaterial name="90589c47f06eb971d548591f23c285af" label="Custom">
        <Expressions>
            <Texture Name="Diffuse_Map" PathName="c02622dee4b6e6e08265ed1a8ed947e3">
            </Texture>
            <Texture Name="Bump_Map" PathName="82c22916309f2f098d35b2856b2caf5c">
            </Texture>
        </Expressions>
        <Input Name="BaseColor" expression="0" OutputIndex="0"/>
        <Input Name="Normal" expression="1" OutputIndex="0"/>
        <OpacityMaskClipValue value="0.3333"/>
</UEPbrMaterial>

上の 2 つのテクスチャの texturemode srgb の値が異なることを確認してください。

  • 1 つ目のテクスチャの texturemode="0" srgb="1"

  • 2 つ目のテクスチャの texturemode="6" srgb="0"

Unreal Editor へのインポート

Unreal Engine では、インポータ マテリアルの PBR グラフは以下のようになります。

アルベド マップが SRGB=1 に設定され、サンプラー タイプが Color に設定されていることに注目してください。これは Datasmith インポータによって自動的に設定されるもので、エクスポートしたアルベド マップを次のように設定した結果です。

以下のとおりにテクスチャを設定した結果として、Rhino ではグレースケールの高さマップは、Datasmith インポータによって法線マップに変換されました。

texturemode="6" srgb="0"

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