引っ越しで忙しかったけどようやく落ち着きました。
Lion にアップグレードしたら chrome で webgl が動かなくなってとても悲しい気持ちに。
なので SVG をやってみようかと思います。
canvas はほとんど GDI みたいな感じでひたすら自力で描画するものですが、SVG はチャート書きや静的なデータ描画に向いてますね。奇麗なので良いです。しかしこれも webgl と同様にデータの保護が難しいですね・・・
Illustrator などで作るのが一番良さそうですが、せっかくなので別の経路でデータを作ってみようということで、今回はIGES を読んでみることにしてみます。IGES は互換性が悪いことで有名な CAD 系の古いフォーマットですが、いろんなソフトが対応しているのでやりがいはありますね。日本語の解説が こちらのページ に詳しく、参考になります。規格書的なものは US product data association のサイトからダウンロードできるようです。
一目見てわかるように、テキスト形式で固定レコード長の非常に FORTRAN っぽいフォーマットです。実際文字列とか FORTRAN 式で書かれてますし。でもこういうテキスト処理は javascript が得意なので良さそうです。
規格書を見るとエンティティの種類が山盛りあって、主にこれが互換性の問題になっているようです。ポリゴンなんかはどうやって出すのが正しいのかさっぱりわかりません。変換行列とかも謎すぎないか? 今回は Maya からエクスポートしようと思うので、126 と 128 の NURBS だけ対応してみることにします。もちろん SVG は二次元なので、なんらかの方法で投影しないといけませんが、今回は xz 平面でやりましょう。
さてファイルのパースは割とすぐにできそうなものの、NURBS を SVG にするのはあんまり簡単ではないようです。SVG の path エレメントの仕様を見てみると、スプライン的なものは2次ベジェと3次ベジェがありますね。スプラインの世界は実はとてもディープで踏み込むと簡単には帰って来れないくらいなのですが、ざっくり言うとベジェは始点と終点でコントロールポイントを通過するもので、その間の制御用コントロールポイントが一つだと2次、二つだと3次、という感じですかね?
Maya でごく普通に作ったカーブは、3次の non-uniform b-spline になると思います。正直長年 Maya を使っていてカーブやサーフェスにウェイトをいれたことがありません。さてBスプラインとベジェは互換性があるので、比較的簡単に形状を保ったまま変換することが可能です。詳しいやり方はちゃんとした書籍を調べて頂きたいですが、多重ノットがあればコントロールポイントを通過するので、多重でないノットにノットを挿入してやれば良い、のです。たとえばコントロールポイント5個の3次Bスプラインのノットベクトルが
0 0 0 0 1 2 2 2 2
だったとすると、1 のノットを2つ足してやれば良いわけです。ノットベクトルにはただ挿入すれば良いですが、制御点の方はというと、そのノットが影響する区間に関していい感じに内挿すればよい、ということになっています。個人的には CAD CG技術者のためのNURBS早わかり という本が面白くて詳しくて好きでしたが、入手困難なようです。こちらのページにも詳しいアルゴリズムが書いてありますね。
ちなみに Maya の curveInfo ノードやAPIで得られるノットベクトルは最初と最後が省略されていますので気をつけましょう。詳しくは MFnNurbsCurve のマニュアルに載っています。
これをまともにやると非常に計算量が無駄なのですが、それでも多重ノットだけから構成されるスプラインに変換できて、それがつまりベジェになります。(ウェイトはまだ考慮してません)
というところまで作ってみました。まだ全然面白くないですけど。
ちなみに生成した SVG をダウンロードしたいと思ったのですが、dataURL を使ってみたもののどうしてもファイル名がうまくセットできなくて、結局 flash 利用のライブラリを使ってしまいました。でもこれ便利ですね。
コメント