サイトのトップへ戻る

libGDX ドキュメント 日本語訳

サイト内検索

LibGDXでBlender のモデルをインポートする

メモ: このページでは実際の例として Blender を使用していますが、内容のほとんどは 他のモデリングソフトでも同様に適用できます。

Blender はオープンソースのモデリングソフトで、これを使って3Dのモデルやシーンやアニメーションを作成できます。 Blender は blender.orgで入手できます。 Blenderを使って3Dモデルを作成するのが初めての場合、blender のチュートリアルを確認してください。 このページでは、Blender モデルをLibGDXで使用するための準備と変換作業に関する実践的なヒントについて説明します。



Blender で考慮すべき事項

Blender は多目的ツールなので、落とし穴にはまるとゲーム開発に適さないモデルが出来上がってしまいます。 そうした間違いの1つは、モデルのアニメーション化にRigify プラグインを使用することです。: これはモデルのサイズを少なくとも3MB(アニメーションモデル1つにつき)あるいはそれ以上に増量させる非常に多くのデータを追加してしまうので、使用には細心の注意を払ってください。

もう1つサイズに関して考慮して欲しいことは、(アニメーションの種類や量によっても変わってきますが)キーフレーム補間を(既定のベジェ補間から)線形補間へ設定することです。 これにより、g3db ファイルのサイズをかなり減らせる可能性があります(ただしアニメーションの見え方も変わる可能性があるので、保存する前に確認をしておいてください)。 キーフレーム補間を変更するには、アニメーションパースペクティブに切り替え、ドープシート内でAキーを押して全てののキーフレームノードを選択し、Tを押して"Linear"を選択します。



Blender でのアニメーション

モデルのアニメーションには Action Editor を使用するようにしてください。 Blenderのアニメーションドロップシートにつける名前が、コード上で使用できるアニメーションIDとなります。 以下の画像では、CubeAction がそれに当たります。 横にあるFをクリックしてアクションを保存するのを忘れないでください!



FBXへのエクスポートと G3DBへの変換

既定の (推奨される) 方法は、FBXへのエクスポートです。 全てのを選択して、それから実際に含めたいオプションのみを選択(例えば、ノードやアニメーション)するようにしてください。 カメラやライトなどは含めないでください。 次に最新版のfbx-conv をダウンロードして、 FBX ファイルを G3DBへ変換します。 コマンドラインオプション -f を使ってテクスチャ座標を反転させる必要があります。 fbx-conv -f file.fbx

必要に応じて、ファイルをG3DJ 形式に変換することもできます。これはJSON 形式で、簡単なテキストエディターでもすぐに表示できます。 fbx-conv -f -o G3DJ file.fbx。 G3DJ はバイナリ形式ではないため、アプリケーション実行時には読み込みに時間がかかるので注意してください。

BlenderでのFBXエクスポートの使用には、既知の制限があるので注意してください。 現在のエクスポートは texface texture (つまり、UV マップに割り当てられたテクスチャ)のみをサポートしています。

また、Blenderは1 ユニット = 1 メートルでエクスポートしますが、libGDXは1 ユニット = 1 cmのサイズでインポートするため、インポートされたモデルは100倍大きくなるので注意してください。エクスポートオプションを既定の 1.00 から 0.01 へ変更してこの問題を修正します。

Changing Blender fbx export options.



座標系(up軸)を設定する

Blenderが使用している座標系 (z-up軸) は、ゲームで最もよく使用されている座標系(y-up軸)とは異なります。 BlenderのFBXエクスポーターにはこの座標系をy-up軸へ変更するオプションが含まれています(むしろFBXエクスポーターを使う際にはy-up軸にするのが既定設定と言えるかもしれません)。 このオプションは使用せず、代わりにBlenderの既定座標系をy-up軸に設定してください。

Fbx-conv はモデルを回転させることで座標系を(y-up軸へ)補正します。 しかし、fbxファイル自体に正しい情報が含まれている場合のみこの補正を行うことができます。 Blenderの FBX エクスポーターオプションは、モデルの変更は行わず、単にy-up軸のように振舞うだけです(それによりfbx-convは補正ができなくなります)。

