3Dシーンのインポート

Godotシーンインポーター

3Dアセットを扱う場合、Godotには柔軟で設定可能なインポーターがあります。

Godotはシーンで動作します。つまり、お気に入りの3D DCCツールで作業しているシーン全体が、可能な限り同様な内容で転送されます。

Godotは、次の3Dシーンファイルフォーマットをサポートしています:

  • glTF 2.0。 Godotは、テキストおよびバイナリ形式を完全にサポートしています。
  • DAE(COLLADA)、完全にサポートされている古い形式です。
  • OBJ(Wavefront)フォーマット。これも完全にサポートされていますが、かなり制限されています(ピボット、スケルトンなどのサポートはありません)。
  • ESCN。Godot専用のフォーマットで、Blenderにプラグインを入れることでエクスポートできます。
  • FBX, supported via the Open Asset Import library. However, FBX is proprietary, so we recommend using other formats listed above, if suitable for your workflow.

シーンファイルとテクスチャをプロジェクト・リポジトリにコピーするだけで、Godotは完全なインポートを行います。

これは重要なことですが、エクスポートする際にボーンがメッシュを変形させないようにしてください。お使いの3Dエディタからエクスポートする前にまず、スケルトンがTポーズなどデフォルトのポーズになっていること確認しましょう。

Mayaおよび3DS MaxからのDAEファイルのエクスポート

AutodeskはMayaと3DS MaxをCOLLADAに対応させましたが、しかしデフォルトでは壊れており、使わないほうが良いでしょう。COLLADAでのエクスポートするのに一番良いのはOpenCollada プラグインを使用することです。常にソフトの最新版に対応しているとは限りませんが、これはうまく動きます。

BlenderからglTF 2.0ファイルをエクスポートする

BlenderからglTFファイルをエクスポートするには3つの方法があります。 glTFバイナリ(.glb ファイル)、glTF埋め込み(.gltf ファイル)、およびテクスチャ(gltf + .bin + テクスチャ)。

glTFバイナリファイルは、3つのオプションのうちデータサイズが最小のものです。それらには、Blenderで設定されたメッシュとテクスチャが含まれます。 Godotに取り込むと、テクスチャはオブジェクトのマテリアルファイルの一部になります。

glTF埋め込みファイルは、バイナリ ファイルと同じように機能します。Godotでは追加機能が提供されず、ファイル サイズが大きいため使用しないでください。

テクスチャを分離してglTFを使用する理由は2つあります。 1つは、シーン記述はテキストベース形式にして、バイナリデータは別のバイナリファイルで持つことです。これは、テキストベース形式の変更をバージョン管理で確認する場合に役立ちます。 2番目は、マテリアルファイルとは別のテクスチャファイルが必要です。これらのglTFバイナリファイルのいずれも必要ない場合は問題ありません。

注釈

Blenderは、glTFファイルで放射性テクスチャ(emissive texture)をエクスポートしません。モデルで使用する場合は、個別に持ち込む必要があります。

BlenderからDAEファイルをエクスポートする

BlenderにはCOLLADAサポートが組み込まれていますが、ゲームエンジンのニーズでは適切に機能しないため、そのままでは使用しないでください。

Godot provides a Blender plugin that will correctly export COLLADA scenes for use in Godot. It does not work in Blender 2.8 or newer, but there are plans to update it in the future.

BlenderからESCNファイルをエクスポートする

The most powerful one, called godot-blender-exporter. It uses a .escn file, which is kind of another name for a .tscn file (Godot scene file); it keeps as much information as possible from a Blender scene. However, it is considered experimental.

ESCNエクスポーターには、その機能と使用法を説明する詳細な ドキュメント があります。

ワークフローのインポート

Godot シーンインポーターでは、データのインポート方法に関するさまざまなワークフローを使用できます。多くのオプションに応じて、次の方法でシーンを読み込む場合があります:

  • 外部マテリアル (デフォルト): 各マテリアルがファイル リソースに保存される場所。それらに対する変更は保持されます。
  • 外部メッシュ: 各メッシュが別のファイルに保存される場所。多くのユーザーは、直接メッシュを扱うことを好みます。
  • 外部アニメーション: ソースが変更されたときに、保存したアニメーションを変更およびマージできるようにします。
  • 外部シーン: インポートされたシーンの各ルートノードを個別のシーンとして保存します。
  • シングルシーン: すべてが組み込まれた単一のシーンファイル。
