game community summit 2015
TRANSCRIPT
3Dフォーマットの現状脱 FBXをどうやって実現するか?
UnityでMMDを動かす会 竹渕瑛一
GCS2015 Unity で MMD を動かす会 1
コミュニティの自己紹介• UnityでMMDを動かす会• その名の通り, UnityでMMDを動かす• MMD for Unityの開発がメイン
•開発は OSDN (旧 Source Forge)と GitHUBでやっています• http://osdn.jp/projects/mmd-for-unity/• http://mmd-for-unity-proj.github.io/mmd-for-unity/
GCS2015 Unity で MMD を動かす会 2
発表者の自己紹介•竹渕瑛一(@GRGSIBERIA)• 博士課程の学生です• 3DCGツール同士の融合をテーマに研究• 2013年度未踏に採択されてました
GCS2015 Unity で MMD を動かす会 3
MMD TransporterMMD for Unity
ニコニ立体でも使われてますhttp://3d.nicovideo.jp/works/td20818
発表の流れ•だいたい 3部構成• 各種フォーマットの背景• 各種フォーマットの問題点• 解決策の検討
GCS2015 Unity で MMD を動かす会 4
各種フォーマットの背景
GCS2015 Unity で MMD を動かす会 5
Autodesk FBX
• Autodesk社が提供しているフォーマット• 元は Filmbox(現Motion Builder)で使われていた• 1996年に Kaydara社が FBXを使いはじめる• 2004年に Kaydara社が Alias社に買収される• 2005年に FBX SDKがリリース• 2006年に Alias社が Autodeskに買収される
GCS2015 Unity で MMD を動かす会 6
実は意外と歴史のあるフォーマット
Autodesk FBX
•どのようなフォーマットか?• バイナリ /テキストで 3Dデータを表す• 1つのファイルで様々なデータを扱える
• 2005年当時は, DirectX9.0全盛期• スキニングを扱えるフォーマットは Xファイルしかない• それ以外は全部,自前のフォーマットが利用されていた
GCS2015 Unity で MMD を動かす会 7
当時を鑑みると大変革新的なフォーマット
Autodesk FBX
• FBX SDKとは?• FBXの書き出し /読み込みをするための開発キット• これがないと, FBXをほぼ扱うことができない• なぜか毎年バージョンアップしている
GCS2015 Unity で MMD を動かす会 8
MikuMikuDance
• 3種類のフォーマットがあります• PMD形式
• 古いMMDモデルデータ• コリジョンと頂点モーフがあります
• PMX形式• PMD形式を拡張したもの• コンストレインや UVモーフなどが扱えるようになる• 最近はこちらが多く使われている
• VMD形式• アニメーション用のデータ• 今でも使われている
GCS2015 Unity で MMD を動かす会 9
PMDで作られたミクさん
PMXで作られたミクさんhttp://blogs.yahoo.co.jp/fairlady432432/9181448.html
MikuMikuDance
MMD PMDE2008年 2月
2012年 7月
MMDの初版リリース8月
12月
2009年 9月
2011年 3月4月7月
PMD形式の初出PMDEの初版リリース
PMDの編集に必要な機能が全て実装
PMXの実装が開始されるPMDの開発完了PMXに初めて対応
PMXの機能 FIX版がリリースされる
GCS2015 Unity で MMD を動かす会 10
MikuMikuDance
• PMD/PMXの特徴• 固定長のバイナリフォーマット• MMDで動くことが大前提
• 座標系や単位系などがあらかじめ決まっている• MMDとの互換性を考える必要がある
• PMXでリグのセットアップができる• MMDでは,多段ボーンと呼ばれている• 要するにコンストレインが使える
GCS2015 Unity で MMD を動かす会 11
各種フォーマットまとめFBX PMD PMX VMD
ジオメトリ ○ ○ ○
マテリアル ○ ○ ○
スキニング ○ ○ ○
頂点モーフ ○ ○ ○
コリジョン ○ ○
コンストレイン
○
アニメーション
○ ○
GCS2015 Unity で MMD を動かす会 12
ちょっとずつ機能が豪華に
各種フォーマットの問題点
GCS2015 Unity で MMD を動かす会 13
FBXの問題点• BlenderからMayaにデータを納品するぞ!
GCS2015 Unity で MMD を動かす会 14
Armatureがグチャグチャになる
FBXの問題点•実は Blender側の事情が……• ライセンスの関係で FBX SDKが使えない• 仕方ないので有志が解析して FBXを再現している• でも,Motion Builderや Cinema4Dはうまく読める
GCS2015 Unity で MMD を動かす会 15
ツールに関係なくトラブルが発生しやすい
FBXの問題点• SDKがほぼ毎年更新される• SDK 2008• SDK 2010.2• SDK 2010.10• SDK 2012• SDK 2013• SDK 2014• SDK 2015• SDK 2016
GCS2015 Unity で MMD を動かす会 16
FBXの問題点• SDKのバージョンによって相性がある• 例えば,
• Lightwaveで Unityアセット作るときは SDK 2010で書き出す
• BlenderとMayaは相性が根本的に悪い• Motion Builderは公式だけにゆとりがある
GCS2015 Unity で MMD を動かす会 17
失敗しないとわからない
FBXの問題点•ツール側でちゃんと実装されてない• FBXの 100%の基準で正しく実装されてない
GCS2015 Unity で MMD を動かす会 18
Max60%
Maya70%
Blender30%
30%のデータしか移行できない10%損失する
FBXの問題点•ライセンスが厳しい• オープンソース禁止• 静的ライブラリ禁止• 指定箇所で FBX SDKを宣伝• サンプルコード公開禁止• リバース・エンジニアリング禁止• 登録者以外, APIの使用禁止• 迂回利用の禁止
• ライセンス違反を回避するため,他の方法で実装を試みること
GCS2015 Unity で MMD を動かす会 19
大杉
PMXの問題点• PMXは最強なのか?• 後方互換性が高い• FBXよりも機能が豊富• フォーマットも公開されている
GCS2015 Unity で MMD を動かす会 20
実はエディタとフォーマットの商用利用が禁止されている
問題ほぼコレだけ
問題点のまとめ• 2種類の普及しているフォーマットを検討• ライセンスが厳しい(共通)• SDKのバージョンによっては相性問題が起こる• ツール側の実装がうまくいかない
GCS2015 Unity で MMD を動かす会 21
なるべくコレらを解消することでデータ交換が凄くやりやすくなるのでは?
解決策の検討
GCS2015 Unity で MMD を動かす会 22
解決策を検討しています
GCS2015 Unity で MMD を動かす会 23
フォーマットの機能要件• Fixed Model Data( .fmd)• 現在, GitHUBで開発中
• クラス設計等を JSONで行っています• https://github.com/GRGSIBERIA/FixedModelData• 現在は fmd-compilerで作業中
• Fixed(固定された)• 単位系の狂いを少なくしたい• いろいろなツールで使えるようにしたい
GCS2015 Unity で MMD を動かす会 24
フォーマットの機能要件•なぜ作ろうと思ったのか?• FBXの互換性の問題• 緩いライセンスで使いたい• 開発しやすいフォーマットが欲しい
GCS2015 Unity で MMD を動かす会 25
フォーマットの機能要件•開発しやすいとは,• 使う側の意図を反映させる
GCS2015 Unity で MMD を動かす会 26
想定ユーザ代表ツール開発者
読み込みと書き込みが保証されて欲しい
バージョン・アップで再実装する手間がない
フォーマットの全てを実装しなくてもいい
フォーマットの機能要件•読み込みと書き込みの保証• FBXの場合ではどうなったか?
GCS2015 Unity で MMD を動かす会 27
Aツール BツールFBX
書き出し 読み込み
フォーマットの機能要件•読み込みと書き込みの保証• データが壊れずに,交換できるようになって欲しい
GCS2015 Unity で MMD を動かす会 28
Aツール BツールFMD
書き出し 読み込み
Aツールと Bツールで同じ見え方になっていて欲しい
フォーマットの機能要件•バージョン・アップで再実装する手間がない• FBX SDKは,更新するたびに対応する手間がある
GCS2015 Unity で MMD を動かす会 29
FBX SDK2008
FBX SDK2009
FBX SDK2010
FBX SDK2011
FBX SDK2012
FBX SDK2013
FBX SDK2014
FBX SDK2015
FBX SDK2016
1年に2回更新することもあるよ
フォーマットの機能要件•バージョン・アップで再実装する手間がない• 更新されても無視したって問題ない
GCS2015 Unity で MMD を動かす会 30
ばーじょんたくさんあるよ! 見かけ上
一つのバージョン
フォーマットの仕様
フォーマットの機能要件•フォーマットの全てを実装できなくてもいい• 全部実装できてないとか言われる心配がない
GCS2015 Unity で MMD を動かす会 31
開発者
モデルビュワーを作りたい
ジオメトリ
ジオメトリだけインポートする
剛体
スキニング
多言語対応
許される
フォーマットの機能要件•データのバリデーション(おまけ)• Aツールで作ったファイルが中途半端で読み込めない• Aツールが Zアップ使うせいでモデルが寝てしまう• Aツールの回転順が ZYXで(ry
GCS2015 Unity で MMD を動かす会 32
書き出し時にデータの検証を走らせて検証に通らないと書き出しができない
フォーマットの実装
GCS2015 Unity で MMD を動かす会 33
ヘッダ
ボディ(圧縮JSON)
モデルデータのメタ情報
モデルデータの本体
•圧縮した JSONがベース
フォーマットの実装• JSONとは,• テキストベースで連想配列を表現するための表記法• JavaScript由来で, XMLの遠い親戚
GCS2015 Unity で MMD を動かす会 34
{ “yamada”: { “money”: 100, “name”: “tarou” }, “suzuki”: { “money”: 500, “name”: “takashi” }}
山田(太郎)君は100円持っている
フォーマットの実装•ヘッダ情報• ファイルの概要やメタ情報を示すための部分• これも JSONで表現• メタ情報の例
• 著作者• モデル名• 暗号化鍵(公開鍵方式)• データ本体のハッシュ値• ライセンスなどなど
GCS2015 Unity で MMD を動かす会 35
データが盗まれるのを
ある程度は防ぎたい
フォーマットの実装•ボディ(データ本体)• JSONを使う理由
• JSONを解釈できる言語がとても多い• データを簡単に扱うことができる• Webサーバで標準的に使われている
GCS2015 Unity で MMD を動かす会 36
バイナリデータを直接扱うとちょっと読み取りたい時に手間がかかる
ライブラリの実装•なるべく多言語対応やりたい• しかし,全部手塩をかけると膨大な量になる• テストとバリデーションで地獄を見てしまう
GCS2015 Unity で MMD を動かす会 37
JSONでクラス定義書いて全部自動生成してみよう
ライブラリの実装•実現する方法• 構文機を作って自動生成
GCS2015 Unity で MMD を動かす会 38
JSONクラス定義
C++
Ruby
Python
JavaScript
C#
Ruby
C++構文機
Ruby構文機
Python構文機
JavaScript構文機
C#構文機
テストとバリデーションも自動生成するので多言語への対応の手間を削減
ライブラリの実装• JSONクラス定義• 定義の詳細については下記のところで
• ただし,ブランチがコロコロ変わるかも……• https://github.com/GRGSIBERIA/FixedModelData/tree/fmd-co
mpiler/lib/template• もし,興味のある人がいましたら,チャンクの定義等をレビューしていただけると幸いです
GCS2015 Unity で MMD を動かす会 39
ライブラリの実装• JSONのクラス定義の例
GCS2015 Unity で MMD を動かす会 40
"Vertex": { "comment": "頂点を表すクラス ", "variables": { "position": { "type": "UnitVector3", "comment": "頂点座標の位置 " } } },
# 頂点を表すクラスclass Vertex < ChunkBase # 頂点座標の位置 def position @position end
def initialize(json) # コンストラクタ @position = UnitVector3.new(json) endend
自動生成
今後の展望•最初にMaya, Unityの順番で対応• 自分が一番使っているツールなので• Max, Blender等々は有志の人らでお願いします……
• PMD, PMXの読み込みと書き出しに対応
GCS2015 Unity で MMD を動かす会 41
本日のまとめ• FBXと PMXの問題点を提示• FBX
• バージョンが多すぎて互換性がない• ツールごとに実装のばらつきがある• SDKのライセンスがキツく,開発者が使いづらい
• PMX• 基本的に商用利用不可
GCS2015 Unity で MMD を動かす会 42
本日のまとめ•解決方法• 互換性を解消する• ライブラリのライセンスを緩くする• 開発者的に使いやすいライブラリを提供する
• 多プログラミング言語対応• データのほとんどを JSONで管理する• 読み込みと書き込みの保証• バージョンの隠蔽• バリデーションとテストがちゃんとできる
GCS2015 Unity で MMD を動かす会 43
ご清聴ありがとうございました
GCS2015 Unity で MMD を動かす会 44
質疑応答
GCS2015 Unity で MMD を動かす会 45