メタセコイアとKeynoteとXNAとMkxエクスポーター


前回はメタセコイアのモデルファイルであるMQOファイルを直接読み込むことのできるインポーターを含んだメタセコイア・パイプラインを紹介しました。

モデルが読み込めたら、次はアニメーションデータを使いたくなります。メタセコイア自体にはアニメーション機能は付いていないのですが、プラグインによってアニメーションを付けてしまおうというのがKeynoteです。Keynoteを使っている時にモデルデータをセーブすると、.mqoファイルと一緒に.mqxというプラグイン用のファイルが出力されます。

理想的には、この.mqxファイルにあるアニメーションデータをメタセコイア・パイプラインで直接読み込めると良いのですが、以下の問題がありました。

  • Keynoteが出力する.mqxにはアニメーションのキーフレーム情報しか出力されない
  • ボーン情報が.mqxに含まれていない。
  • メッシュのボーンウェイト情報が.mqxに含まれていない

これらの情報はKeynote内でモデルデータから生成されているのですが、その生成方法が判らないとインポートすることができません。同じ理由でMqoファイルインポーターでも一般に良く知られているCatmull-Clark曲面は実装できましたが、曲面タイプ1と2は実際にメタセコイアがどのような計算をしているのかが判らないと実装できないので、これらの曲面タイプはサポートされていません。

さて、これは困ったなぁと、数日間試行錯誤することとなりました。幸い、Keynoteには他のプラグインからKeynoteで生成した情報にアクセス出るAPIが提供されていたので、それを使うためにメタセコイア用のプラグインを作り、そこからメタセコイア・パイプラインで読めるファイル形式の形にして出力する方法が使えると言うことが判りました。

ただ、独自ファイルフォーマットを作るには時間が掛かるし、アニメーションデータを読むだけの為にわざわざ新しいファイルフォーマットを作るのには抵抗がありました。そこで、メタセコイア・パイプライン内にはMqoファイルから読み込んだ情報を一旦DOM(データ・オブジェクト・モデル)形式として保持するようになっているので、このDOM自体をXNAコンテント・パイプラインのIntermediateSerializerを使ってデシリアライズする方法をとることにしました。こうすることでMqoファイルを読むときもDOM形式でデシリアライズするときも全く同じ処理をすることができるので作業量が減り、メンテナンス性が上がり、バグの可能性も大幅に減らすことができるようになります。

と、いう経緯でできたのがMkxファイルフォーマットです。MkxはMetasequoia,Keynote,XNAの略でデータの流れを表しています。実際にはXMLファイル形式となっています。

 

メタセコイア用プラグイン、Mkxエクスポーター

前置きが長くなりましたが、今回はMkxエクスポーターを紹介します。以下のURLからダウンロードできるようになっています。ファイルの使い方に関する情報は付属しているReadme.txtファイルを参照してください。

プラグインのインストール方法はメタセコイアのマニュアルを参照してください。このプラグインはWindows XP SP2以降のOS標準の機能しか使っていないので、プラグインを使用する際はXNA Frameworkランタイムを始め、VC++用のランタイムなどは必要ありません

Mkxエクスポーター本体(MkxExporter.dll)
http://higeneko.net/hinikeni/sample/xna40/MkxExporter-1.0.101222.0-bin.zip

Mkxエクスポーターのソースコード(Visual Studio 2010用プロジェクト)
http://higeneko.net/hinikeni/sample/xna40/MkxExporter-1.0.101222.0-src.zip

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

 

Mkxエクスポーターの機能

Mkxエクスポーターには以下の機能があります。

  • 日本語完全対応
  • Keynoteで作成したボーン情報、スキニング情報、複数アニメーション出力
  • Keynoteを使っている時におきる問題の検出と対処方法の表示
  • オブジェクト出力モード
  • Catmull-Clark曲面やミラーリング使用時のボーンウェイト生成(インポート時)

Keynoteで作成した情報を出力するにはKeynoteをアクティブの状態、つまり「ボーン」コマンドボタンが押された状態で「ファイル/上書き保存」を選び、ファイル種類を「MKXファイル(*.mkx)」を選んで保存することでできます。