座標系を補正する必要がある場合、fbx-conv はモデルの全てのルートノードをX-軸に沿って90度回転させます。 それに応じてアニメーションも変更されます。ですが、ジオメトリ(頂点)自体は変更されません。

アプリケーションでz-up軸を使用したい場合は、Blenderエクスポーターの座標系オプションをy-up軸へ変更します。 そうすることでfbx-convはモデルとアニメーションの回転を行わず、座標系はz-up軸になります。



テクスチャが表示されない場合のトラブルシューティング

面が描写されていない場合、背面カリングを無効にしてみてください。 それらの面がカメラと反対の方向を向いているため、欠落してしまっている可能性があります。 DefaultShader.defaultCullFace = 0;
また、Blenderからエクスポートしたマテリアルの不透明度が0に設定されてしまっているというのもよくあることです。 モデルが描写されていないことに気づいた場合、BlenderのMaterial項目へ行き、"Transparency"配下でAlphaを望む値に設定します(完全不透明にしたい場合、通常は 1にします)。



テクスチャが真っ黒い場合のトラブルシューティング

テクスチャファイルのサイズはPOT (2の累乗のサイズ)に制限してください。これは、横幅と高さが同じ形状の正方形という意味です(例えば、 32x32や 64x64など)。 推奨される最大サイズは、幅広くサポートされている1024x1024ですが、それより大きくても正常に描写されることもあり、事情は端末ごとにことなります。 非POT テクスチャはデスクトップ上では正しく描写されますが、携帯上では描写されません。 これは使用されるGPU 固有の制限であり、非POT をサポートしているかどうかは端末ごとに異なります。

さらに、照明や色がmodelインスタンスを照らすように設定されているかをテストしてください。 null のenvironment ポインタを Model Batchに引数として渡し、照明の影響を無効にすると良いテストが行えます。

Blenderの FBX エクスポートスクリプトを使用していた場合は、テクスチャがUVマップに割り当てられていることを確認し(エクスポートスクリプトはtexface textureのみをサポートしているたため)、エディットモードへ進み、UV/Textureエディターでオブジェクトとともにエクスポートしたいテクスチャ/画像を選んでください。



RrSs 警告

Blender FBX エクスポーターを使用している場合、 FBX ファイルと変換した時にRrSs 警告が表示されることがあります。 これは、Blender FBXエクスポーターが誤って変形情報をエクスポートしたことが原因です。 fbx-conv ユーティリティがこれを修正するので、この警告は無視しても問題ありません。



Maximum vertices

モデル(g3djファイルや g3db ファイル)には複数のメッシュを含めることができます。 これらのメッシュはインデックスで管理されます。 libGDX で使用されるインデックスは short 値です。 Javaにおける short 型の最大値は 32,767です。 言い換えれば:実際には1つのメッシュ内で32767を超える数の頂点を使用することはできません。 したがって、メッシュがこの制限を越えないようにする必要があります。

既定では、32767 を超える数のインデックスを含むメッシュを変換しようとした時、fbx-conv は警告を出します。 While this doesn't have to mean that it will also result in more than 32767 vertices, it is a good indication that your mesh it is too "high-poly" and might cause issues. この場合、ポリゴン数を減らすかメッシュを複数のパーツに分割することを検討してください。

モデルが32767個未満の頂点を持つ似たようなメッシュを複数含んでいる場合、fbx-convはそれらを1つのメッシュに結合しようとします メッシュが結合された時、それにより頂点の最大数が32767を超えることはありません。 コマンドラインオプション-m を使用してこの最大値を変更できます。

警告: fbx-convを使って頂点の最大数を増やしても、javaの short型の最大値は 増えません

メッシュにスキン処理がされており、指定されたボーンが最大数を超過している場合はfbx-conv はメッシュを分割しますが、 そうでなければfbx-convはメッシュを分割することは決してありません。 ただ単に、それを行うための十分な情報がないためです。

javaとは対照的に、 fbx-conv と opengl は両方とも unsigned インデックスをサポートしていることに注意してください。 したがって、いくつかの状況や端末によっては、頂点の数が32767から65535の範囲になっていると問題が発生するかもしれません。 unsigned がサポートされていることを当てにしてコードを書くべきではありません。




エンジェル戦記