メタセコイアのモデルファイルをXNAで直接読み込む「メタセコイア・パイプライン」

メタセコイア 4.2が出力するMQOファイル読み込みに対応した「メタセコイア・パイプライン Ver. 1.3」を公開しました

メタセコイア 4.0が出力するMQOファイル読み込みに対応した「メタセコイア・パイプライン Ver. 1.2」を公開しました

メタセコイア 3.0が出力するMQOファイル読み込みに対応した「メタセコイア・パイプライン Ver. 1.1」を公開しました

 

前回は「問題箇所を特定するのが難しい」という問題を解決する為にメタセコイアファイルとXNAデータの間に入る変換プロセスはなにか?というところで終わりました。

プロのゲーム開発でもこの「問題箇所を特定するのが難しい」というのは非常に大きな問題です。なぜならこの問題を解決するのに時間が掛かるのはもちろん、いつ問題が発生するのか判らないという、スケジュールへの悪影響があるからです。ですから、ゲーム制作の中で重要な3Dモデルデータの場合、使用するモデリングツール専用のプラグインや変換ライブラリを作ることが多くなります。他社で提供されたものを使う場合でも、慎重に検証するのはもちろん、そのソースコードとコンパイル環境があるかが採用する際の重要な決め手となります。

XNAでは、この「モデリングツール専用の変換ライブラリ」に相当するのがインポーターです。

asset-pipeline02

もちろん、インポーターを作るのにも時間が掛かりますが、一旦完成させると開発効率が飛躍的に向上します。私がGame Buildingの時に5日間でゲームっぼい物を作ることができたのも、自作したLightwaveインポーターによるところが大きいです。

そこで、今回はメタセコイアファイルを直接読み込むことのできるインポーターを含んだコンテント・パイプライン用アセンブリ、メタセコイア・パイプラインを紹介していきます。

今回紹介するメタセコイア・パイプラインは以下のURLからダウンロードできるようになっています。XNA Game Studio 4.0向けに書かれています。ファイルの使い方に関する情報は付属しているReadme.txtファイルを参照してください。

メタセコイア・パイプラインを使ったサンプル(アセンブリファイルも含む)
http://higeneko.net/hinikeni/sample/xna40/MetasequoiaPipeline-1.0.101222.0-sample.zip

メタセコイア・パイプライン: コンテント・パイプライン用アセンブリファイル
http://higeneko.net/hinikeni/sample/xna40/MetasequoiaPipeline-1.0.101222.0-bin.zip

メタセコイア・パイプライン: ソースコードとプロジェクト
http://higeneko.net/hinikeni/sample/xna40/MetasequoiaPipeline-1.0.101222.0-src.zip

これらは私個人で仕事時間外に作ったものなので、Microsoft社やXNAチームは一切関与してません。ですから、バグあってもConnectとかに連絡しても相手にしてくれないでしょう。バク報告や要望などがあればAppHub内のフォーラム(XNA開発者によるコミュニティフォーラムです)かsupport@higeneko.comへメールしてください。

 

メタセコイア・パイプライン(MetasequoiaPipeline.dll)

このパイプライン・アセンブリには以下のインポーターとプロセッサーが含まれています。

  • メタセコイア モデルインポーター(MqImporter)
  • MKX形式メタセコイア モデルインポーター(MkxImporter)
  • メタセコイア モデルプロセッサー(MqModelProcessor)

メタセコイア モデルインポーター(MqImporter)では以下のメタセコイアファイル内情報をインポートします。

  • 日本語を含んだオブジェクト名、マテリアル名、そしてテクスチャファイル名
  • オブジェクト(階層構造、可視、スムージング等)
  • マテリアル情報(模様、透明、凸凹テクスチャ情報を含む)
  • メッシュデータ(頂点、UV座標、頂点カラー)
  • Catmull-Clark曲面(インポート時にポリゴン面へ変換される)
  • ミラーリング(分割、接続、接続距離制限、ローカル座標)
  • 回転体
  • メッシュ分割機能(16Bitインデックスバッファに収まるようにする)

このインポーターはMQOファイルに書かれている文字列をSJISとして処理するので、オブジェクト名、マテリアル名、そしてテクスチャ名全てに日本語文字列を使うことができます。Windows、Windows Phone 7では日本語ファイル名をサポートしているのでMQOファイルやテクスチャファイル名に日本語があっても問題ありません。Xbox 360は日本語ファイル名をサポートしていませんが、テクスチャファイル名はコンテント・パイプライン内ではモデルから参照されているテクスチャファイル名を英数字へ変換するので問題ありません。日本語ファイル名のMQOファイルをインポートする場合、プロパティのアセット名を英数字にするだけで元のファイル名はそのままでインポートすることができる、つまりコンテント生成時にはなにも気にせずに日本語を使うことができるということです。

インポート自体は可視オブジェクトのみをインポートするので、ゲームに関係の無いオブジェクトを不可視設定にするだけで同じMQOファイルをそのままゲームプロジェクトへ追加することができます。