Keynoteによる名前変更が原因で名前衝突が起きる場合、Mkxエクスポーターは名前衝突が起きない名前へと変更します。この処理が発生した場合、エクスポート終了後に下図のようなメッセージが表示され、どの名前を変更したのかが表示判るので容易に修正できるようになっています。

20101223-mkxexporter01

また、設定ミスによってできてしまう、どのボーンにも属さない頂点を見つけたときには、XNA側で正しくインポート出来るように孤立した頂点用のボーンを自動生成するようになっています。この場合もエクスポート終了後に下図のようなメッセージが表示され、どのオブジェクトに孤立した頂点があるのかが表示されるので容易に修正できるようになっています。

20101223-mkxexporter02

オブジェクト出力機能は私がデバッグ時に使用していた物で、Keynoteを非アクティブ、もしくはインストールされていない状態でMkxファイルを出力すると、このモードでファイルが出力されます。この時に出力されるのはMqoファイル形式で出力されるものと同じ物が出力されます。メタセコイア・パイプラインにはMqoファイルを直接読み込む機能があるので、必要性は殆どありません。強いて言うならMqoファイルで出力するより15~50%程ファイルサイズが小さくなることくらいです。

 

Mkxファイルの使い方

Mkxファイルをゲームプロジェクトへ追加する方法は前回紹介したMqoファイルのインポート方法と同じように

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

だけです、この時、自動的にMkx形式メタセコイア モデルインポーター(MkxImporter)が設定されます。

 

アニメーションサンプル(SkinningSample)

前回紹介したサンプルの中にはMkxファイルをインポートしてアニメーションさせるサンプルが同梱されています。このプロジェクトを実行すると、下図のようにeynoteに付属しているサンプルのキャラクターアニメーションを見ることができます。

20101223 skinning sample

このプロジェクトはAppHubにあるSkinned Modelサンプル(英語版)のコメントを日本語に訳し、以下の2つの変更を加えたものです。

  • SkinnedModelProcessorをModelProcessorではなくMqModelProcessorから派生させた
  • 実行時、テクスチャが指定されていないSkinnedEffectに白いテクスチャを設定

SkinnedEffectはテクスチャなしの状態だと実行時にエラーとなるので、それを回避する為に1x1の白いテクスチャを生成して設定するようにしました。

以上のように既存のサンプルからの変更点は皆無に等しいので、簡単にMkxファイルフォーマットへと移行することが判ると思います。

 

まとめ

今回のメタセコイア特集連載(第一弾?)の最後に、この場を借りてメタセコイアの作者である水野様、サンプルで使用したモデル制作者であるKT爺様、そしてKeynoteの作者でありエクスポーター制作時には私の不躾な質問に快く答えてくださったmqdl様に感謝の意を表します。

 

さて、前々回のまとめではメタセコイアでモデルを出力する際にはFBXエクスポーターを使い、幾つかの注意点に留意する必要があると述べました。この注意点はメタセコイア・パイプラインとMkxエクスポーターの組み合わせを使った場合にどうなるか見てみましょう。

  1. 曲面タイプ1と2を使っている場合はエクスポート前にフリーズする必要がある

と、なります。私がテスト用にダウンロードした中で曲面タイプ1や2を使っているケースは100個中3個と少なく、キャラクターモデリングの場合はCatmull-Clark曲面を使用する傾向にあるようです。ですから、この注意点が大きな問題となることは殆どないと思われます。また、問題が起きた場合、それはメタセコイア・パイプラインとMkxエクスポーターのバグである可能性が高く、その場合でもソースコードが公開されているのでデバッグ、修正することができます。もちろん、バグが出た場合は私の方でもできうる限りの対応はするようにしますので気軽に連絡ください。

 

XNAを使って3Dゲームを作りたい、3Dゲーム制作というのはどんな物なのか知りたいという人にとって、初めての3Dゲーム制作の為にいきなり高額な3Dモデリングツールを買うというのは敷居が高すぎます。そんな人達の多くが一度は触れるのがメタセコイアなのではないでしょうか?今までの記事で述べてきたように、以前はメタセコイアで作られたモデルをXNAで使うには細かい注意点が必要でした。この細かな注意点に貴重な時間を奪われてしまうのは勿体ないことです。

メタセコイア・パイプラインとMkxエクスポーターがそんな人達の力に少しでもなれることを願います。

