2011年4月13日水曜日

XNA向けのblenderエクスポータサンプル

自分のゲームでもベジェ曲線のデータを一部使いたいところがありましたので、先日blender(ブレンダー)のエクスポータ作成に挑戦してみました。

以下のサンプルが、皆さんのXNA向けblender 2.49b用のエクスポータの勉強用サンプルにでもなれば幸いです。

blenderエクスポータのススメ

難しかったらあきらめようと思ってたんですが、想像をはるかに上回るほど楽チンでしたので、これからなにかエディタをつくろうとか考えてる方で、ブレンダを触った方がいらっしゃったら、ブレンダのエクスポータを勉強する方をおすすめしたいと思います。

どれくらい簡単かといいますと、ブレンダのMQOエクスポータサンプル(メッシュとフェース出力のみですが)を参考にしたんですが、MQOエクスポータの行数はなんと200行程度で、ファイルに出力している重要ポイントとしては20行ぐらいです…。このサンプルを参考にさせて頂いたんですが、拍子抜けするぐらい短く書けます。


エクスポータの作成

今回は、blenderのエクスポータとpythonの勉強をかねてということが目的の1つでもありますので、あまり難しいことは考えず、今後気軽にblenderのエクスポータが作れるようになっておきたいということが目的でもあります。

今回やりたいことはすごく単純で、blender上で作成したカーブデータをXNAに持ってくるだけです。使いどころとしては、ボスや中ボスの出現時のカーブをとかを作りたい。ただそれだけです。(これくらいであれば、XNAにカーブサンプルがあるので、そちらを使わせて頂くというのも方法で、こちらもオススメです。)

普通カーブデータは、ポイントと時間の関係がセットなので、カーブデータ+時間情報が必要なのでしょうが、時間も各点の間は一定の時間と割りきってしまうことで時間のデータとかも別にいりません。もし時間が必要なら、点と点の隙間を短くしたり長くしたりで代用できると思います(素人の割り切りです…。)

抽出したいのは、画面そのままの情報で、通過ポイント1つとハンドル2つで、3つで1組のデータです。以下の場合、3×5個=15個の点情報です。

UROBOROSXNA_20110412_01


XNA向けのblender エクポータサンプル

こちらに、サンプルを置いておきました。

curves.blend

blenderのファイルで、[ファイル]-[開く]メニューからblenderに読み込めます。上のような2つのカーブデータCurve001とCurveのが表示されるだけのサンプルデータです。

CurveXmlExport.py

エクスポータ本体です。blenderのスクリプトフォルダにコピーすることで、エクスポータとして機能します。私の環境の場合ですと、C:\blender-2.49b-win64-python26\.blender\scripts\ にコピーしました。

このファイルをコピーした後、blenderを起動して、[ファイル]-[エクスポート]とすると、[XNA Curve XML-Exporter]というメニューが追加されてます。

1.curves.blend を読み込む

2.[ファイル]-[エクスポート]-[XNA Curve XML-Exporter] を選択。ここでポップアップメニューが表示され、[All curves]を選択すると、サンプルでは2つのカーブが、[Only Selected  curve]を選択すると選択中のカーブだけが xmlに出力されます。なお、[XNA Curve XML-Exporter] 選択後、マウスを動かし過ぎると、blenderの仕様でポップアップメニューが消えちゃうので注意してください。

curveData.cs

サンプルで使用している CurveDataクラスのサンプルです。自分用のエクスポータを作るときはエクスポータ(CurveXmlExport.py)の修正に合わせて、このクラスをあわせて変更する必要があります。XNAアプリケーションではなく、XNAライブラリを作成してそちらをContentプロジェクトの参照に設定するのが一般的だと思います。

curvetest.xml

エクスポータで出力した実際のXMLファイルです。このファイルはXNAのContetフォルダに追加することができます。プログラムからは

   1: curves = Content.Load<Dictionary<string, CurveData>>("curvetest");



こんな感じで読み込めます。キーはカーブ名で、値はカーブデータです。サンプルデータを読み込んだ場合は、”Curve001”と”Curve”というカーブがキーに入ってます。


XNA側の実行サンプルが用意できればよかったのですが、そこまで頑張れなかったです。またご要望があれば用意したいと思います。

※一応 blenderは日本語化しています。メニューが英語の方は読み替えてください。





サンプルエクスポータのダメな所

CurveXmlExport.pyを見ると分かるのですが、

