メタセコイアで作ったモデルをXNAで使う

メタセコイアで作ったモデルをXNAで使う時の注意事項

それでは実際にメタセコイアで作られたモデルをXNAで使用する場合の注意点を紹介していきます。メタセコイアで生成したモデルをXNAで使う場合、現状では3種類の方法があります。

  1. 標準のXファイル形式出力機能を使う
  2. FBXエクスポーターを使用してFBX形式で出力する(要シェアウェア版)
  3. Keynoteに付属しているアニメーション付きXファイル出力を使う(要シェアウェア版)

 

1はメタセコイアに付属しているXファイル出力機能を使う方法ですが、これには以下の注意点があります。

  • マテリアルやオブジェクト名は出力されない
  • テクスチャ名に日本語は使えない(文字化けするケースがある)
  • 透明テクスチャ情報は欠落する
  • メタセコイアが出力するのはテキスト形式なのでファイルサイズが大きくなり、メモリ不足でインポートできなくなることもある

ファイルサイズが大きくなるという問題ですが私がテストしたケースでは7MBのMQOファイルが165MBのXファイルになるケースがありました。

 

続いて2のFBXエクスポーターを使う場合の注意点です。

  • 日本語を使わないこと(FBX SDKが多言語サポートしていない)
  • ミラーリングや曲面を使っている場合はエクスポート前にフリーズする必要がある
  • Keynoteと併用する場合はその注意点に留意する必要がある

日本語を使わないことにさえ注意しておけば最も安定している方法なのですが、マテリアル情報変換が正しく行われず、モデルの見た目が変わるケースが見受けられました。

透明テクスチャ情報はマテリアルのTextures[“Transparency”]の中に格納されます。

 

最後にKeynoteに付属しているXファイル出力機能(Direct X with Animation)を使う場合の注意点です。ここではXファイルフォーマットに関する注意点とKeynoteの注意点の二つに分かれます。まずはXファイルフォーマットに関する注意点としては

  • マテリアルやオブジェクト名はインポートされない
  • テクスチャ名に日本語は使えない(文字化けするケースがある)
  • 透明テクスチャ情報は欠落する
  • ミラーリングや曲面を使っている場合はエクスポート前にフリーズする必要がある
  • Xファイル内ではオブジェクト用のボーンとスケルトン用のボーンを区別できない。

最後の注意点ですが、XNAはインポート時にボーンウェイトが設定されているメッシュから参照されているボーンをスケルトン用のボーンとして扱います。この予測は多くの場合は正解なのですが、スケルトン階層のなかにどのメッシュからも参照されていないボーンがある場合に、そのボーンはスケルトンに属するボーンと認識されずにビルドエラーの原因となります。

Keynoteを使う際特有の注意点としては以下の二つがあります。

  • オブジェクト名に「:」「-」「|」といった文字がある場合、Keynoteによって名前が変更され、名前衝突の原因となる
  • どのボーンにも属さない頂点を生成することができ、ビルドエラーの原因となる

Keynoteはオブジェクト名にスケルトンに関する情報を格納します。ですから、この命名規約に従わないオブジェクト名を使うとKeynoteによって名前が変更され、場合によっては同じ名前のオブジェクトが複数存在することになってしまい、コンテントビルド時の 「ノードに複数の BoneContent の子があります。どれをスケルトンのルートにするか決定できません。」 というエラーメッセージの原因となります。

また、Keynoteはどのボーンにも属さない頂点を生成することができ、これは実行時に正しく表示されない原因となります。運良くというか運悪く、この孤立した頂点と通常の頂点が同じポリゴン内に混在していた状態だとコンテントビルド時に 「頂点のボーンの重みを正規化しているときにエラーが発生しました。BoneWeightCollection に重みの値が含まれていません。」 という謎のエラーメッセージとして表示されます。

この問題の頂点はKeynoteをアクティブにした状態でモデル全体を移動させて発見することができます。どのボーンにも属さない頂点は移動しないので、モデル全体を動かすと下図のように引き延ばされることになります。この移動しない頂点が孤立した頂点だということが判ります。問題の頂点が判れば、ボーンの影響範囲を調整することで修正することができます。

orphen-vertex-3

 

ゲーム制作ではどんな情報が必要なのか?

これまでの注意点をまとめる前に、ゲーム内での3Dモデルデータの使われ方について考えてみましょう。この用途には以下のものがあります。

  1. キャラクターや背景などのゲーム中に描画されるもの
  2. 当たり判定メッシュ
  3. ゲーム内オブジェクト配置情報
  4. トリガー