Comments (11)

  1. ウィルフレム says:

    お疲れ様です。

    「高額な3Dモデリングツール」はやはり制作においてボトルネックになりますね。

    こういうのが出てくると同人やフリーゲームも盛り上がるかもしれませんね。

    追伸

    twitterの方でも同様のコメントを流しましたが

    ブログも盛り上げるため、こちらでも。

  2. Shidenkai says:

    こちらのサイトの

    http://www.geocities.jp/…/sozai.html

    「ボスA第二形態 △3000ポリ mqo・sig」のファイルを使い、

    サンプルプログラムのino-oyako を bos3 に変更してみました。

    すると、Content.Load の行で下記のエラーが出ます。

    "bos3" の読み込み中にエラーが発生しました。ファイルに Microsoft.Xna.Framework.Content.Pipeline.Graphics.NodeContent が含まれていますが、Microsoft.Xna.Framework.Graphics.Model として読み込もうとしました。

    具体的な対処方法はどうすればよろしいでしょうか?

  3. shidenkai says:

    追伸:

    プロパティでインポーターとプロセッサを設定したら表示されました。

    自動的に切り替わるものと思っていました。

    距離が近いせいというのは分かりましたが、絵ではなく紫の三角形が回転している状況になりました。

    カメラを引いて再挑戦してみます。

  4. shidenkai says:

    追伸です。

    距離を遠くして表示して見ました。

    bos3 は、骨の情報でしょうか、骨の位置に単色三角ポリゴンが表示されたものになりほかは表示されません。テキスチャも全く表示されません。

    他のデータでも試したところ、軽トラのはうまく表示されました。

  5. ご報告ありがとうございます。

    こちらでも確認したいところなのですが、現在、開発に携わっているゲームがマスターアップ直前なので確認作業にしばらく掛かることをお許しください。

    テクスチャが出ないのは、MQOファイル内のテクスチャ参照パスが相対パスになっていなかったりするとコンバートできないので、ご確認していただけないでしょうか?

  6. shidenkai says:

    ルートになっていました。

    また、メタセコア4で確認したところ、面が非表示になっていました。

    面表示に設定を変え、コンテントに配置してビルドしようとしたら、

    メタセコイアファイルでないとエラーが出てしまいました。

    以下がメタセコイア4で面表示にして保存しなおしたコードの1部です。

    Metasequoia Document

    Format Text Ver 1.1

    Scene {

    pos 1.6075 0.7288 1872.8660

    lookat 3.3998 105.8408 2.3856

    head 389.5285

    pich 1.5708

    bank 0.0000

    ortho 0

    zoom2 14.1201

    amb 0.250 0.250 0.250

    dirlights 1 {

    light {

    dir 0.408 0.408 0.816

    color 1.000 1.000 1.000

    }

    }

    }

    Material 29 {

    "mat4" shader(3) col(1.000 1.000 1.000 1.000) dif(1.000) amb(0.100) emi(0.300) spc(0.060) power(7.00) tex("m.bmp") bump("mb.bmp")

    "頭" shader(3) col(0.000 0.667 1.000 0.400) dif(1.000) amb(0.600) emi(0.250) spc(0.000) power(5.00)

    "胸" shader(3) col(0.000 0.502 1.000 0.400) dif(1.000) amb(0.600) emi(0.250) spc(0.000) power(5.00)

    "腰" shader(3) col(0.000 0.333 1.000 0.400) dif(1.000) amb(0.600) emi(0.250) spc(0.000) power(5.00)

    "肩[]" shader(3) col(0.000 0.165 1.000 0.400) dif(1.000) amb(0.600) emi(0.250) spc(0.000) power(5.00)

    "腕[]" shader(3) col(0.000 0.000 1.000 0.400) dif(1.000) amb(0.600) emi(0.250) spc(0.000) power(5.00)

    "手[]" shader(3) col(0.169 0.000 1.000 0.400) dif(1.000) amb(0.600) emi(0.250) spc(0.000) power(5.00)

    "モモ[]" shader(3) col(0.333 0.000 1.000 0.400) dif(1.000) amb(0.600) emi(0.250) spc(0.000) power(5.00)

    "スネ[]" shader(3) col(0.502 0.000 1.000 0.400) dif(1.000) amb(0.600) emi(0.250) spc(0.000) power(5.00)

    "足[]" shader(3) col(0.667 0.000 1.000 0.400) dif(1.000) amb(0.600) emi(0.250) spc(0.000) power(5.00)

    "01[]" shader(3) col(1.000 0.980 0.310 0.400) dif(1.000) amb(0.250) emi(0.250) spc(0.000) power(5.00)

    "02[]" shader(3) col(1.000 0.980 0.310 0.390) dif(1.000) amb(0.250) emi(0.250) spc(0.000) power(5.00)

    "11[]" shader(3) col(1.000 0.980 0.310 0.460) dif(1.000) amb(0.250) emi(0.250) spc(0.000) power(5.00)

    "12[]" shader(3) col(1.000 0.980 0.310 0.440) dif(1.000) amb(0.250) emi(0.250) spc(0.000) power(5.00)

    "13[]" shader(3) col(1.000 0.980 0.310 0.420) dif(1.000) amb(0.250) emi(0.250) spc(0.000) power(5.00)

    "21[]" shader(3) col(1.000 0.980 0.310 0.300) dif(1.000) amb(0.250) emi(0.250) spc(0.000) power(5.00)

    "22[]" shader(3) col(1.000 0.980 0.310 0.380) dif(1.000) amb(0.250) emi(0.250) spc(0.000) power(5.00)

    "23[]" shader(3) col(1.000 0.980 0.310 0.320) dif(1.000) amb(0.250) emi(0.250) spc(0.000) power(5.00)

    "31[]" shader(3) col(1.000 0.980 0.310 0.390) dif(1.000) amb(0.250) emi(0.250) spc(0.000) power(5.00)

    "32[]" shader(3) col(1.000 0.980 0.310 0.440) dif(1.000) amb(0.250) emi(0.250) spc(0.000) power(5.00)

    "33[]" shader(3) col(1.000 0.980 0.310 0.430) dif(1.000) amb(0.250) emi(0.250) spc(0.000) power(5.00)

    }

  7. shidenkai says:

    続きです。

    bdef:body が非表示>>表示にして 上書き保存(メタセコイア4)

    Object "bdef:body" {

    depth 0

    folding 1

    scale 1.000000 1.000000 1.000000

    rotation 0.000000 0.000000 0.000000

    translation 0.000000 0.000000 0.000000

    visible 15

    locking 0

    shading 1

    facet 180.0

    color 0.431 0.533 0.725

    color_type 0

    vertex 1500 {

    25.9522 161.6270 -1.2727

    -3.1081 189.5260 12.2502

    -2.7970 193.3163 9.3277

    省略

    -115.5236 159.4867 -10.1397

    -100.6111 157.7132 1.0067

    -36.3681 161.9956 -5.5278

    }

  8. メタセコイア4.0でセーブしたMQOファイルに対応したコンテント・パイプラインを公開しました。

    blogs.msdn.com/…/metasequioa-pipeline-1-2.aspx

  9. Shidenkai says:

    対応ありがとうございます。

    XNAはマイクロソフトのライブラリの中では一番気に入っているのですが、

    開発終了とのことで、スルーされるか心配でした。

    XBOXONEの開発環境にこのノウハウが生かされると信じて頑張っています。

    LiveAnimation がフリーになり、

    http://www.drf.co.jp/liveanimation

    アニメつきFBX出力がunityには実装できるが、

    XNA4.0 ではモデル表示はうまくいくものの、

    モーションがぐちゃぐちゃになって、LiveAnimation開発者が

    苦労されているようです。

    LiveAnimationアニメつきFBX => XNA 4.0 対応 アニメつきFBX

    にコンバートするにはどうしたらいいでしょうか?

  10. XNAが使っているFBXのバージョンは2011.13なので、最新バージョンのFBXファイルの読み込みには対応していません。Autodeskさんが配布しているFBX Converterを使えば旧ファイルバージョンへの変換が可能となっているので、それを使ってみてはどうでしょうか?

    usa.autodesk.com/…/item

  11. Shidenkai says:

    解法とソフトの紹介ありがとうございます。

    困っている人たちに伝えたいと思います。

    このメッセージの前に出したまだ表示されていないメッセージは手違いなので掲載せずに削除でお願いします。

Skip to main content