2017年06月02日

独自フォーマットの仕様

仕様の公開はフォーマットが完成してからにしたかったですが、まだ時間がかかりそうなので早めに公開しておきます。
独自フォーマットのBlenderエクスポータが書き出せるデータの種類とその仕様は以下のようになっています。


Mesh
   ・マルチマテリアルの場合はマテリアルで分割したメッシュを書き出す
   ・シェイプキー対応(マルチマテリアルは分割、頂点数の最適化は無し、差分も無理)
   ・TangentSpaceの書き出し対応、UVがあれば無条件で書き出す(手抜き)
   ・UVレイヤーは4つまで
   ・頂点カラーレイヤーも4つまで
   ・四角面以上は全て三角面に変換して書き出す、三角面以外を扱うことはデータ構造上不可能
   ・ウエイトの影響ボーンは5本以上も書き出す、ウエイトの正規化もなし

Animation
   ・Blenderのスキニング行列をDecomposeして書き出す
   ・上によるキーフレームアニメーションに対応
   ・アニメーションクリップの書き出し対応
   ・シェイプキーアニメーションは未実装(実装予定あり
   ・Bake済みデータを書き出すため、EasingやBezierなどのキーフレーム補間情報は扱わない
   ・Armatureには関知せず存在するデータを全て書き出す
 
Armature
   ・IKターゲットなどの制御用ボーンも書き出す
   ・IKのデータは、ArmatureでなくSkeleton属性から書き出す
   ・アニメーションがBake済みのため、IK以外のBoneConstraintには未対応
   ・LeafBone(tail)の座標はSkeleton属性から書き出す(ノードである必要がないため)

Material
   ・Ambinet, Diffuse, Emission, Specularなどを書き出す(Blenderにないデータは0で埋めて書き出す)
   ・未使用のマテリアルを含む全てのデータを書き出す(手抜き
   ・テクスチャスロットは8個まで
   ・固定機能シェーダーには未対応
   ・PBRも未対応

Camera
   ・FoV, Near, Farなどを書き出す
   ・Transformは、Node属性から書き出す

Lamp
   ・Point, Spot, Hemi(Directional扱い)の書き出しに対応
   ・Transformは、Node属性から書き出す

Node
   ・オブジェクト名やTransformなど、オブジェクトの基本情報を書き出す
   ・ノードは、ツリー構造ではなく親と子の名前だけを書き出す
   ・メッシュはマテリアルによる分割の後にノード化される
   ・シェイプキーは暫定でノード扱い、メッシュと同様に分割後のノード化
   ・3DText、Curve、Emptyには未対応(対応予定あり)
   ・Selected or全てのシーンオブジェクトを書き出す(未対応オブジェクトは除外される)

Skeleton
   ・LeafBone座標、CollisionShapeMesh、IK制御データなどを書き出す
   ・Armatureと存在的に似ていますが、あっちはノードだけど、こっちはただのデータという違いもある

Image
   ・Materialのテクスチャスロットに関係なくBlenderが持つ全画像を吐き出す(手抜き
   ・画像データの埋め込みには未対応
   ・よって埋め込み画像を使う(ファイルパスを持たない)データ全般に未対応




細かい部分はだいぶ省略しましたが、こんな感じで作っています。
データのフォーマットはバイナリを採用しています。このバイナリは、Pythonの辞書とC++の列挙型に定義したマップを使って構造化されたデータを扱えるようになっています。これによりバイナリデータへの高速なランダムアクセスが可能になっています。また読めないバイナリを扱う上では文字通り地図としても使えるので、インポータの作成が非常に楽ちんでした。
フォーマットの特徴としては、高度なアニメーション機能のためのデータを扱っていることです。それ以外はFBXやglTFを目指している普通のフォーマットです。といっても仕様はいろいろオカシイですが、そのほとんどはデバッグを簡単にするための仕様です。データが動いたら少しずつ直して行くつもりです。



・進捗

先日、2回目のテストを行いまして、前回失敗に終わったメッシュの描画に成功しました。
続けてUVやマテリアルなどもテストしましたが、これも正常に描画されたことを確認しています。

テストで使用したメッシュの構成は以下のようになっています。

・単一メッシュ(スザンヌ1個
・複数のメッシュ(スザンヌ2〜5個程度
・マルチマテリアルメッシュ(3種類のマテリアルがAssignされたスザンヌ
・単一シェイプキー(スザンヌ1個 * シェイプ1個
・複数のシェイプキー(スザンヌ1個 * シェイプ3個
・複数のメッシュ+複数のシェイプキー(スザンヌ2個 * シェイプ3個
・複数のメッシュ+複数のマテリアル+複数のシェイプキー(スザンヌ3個 * マテリアル3個 * シェイプ3個


主にこういった構成で正常に描画できることを確認しています。ノードのツリー構造が複雑だったり、メッシュがスキニングデータを持ってたりすると描画できないこともありましたが、まあそれは今回のテスト範囲外の不具合で、剛体メッシュ単体(シェイプも剛体扱い)としては成功と見て良さそうな結果でした。

現在はノードからシーングラフを作成する処理のテストを行っていて、ファイルからノードを読み込んでシーングラフを作成し、それを再帰関数で回すという基本的な部分のテストには成功しています。ただ、一部のノードで子ノードの作り方に問題があったため、現在はBlenderエクスポータに戻ってそれの修正をしています。


今回は以上です。次回はアニメーションのテストが終わりしだい進捗を上げる予定です。
では。
posted by gency at 00:20| Comment(0) | 3DProgramming