<XnaContent xmlns:Generic=\"System.Collections.Generic\"  xmlns:Curves=\"CurveTestData\">

という行が入ってます。XNA用のXMLを出力する場合には、ネームスペースを埋め込むのですが、この為に特定のアプリケーション専用のエクスポータになってしまいます。今回のエクスポータののサンプルの場合は、アプリケーション側がこんな感じになってて、その CurveTestData をXMLで指定しています。

   1:  namespace CurveTestData
   2:  {
   3:      public class CurveData
   4:      {
   5:      }
   6:  }


汎用的なエクスポータを作っておきたい場合には、csv形式や独自形式で出力して、パイプラインでXNAで取り込めるようにするのがよいと思います。というかむしろこっちのほうが良い戸思います。




blenderでエクスポータを作成するときの注意点


最後まで読んでくださる方がどれだけいるのか分かりませんが、blenderのエクスポータを作成する上で、ハマった内容や、重要だったポイントを書いておきます。


私は、blenderでエクスポータを作るのも初めてでしたが、pythonを触るのも初めてでした。その時に困ったことなどもメモしておきたいと思います。


エクスポータ作成に困った事や対処した方法など
  • まずblender python APIを流し読みして、どんなオブジェクトがあるかなんとなく理解する。

  • エクスポータ内で取得したオブジェクトの型が全然わからない場合の対処

    型指定しない言語の良さもあり、欠点でもあるとおもうのですが、プログラムで取得した型がさっぱり分かりません。いろいろなサンプルエクスポータをみても解決しません。

    例えば、objs = bpy.data.objects

    ここで得てるobjsは何クラス?どんなメンバ関数やメンバ変数があるの?特に初めてエクスポータを書く人にとって、訳がわからないと思います。

    この場合、 プログラムで  print  help(objs) みたいに help()関数を呼んでください。これで、 objsの所属クラスのヘルプが blender のコマンドウィンドウに表示してくれました。ここでいうコマンドウィンドウとは、blender起動時にでるなぞの真っ黒ウィンドウのことを言ってます。長いヘルプの場合、コマンドウィンドウでスペースキーで全部のヘルプを表示しないと、blenderのメインウィンドウが固まるのでご注意を。

    正直 help()関数を知るまで、エクスポータ作成は無理と思いましたが、これがあれば、blender python APIはほとんど読まなくてもエクスポータを書けるんじゃないかぐらいに思い直しました。

  • print 関数で プリントデバッグできるようになります。コマンドウィンドウに表示されます。

  • スクリプトのエラーはコマンドウィンドウに表示されます。

  • スクリプトから扱えるデータは、画面に表示されてるデータと同期がとれてない場合があります!

    もしblenderのメイン画面でカーブデータやメッシュデータを変更したら、必ず[F12]キーを押して、一度レンダリングを実行してください。どうもこうしないと、画面に表示されているデータとスクリプトで扱っているデータの同期がとれないようです。情報元は忘れましたが、どこかのホームページにも書かれてました。これは少しハマりました。

    たぶん、まともな回避策が存在するに違いないとは思うのですが、今も解決できてません。

  • エクスポータのソースエディタはblenderに搭載されてますが、慣れてない人はやめたほうがいいと思います。いろいろキーバインドされてて、ウィンドウ表示が変わったりして訳が分からなくなることがあります。使い慣れたソースエディタがある方は、直接 C:\blender-2.49b-win64-python26\.blender\scripts\ 以下のソースを編集してデバッグする方をオススメしたいと思います。

  • ソースで日本語使うときは、 UTF-8でソース保存します。なお、BOM無しにしておく必要があります。サンプルもUTF-8のBOM無しです。対応したエディタで開いてください。


あとがき

私自身今回はじめてエクスポータ作ったので、詳しいことは分かりませんが、ひにけに先生も自前でエディタつくるよりは、3Dモデルエディタのエクスポータを作ったほうが良いみたいなことを言われてたんで、きっとそうしたほうが良いと思います。

マップエディタとか、そういうツールをつくり始めると、いつのまにかそちらが本業のようになってしまって、ゲームを作る目的がどこかに入ってしまうとかいう経験がある方は、是非。私もその一人でした…。

昔の何もない時代には全部自分でツールも作成するというのが一般的だったと思うのですが、今はライブラリとかエディタのエクスポータとか、すでにあるツールをうまく使うという時代にだんだん時代が変わってきてますね。

0 件のコメント:

コメントを投稿