メッシュ分割機能はReachプロファイルでもモデルを表示できるようにするのが主な目的ですが、HiDefでも32Bitインデックスより16Bitインデックスの方が描画効率が良いので常に16Bitインデックスバッファへ変換するようになっています。

 

MKX形式メタセコイアモデルインポーターの機能については次回説明します。

 

メタセコイア モデルプロセッサー(MqModelProcessor)は標準のModelProcessorから派生したもので、以下のメタセコイア特有の情報を処理します。

  • 模様、透明テクスチャの合成
  • アルファブレンドが必要かどうかの自動判定(ModelMeshPart.Tagへ格納される)

通常、ゲーム内では不透明のメッシュを描画してから、半透明のメッシュを描画するようにして不透明、半透明のメッシュ間での視覚的問題がでないようにします。この処理をする為にはどのメッシュが不透明で半透明なのかが判らないとできません。そこで、このプロセッサー内ではアルファ値の使用状況をマテリアルのアルファ値、頂点カラー、そしてテクスチャのピクセル情報から自動的に判定するようになっています。

半透明処理が必要なアルファ値、つまり255以外の値を使っている場合、このプロセッサーはModelMeshPart.TagへInt32値で1を格納するようになっています。ですから、ゲーム内で(ModelMeshPart.Tag != null)という判別式でこのメッシュが半透明処理が必要かどうかを判定することができるようになっています。サンプルプロジェクト内のDrawModelメソッドではこの処理を行っているので、そのコードが参考になると思います。

 

メタセコイア・パイプライン  サンプル

サンプルパッケージには以下のものが含まれています。

  • メタセコイア・パイプライン、アセンブリファイル(MetasequoiaPipelineフォルダ内)
  • モデルインポートサンプル(ModelImportSampleフォルダ内)
  • アニメーションサンプル(SkinningSampleフォルダ内)

メタセコイア・パイプライン アセンブリファイルはバイナリパッケージにあるもと同じものです。アニメーションサンプルについては次回説明します。

モデルインポートサンプルでは実際にインポートしたメタセコイアモデルを表示するサンプルとなっています。ここではKT爺様(「萌えろ!CG道場+」http://ktg.sblo.jp/)からダウンロードしたものを使用させてもらいました。このモデルは見た目も素晴らしく、データ的にもオブジェクト階層構造、ミラーリング、Catmull-Clark曲面、そして透明テクスチャとメタセコイアの主要な機能のデモには最適のモデルでした。この場を借りてKT爺様に感謝の意を表します。

サンプルを実行させると以下のような画面になります。モデルファイルがダウンロードできるページの最後にある画像と比べると、XNA上でも同じものが表示されているのがわかると思います。また、Windows, Xbox 360, Windows Phone 7の全てのプラットフォームで動作し、Windows Phone 7のプロジェクトは実機とエミュレーター上で動作しているのを確認しました。

ino-oyako

このサンプルの中では、前述のように半透明メッシュであることを表す(ModelMeshPart.Tag!=null)という判別式を使って、不透明メッシュを描画してから、半透明メッシュを描画するようになっています。この処理で不透明メッシュと半透明メッシュ間の描画順による視覚的問題は解決しています。また、このモデルでは笹の葉部分に半透明メッシュ同士の重なった部分があるので、実行時に半透明メッシュをAlphaTestEffectへと変換することで対応しています。このモデルの場合は特に問題にはなりませんが、AlphaTestEffectにはライティング設定ができないので、実際のゲームではライティングが必要な半透明メッシュと区別する必要があります。

 

気軽に使える

では、実際に自分作ったゲームにメタセコイアファイルを追加するにはどうしたら良いのでしょうか?

  1. MetasequoiaPipeline.dllをコンテントプロジェクトの参照設定で追加する
  2. インポートしたいMqoファイルを追加する

だけです。これだけで下図のようにインポーターやプロセッサーがメタセコイア・パイプライン用のものが自動的に設定されます。テクスチャファイルを使っている場合はプロジェクトに追加するのではなく、コンテントフォルダ内へファイルをコピーするのを忘れないでください。

mqimporter

 

まとめ

今回はメタセコイア・パイプラインを紹介しました。この60KB足らずのアセンブリファイルを追加するだけで、メタセコイアで生成したモデルを簡単にゲーム内で使えるようになりました。その利点としては

  • 日本語が使える
  • 無償版のメタセコイアLE版が使える
  • ネットでダウンロードしたモデルをそのまま使える(ライセンスには気をつけて)
  • ミスや問題の起こりやすい変換作業要らず
  • ミラーリング、回転体、Catmull-Clark曲面に対応しているのでいちいちフリーズする必要がない
  • オブジェクトやマテリアル名もインポートするので、その名前を使ったゲーム向けの処理をすることができる

が挙げられるでしょう。

さて、モデルがインポートできるようになったら、次はアニメーションです。

つづく……