恐らくゲーム用の3Dモデルというと真っ先に思い浮かべるのは1なのは間違いないと思います。ですが、ゲーム制作では実際にゲーム中に描画する以外にも、3Dモデルデータ必要になる場面が多数あります。その主なものが2~3になります。まずは下図を見てください。メタセコイアで3分程で作ったものなのでモデリングのクオリティは気にしないでください(汗)。ゲーム内で実際に描画するのは地面とビルですが、それ以外にも赤い三角錐モデルはプレーヤーのスタート地点、黄色い点は敵の出現ポイント、そして赤い半透明の箱はプレイヤーが触れると次のマップへ移動するトリガーを表しています。

map

このように図で表すと色んな事が視覚的に判りやすくなります。例えば、このマップでは、プレーヤーのスタート地点は手前で3つの出口があり、敵の数は後になる程多くなり、中にはビルの屋上に出現する敵もいるということが判ります。さて、このゲームデザインをどうやって実装しますか?これらの情報をソースコードに一つ一つ数値として書いていきますか?それともレベルエディターを作りますか?個人や小規模な人数でゲーム制作という視点で考えると、どちらも時間と労力が必要になるのであまり現実的ではありません。ではどうしたらいいでしょうか?

最も簡単な手段はモデルデータにこれらのゲーム特有の情報を追加してファイルにセーブ、後はコンテントパイプラインでモデルデータ処理と同時にゲーム特有の情報を抽出することです。例えば、「敵出現位置」と名付けたマテリアルを使ったオブジェクト位置を敵の出現位置、「出口」と名付けたモデルはそのメッシュデータを判定範囲としたトリガーとして変換することで実現することができます。この方法であればメタセコイアをレベルエディターとして流用することができるので、視覚的にマップデザインすることができ、時間と労力も節約できるのでゲーム本来の部分の作業に集中することができます。

このマップを3分間程度で作ることができたことを考えるとその効率の良さが判ると思います。もちろん、面白いゲームを作るにはもっと時間を費やして優れたレベルデザインに仕上げる必要があります。ですが、ここで重要なのは、短時間でゲーム自体の面白みを出す部分に集中できる作業環境を作り出すことができるかということです。

 

まとめ

以上の事から、ゲームで使うことを考えると、名前や透明テクスチャ情報が欠落してしまうXファイルを使うのは避けた方が良いでしょう。となると、残ったFBXエクスポーターを使用することになると思います。この場合、以下の注意点に留意する必要があります。

  1. 日本語を使わないこと(FBX SDKが多言語サポートしていない)
  2. ミラーリングや曲面を使っている場合はエクスポート前にフリーズする必要がある
  3. Keynoteと併用する場合、オブジェクト名に「:」「-」「|」といった文字がある場合、Keynoteによって名前が変更され、名前衝突の原因となる
  4. Keynoteと併用する場合、どのボーンにも属さない頂点を生成することができ、ビルドエラーの原因となる

と、いうのが理論的な結果となりました。

 

なんですが、理論と実現実は違う物です。私自身、ゲーム開発時にモデルファイルフォーマット変換に起因する問題を多く経験してきたので、実際に試してみないと納得できません。そこでネットでダウンロードできるメタセコイアのモデルファイルを100個程集め、どんなデータになっているのかを実際に調べてみました。

この調査で判ったのは大半のモデルデータが日本語を使用しており、XファイルにしろFBXファイル形式にしろ、日本語を使っているファイルは読み込めませんでした。ですから、仮に日本語問題が解決したとしても、今までは日本語問題で隠れていた他の問題が浮上することもあり得ます。

後はやはり前回の記事で問題点とした「問題箇所を特定するのが難しい」と言うのは、個人や小規模な人数でゲーム制作する人にとって貴重な開発時間を奪ってしまうものでもあります。

理想的なのはメタセコイアで作ったファイルが直接XNAに読み込める、つまり、メタセコイアファイルとXNAのデータ構造の間に1つの変換プロセスしか存在しないという形で、下図のようになります。この場合、何か問題が合った場合は「?」の部分に問題があることになるので、XファイルやFBXファイルへ一旦変換するより効率的に問題点を見つけ出すことができます。

asset-pipeline03

 

この「?」に入るものとは、いったいなんなのでしょうか?

 

つづく……