../../../_images/scene_import1.png

開発者によってニーズが異なるように、このインポートプロセスは高度にカスタマイズ可能です。

インポートオプション

インポーターには、以下で説明するいくつかのオプションがあります:

../../../_images/scene_import2.png

ノード

ルートタイプ(Root Type)

デフォルトでは、読み込まれたシーンのルート ノードのタイプは "Spatial" ですが、これは変更できます。

ルート名(Root Name)

生成されたルート ノードに特定の名前を設定できます。

ルートの大きさ(Root Scale)

ルートノードの大きさ。

カスタムスクリプト(Custom Script)

インポート後にシーン全体を処理する特別なスクリプトを提供できます。これは、後処理、マテリアルの変更、ジオメトリの面白い処理などに最適です。

次のようなスクリプトを作成します:

tool # Needed so it runs in the editor.
extends EditorScenePostImport


func post_import(scene):
    # Do your stuff here.
    return scene # remember to return the imported scene

post_import 関数はインポートされたシーンを引数として取ります(パラメーターは実際にはシーンのルートノードです)。最終的に使用されるシーンを返す必要があります。別のものでもかまいません。

ストレージ(Storage)

デフォルトでは、Godot は 1つのシーンを読み取りします。このオプションを使用すると、ルートの下にあるノードがそれぞれ別々のシーンになり、インポートされたシーンにインスタンス化されることを指定できます。

もちろん、このようなインポートされたシーンを他の場所に手動でインスタンス化することもできます。

マテリアル

場所(Location)

Godot は、メッシュまたはノード内のマテリアルをサポートします。デフォルトでは、マテリアルは各ノードに配置されます。

ストレージ(Storage)

マテリアルは、シーン内または外部ファイルに格納できます。デフォルトでは、外部ファイルに保存されるため、編集が可能です。これは、ほとんどの3D DDC にはGodotのマテリアル・オプションと同じであるためです。

マテリアルがシーン内に組み込まれていると、ソース シーンが変更され、再インポートされるたびにマテリアルが失われます。

再インポート時に保持(Keep On Reimport)

Godotフィーチャーを使用するようにマテリアルを編集すると、インポーターは編集したフィーチャーを保持し、ソース シーンから送信されたものを無視します。このオプションは、マテリアルがファイルとして保存されている場合にのみ存在します。

メッシュ(Meshes)

圧縮(Compress)

メッシュは、スペースを節約するためにメッシュの複数の側面に対してあまり正確でない数値を使用するようにします。

これらは:
  • 変換マトリックス(位置、回転、およびスケール): 32ビット浮動小数点数を16ビット符号付き整数にします。
  • 頂点: 32ビット浮動小数点数から16ビット符号付き整数にします。
  • 法線: 32ビット浮動小数点数から32ビット符号なし整数にします。
  • 接線: 32ビット浮動小数点数から32ビット符号なし整数にします。
  • 頂点の色: 32ビット浮動小数点数から32ビット符号なし整数にします。
  • UV: 32ビット浮動小数点数から32ビット符号なし整数にします。
  • UV2: 32ビット浮動小数点数から32ビット符号なし整数にします。
  • 頂点ウェイト: 32ビット浮動小数点数から16ビット符号なし整数にします。
  • アーマチュア・ボーン:  32ビット浮動小数点数から16ビット符号なし整数にします。
  • 配列インデックス: 要素数に応じた32ビットまたは16ビットの符号なし整数へ。
追加情報:
  • UV2 = 詳細テクスチャとベイク処理されたライトマップテクスチャの2番目のUVチャネル。
  • 配列インデックス = 上記の配列の各要素に番号を付す数値の配列。つまり、頂点と法線に番号を付けます。

場合によっては、これにより精度が失われる可能性があるため、このオプションを無効にする必要があります。たとえば、メッシュが非常に大きい場合、または大きな領域をカバーする複数のメッシュがインポートされている場合、このメッシュのインポートを圧縮すると、ジオメトリまたは頂点が正確な場所にないことがあります。

接線の確認(Ensure Tangents)

法線マッピングのテクスチャを使用する場合、メッシュには接線配列が必要です。このオプションは、ソースシーンに存在しない場合にこれらが生成されるようにします。 GodotはこれにMikktspaceを使用しますが、エクスポーターで生成する方が常に良い結果になります。

ストレージ(Storage)

