ここ2,3日three.jsオブジェクトのシリアライズ方法を考えていた。シリアライズという意味は以下の通りである。
オブジェクト指向プログラミングにおいて使われる用語で、ある環境において存在しているオブジェクトを、バイト列やXMLフォーマットに変換することをいう。より具体的には、そのオブジェクトの状態を表す変数(フィールド)と、場合によってはオブジェクトの種類(クラス)を表すなんらかの識別子を、ファイル化できるようなバイト列やXMLフォーマットの形に書き出すことをいう。これにより、オブジェクトの表すデータを、ファイルとしてセーブしたり、ネットワークで送信したりすることができるようになる。このようにして得られたバイト列やXMLフォーマットは、直列化復元ないしデシリアライズによって、元のオブジェクトに復元される。 また、オブジェクトを直列化してファイルなどの永続記憶に保存することを永続化という。
three.jsはビューワーとして使われることが多い。何かのオーサリング・ソフトで作成したものをインポートする、もしくは自己で動的に生成しをそれを見るという使い方が多いと思う。他の3Dファイルフォーマットのインポータが充実していうところからしてもその傾向はうかがえる。
もちろんFPSなどではプレイヤーがどのステージのどの位置にいるとかなどの情報はシリアライズ・永続化しておき、再開時にそれを読み込んで再現する必要はある。けれどもその際sceneやカメラの情報を保存しておく必要性、つまり見てくれの情報は保存する必要はほとんどない。
そのせいかThree.jsのオブジェクトはあまりきちんとシリアライズ関連の実装はされていない。 一応シリアライズのためのJSONフォーマットは定義されている。
- JSON Model format 3 (Soon to be deprecated)
- JSON Geometry format 4
- JSON Texture format 4
- JSON Material format 4
- JSON Object/Scene format 4
JSON Model format 3はもう使われなくなりこれからは、format 4となるそうだがまだ策定中の段階である。
geometryのソースコードを実際にのぞいてみるとまだ実装中であることがわかる。geometryのtoJSON()メソッドの中身はこれはBufferGeometryのものと同じであり、実行すると情報が欠落する。またこのフォーマットを読むためのローダーが存在しない。試しにBufferGeometryLoaderを使用してみたがやはり正常には読み込めない。あと気になるのはローダーに対応するエクスポーターがほとんどないことである。そのためエクスポーターは独自実装されているものと思われ、その点でも不統一な感じが否めない。このあたり標準的なものが実装されればよいなと思うのだが、それはまだ先のようだ。
それでやっぱり独自に必要な部分だけシリアライズコードを書くことにしたのだけれども、やっぱり考えるのは非常に面倒だ。こんなことは手っ取り早く解決して次に進みたいのだが、どのように実装すれば効率的かなぁとか考えると1-2時間はあっという間に過ぎてしまう。まああまり深く考えるのはやめることにしよう。
私の場合まずはTHREE.Shapeを永続化できればよい。SVGからTHREE.Shapeに実行の都度変換するのは効率が悪いからだ。なのではまずはこのオブジェクトを永続化することにチャレンジしてみようと思う。フォーマットはJSON Object/Scene format 4で保存しそれを読み込むものとなるだろう。