2012/02/27

ProcessingでXファイルを解析(スタティックメッシュ篇その1)

今日は、DirectX で標準的に使用されていた X ファイルを読み込んで、Processing で表示してみたいと思います。 すなわち ——
Metasequoia にプリセットされている「日本橋麒麟像」
こんなふうに任意のモデリングソフトで作成したデータを、

上図のように、Processing でそのまま使えるようにしてしまおうという試みです。

しかし僕がアホすぎるせいで、まだ静止した 3D モデルの幾何形状だけしか読めていませんごめんなさい(アニメーションはおろか物体の色付けやテクスチャも無し)。



この課題の一番のネックは X ファイルのパーサです。

X のフォーマットはそれなりに自由度が高く、使用するモデリングソフトによって構造が変わったりします。 すべての状況に適応できる汎用性の高いコードを本気で書こうとすると、割と本格的な構文解析器を実装する必要があるような気がして心が折れます。

というわけで、個人的にはひとまず姑息的なパーサを手っ取り早く作り、なんか問題が起きたら適宜設計を見直しつつ修正していこうかと思います。



とりあえずXファイル読み込み関連をまとめたプログラム(長いので折りたたんであります)。

で、使い方はこんな感じ。

  1. Mesh mesh;  
  2.   
  3. void setup() {  
  4.   size(640480, P3D);  
  5.     
  6.   // ファイル名を指定してXをロード    
  7.   mesh = new Loader().loadX("nihonbasikirin.x");  
  8.     
  9. }  
  10.   
  11. void draw() {  
  12.   background(0);  
  13.   camera();  
  14.   lights();  
  15.   noStroke();  
  16.   
  17.   camera(500500500030000, -10);  
  18.       
  19.   scale(300);  
  20.     
  21.   // メッシュの描画  
  22.   mesh.render();  
  23. }  



ちなみに、現在の制約では、一つの X ファイルに複数のメッシュ情報が定義されている場合、うまく読み込む事ができません(対応は簡単ですが、それが必要な例を見た事がないのでとりあえずこのままでいいや的な……)。

ただ、視覚的には複数のように見えるメッシュであっても、内部的には一つのメッシュにまとめられているような場合は、正しくロードする事ができます(下図参照)。

Metasequoia にプリセットされている「魔道少女」
これを Processing で表示させると、ちゃんと 2 つのモデルが表示されます。


これからいろいろ忙しくなりますが、暇を見つけて『色付け』と『アニメーション』に対応していけたらなぁ……と考えています。 うーん……。

1 件のコメント:

  1. クラスListは存在しません。と表示されます

    返信削除

ひとことどうぞφ(・ω・,,)