メッシュは、組み込みではなく別々のファイル (リソース) に格納できます。オブジェクトを直接ビルドする場合を除き、これはあまり実用的ではありません。

このオプションは、シーンの代わりに直接メッシュを操作することを好む人を支援するために提供されています。

ライトベーキング(Light Baking)

メッシュがベイク処理されたライトマップで使用されるかどうか。

  • 無効(Disabled): メッシュはベイク処理されたライトマップでは使用されません。
  • 有効(Enable): メッシュはベイク処理されたライトマップで使用されます。
  • ライトマップ生成(Gen Lightmaps): メッシュはベイク処理されたライトマップで使用され、ライトマップの第2UVレイヤーに展開します。

注釈

ライトのベイク処理の詳細については、ベイクドライトマップ(焼き込み済ライトマップ) を参照してください。

外部ファイル(External Files)

生成されたメッシュとマテリアルは、必要に応じてシーンの名前を持つサブディレクトリに格納できます。

アニメーションオプション

Godotには、アニメーションデータの処理方法に関する多くのオプションがあります。一部のエクスポーター(Blenderなど)は、1つのファイルで多くのアニメーションを生成できます。 3DS MaxやMayaなどのその他のものでは、複数のアニメーションを同じタイムラインに配置するか、最悪の場合、各アニメーションを個別のファイルに配置する必要があります。

../../../_images/scene_import3.png

アニメーションのインポート(Import)はデフォルトで有効になっています。

フレームレート(FPS)

ほとんどの3Dエクスポート形式では、フレームではなく秒単位でアニメーションタイムラインを保存します。アニメーションを可能な限り忠実にインポートするには、編集に使用する1秒あたりのフレーム数を指定してください。これを行わないと、アニメーションが不安定になる場合があります。

フィルタ・スクリプト(Filter Script)

特別な構文でフィルタースクリプトを指定して、どのアニメーションのどのトラックを保持するかを決定することができます。

フィルタスクリプトは、インポートされた各アニメーションに対して実行されます。構文は2種類のステートメントで構成されます。1つ目は、フィルタリングするアニメーションを選択するためのもので、2つ目は、一致するアニメーション内の個々のトラックをフィルタリングするためのものです。すべての名前パターンは、大文字と小文字を区別しないマッチパターンを使用して実行され、? および * ワイルドカードを使用します(String.matchn() を内部で使用しています)。

スクリプトは、(@ で始まる行で示される)アニメーション・フィルタ・ステートメントで開始する必要があります。たとえば、インポートされた、名前が ``"_Loop"``で終わるすべてのアニメーションにフィルタを適用する場合は:

@+*_Loop

同様に、追加のパターンをコンマで区切って同じ行に追加できます。これは、名前が"Arm_Left" で始まるすべてのアニメーションを追加し、そして"Attack" で終わる名前を持つすべてのアニメーションを除外する設定を追加した変更例です:

@+*_Loop, +Arm_Left*, -*Attack

アニメーション選択用のフィルタステートメントに続いて、トラック・フィルタリング・パターンを追加して、どのアニメーショントラックを保持または破棄するかを示します。トラック・フィルタ・パターンが指定されていない場合、一致するアニメーション内のすべてのトラックは破棄されます!

トラック・フィルタ・ステートメントは、アニメーション内の各トラックに順番に適用されることに注意することが重要です。これは、ある行のルールでトラックが追加されても、後のルールでそれを破棄できることを意味します。同様に、始めの方のルールによって除外されたトラックが、フィルタ・スクリプトのさらに下のルールによって再度追加される場合もあります。

例: "_Loop" で終わる名前を持つアニメーションにすべてのトラックを含めますが、名前に "arm" が含まれている場合を除き、"Skeleton"``"Control"``で終わっているトラックは破棄します:

@+*_Loop
+*
-Skeleton:*Control
+*Arm*

上記の例では、"Skeleton:Leg_Control" のようなトラックは破棄されますが、"Skeleton:Head"Skeleton:Arm_Left_Control などのトラックは保持されます。

+ または - で始まらないトラック・フィルタ行は無視されます。

ストレージ(Storage)

デフォルトでは、アニメーションは組み込みとして保存されます。代わりにファイルに保存できます。これにより、アニメーションにカスタムトラックを追加し、再読み込み後も保持できます。

オプティマイザー(Optimizer)

アニメーションがインポートされると、オプティマイザーが実行され、アニメーションのサイズが大幅に縮小されます。一般に、アニメーションが有効になっているためにアニメーションが壊れている疑いがない限り、これは常にオンにする必要があります。

クリップ(Clips)

It is possible to specify multiple animations from a single timeline as clips. For this to work, the model must have only one animation that is named default. To create clips, change the clip amount to something greater than zero. You can then name a clip, specify which frames it starts and stops on, and choose whether the animation loops or not.

シーンの継承

多くの場合、インポートされたシーンに変更を加えることが望ましい場合があります。デフォルトでは、ソースアセットが変更された場合(ソース .dae.gltf.objファイルが3Dモデリングアプリから再エクスポートされた場合)、Godotはシーン全体を再インポートする必要があるため変更は出来ません。

ただし、シーンの継承(Scene Inheritance) を使用してローカルに変更することは可能です。インポートしたシーンを開こうとすると、次のダイアログが表示されます:

../../../_images/scene_import4.png

継承されたシーンでは、変更の唯一の制限は次のとおりです:

  • ノードは削除できません(ただし、どこにでも追加できます)。
  • サブリソースは編集できません(このために上記のように外部に保存します)

それ以外は、すべてが許可されています!

インポートのヒント

多くの場合、シーンを編集する場合、エクスポート後に実行する必要がある一般的なタスクがあります:

  • オブジェクトへのコリジョン(衝突)検出の追加
  • オブジェクトをナビゲーションメッシュとして設定する
  • ゲーム エンジンで使用されていないノードの削除 (モデリングに使用される特定のライトなど)

このワークフローを簡略化するために、Godotには3Dモデリング・ソフトウェアのオブジェクトの名前に追加できるサフィックスがいくつかあります。インポートすると、Godotはそれらを検出し、自動的にアクションを実行します:

ノードの削除 (-noimp)

このサフィックスを持つノード名は、インポート時に、その型に関係なく削除されます。読み込まれたシーンには表示されません。

コリジョンの作成 (-col、-colonly、-convcolonly)

オプション "-col" はメッシュノードに対してのみ機能します。検出されると、メッシュと同じジオメトリを使用して、静的コリジョン子ノードが追加されます。

ただし、視覚的ジオメトリが複雑すぎたり、コリジョンに対してスムーズでなかったりして、うまく機能しないことがよくあります。

これを解決するには、インポート時にメッシュを削除し、代わりに StaticBody の衝突を作成する "-colonly" 修飾子が存在します。これにより、視覚的なメッシュと実際のコリジョンを分離できます。

オプション "-convcolonly" は、ConcavePolygonShape の代わりに ConvexPolygonShape を作成します。

オプション "-colonly" は、Blenderの空のオブジェクトでも使用できます。インポート時に、コリジョンノードを子として持つ StaticBody が作成されます。コリジョンノードには、Blenderの空の描画タイプに応じて、事前定義されたいくつかの形状があります:

../../../_images/3dimp_BlenderEmptyDrawTypes.png
  • 単一の矢印(Single arrow)は RayShape を作成します
  • キューブ(Cube)は BoxShape を作成します
  • イメージ(Image) PlaneShape を作成します
  • 球(Sphere )、(およびリストされていない他のもの)は SphereShape を作成します

Blenderのエディタで見やすくするために、ユーザーはコリジョン用エンプティに「X-Ray」オプションを設定し、プリファレンス/テーマ/3Dビュー/エンプティでそれらに明確な色を設定できます。

ナビゲーションの作成(-navmesh)

このサフィックスを持つメッシュノードは、ナビゲーションメッシュに変換されます。元のメッシュノードが削除されます。

VehicleBodyの作成(-vehicle)

このサフィックスを持つメッシュノードは、VehicleBody ノードの子としてインポートされます。

VehicleWheelの作成[-wheel)

このサフィックスを持つメッシュノードは、VehicleWheel ノードの子としてインポートされます。

リジッドボディ(-rigid)

このメッシュからリジッドボディを作成します。

アニメーションループ(-loop、-cycle)

トークン「loop」または「cycle」で開始または終了するCOLLADAドキュメント内のアニメーションクリップは、ループフラグが設定されたGodotアニメーションとしてインポートされます。これは大文字と小文字が区別され、ハイフンは不要です。

Blenderでは、NLAエディタを使用し、アクジョンの名前に「loop」または「cycle」のプレフィックスもしくはサフィックスを付ける必要があります。