概要
我々は、パイプラインやツールに制作環境を縛られることが無いように、ポータブルなアセットパッケージフォーマットを定義した。各スタジオはこのポータブルなパッケージを介してアセットの共有をおこなうことで、使い慣れたワークフローでプロジェクトを進めつつ、スタジオ間で簡単にアセットの共有をおこなうことができる。
アセットパッケージの仕様
zip 化されたパッケージファイル
パブリッシュされたリビジョンデータは一つの zip ファイルにまとめられる。 この zip ファイルの中にはアセットを構成する .ma/.mb, テクスチャ、ジオメトリキャッシュといったファイルが全て格納されている。
リファレンスされているアセットはこのパッケージの中に含まれない。 リファレンスされているものは既に別のアセットのリビジョンとしてパブリッシュされているため、必要であれば別のアセットパッケージとして扱われるためである。 そのような場合、後述する metadata.json 中に依存関係のあるアセットとして記録される。
zip 化されたファイル名に関しては特に決まりは無いため、自由に決めてよい。
zip ファイルの内容
zip ファイルには以下の内容が含まれる:
- metadata.json
- パブリッシュされたアセットデータ(.ma/.mb, texture, geometry cache, など)
zip の中は revXXX ディレクトリ以下の相対パスになっている。たとえば
rev001 +satoHero.ma +textures +image001.exr
という構成のファイルがあった場合、
test.zip +metadata.json ← メタデータを格納した JSON ファイル +satoHero.ma +textures +image001.exr
という構成になる。
JSON ファイル
エクスポート時に一緒に出力される JSON ファイルには、アセット管理ライブラリから可能な限り取得できる情報が格納されている。
JSON ファイルの例 ※JSON ファイル中のコメントは解説のために付加したものである。
/* アセットメタデータサンプル 我々はパブリッシュされたリビジョンをアセットの最小単位として管理している。 エクスポータは各リビジョン毎にメタデータを出力する。 */ { /* Data セクションはアセットのリビジョン情報とエクスポート情報を記述する。 我々のエクスポータは以下の情報を出力する: "assetGroupPath" : アセットグループパス (必須) "revisionGroupPath" : リビジョングループパス (必須) "revision" : リビジョン番号 (必須) "projectName" : プロジェクト名 (オプション) "tag" : タグ名 (オプション) "exportTime" : エクスポート日時 (オプション) "userName" : エクスポートしたユーザー名 (オプション) エクスポータは必要に応じて上記以外の値を含めることができる。 assetGroupPath と revisionGroupPath はアセット管理を行うための論理パスである。 我々はアセットを三階層 + "assets" グループの計四階層で管理をおこなっている。 例えば、"シンジ" というキャラクタがいたとする。シンジは制服姿や部屋着など、いくつかの バリエーションが存在する。このような場合、シンジを管理する階層は以下のようになる: assets +human +shinji +schoolUniform +loungewear この時、それぞれの論理パスは 'assets/human/shinji/schoolUniform' と 'assets/human/shinji/loungewear' になる。 また、各アセットには model, rig, lookdev といったパイプラインフェーズと各フェーズの中で 管理されるバリエーションが存在する。revisionGroupPath はこの階層を表現する。 例えば、以下の三つのパイプラインステップがあったとする。 model, rig, lookdev そして、model と rig では以下のバリエーションが存在するとする。 animationLow, renderHigh lookdev は以下のバリエーションが存在するとする。 normal この場合、それぞれの revisionGroup パスは以下のようになる: model/animationLow model/renderHigh rig/animationLow rig/renderHigh lookdev/normal assetGroupPath, revisionGroupPath と revision の組み合わせはプロジェクト内で ユニークなものとなる。 ノート : 我々は、これらの論理パスを用いて以下のような方法で物理的なパスを生成する: os.path.join(PROJECT_ROOT, assetGroupPath, 'publish', revisionGroupPath, 'rev%03d' % rev) ノート : ショットでもアセットと同様の階層構造を採用している。ショットのグループネームは "shots" である。 ショットの assetGroupPath や revisionGroupPath は以下のようになる: assetGroupPath : 'shots/ep001/sq001/sh001' revisionGruopPath : 'animation/shinji_00' */ "data":{ "assetGroupPath":"assets/furniture/lamp/lampGray", "exportTime":"2016-02-02 16:40:07.124000", "projectName":"testXML", "revision":"1", "revisionGroupPath":"rig/RenderHigh", "tag":"", "userName":"chiyama" }, /* Dependency セクションは、アセットやショットを構成するために必要な外部のアセットを記述する。 我々のエクスポータは以下のデータを出力する: "assetGroupPath" : アセットグループパス (Data セクションで記述したものと同様) (必須) "revisionGroupPath" : リビジョングループパス (Data セクションで記述したものと同様) (必須) "revision" : リビジョン番号 (Data セクションで記述したものと同様) (必須) "active" : リビジョンがデフォルトで使用されるものであれば true (オプション) "comment" : コメント (オプション) "online" : エクスポート時、ストレージ上に存在していたか (オプション) "tag" : タグ名 (オプション) 上記以外のオプションも必要に応じて含めることができる。 */ "dependency":[ { "active":true, "assetGroupPath":"assets/test/simple/Sphere", "comment":"", "online":"Yes", "revision":"36", "revisionGroupPath":"lookdev/test", "tag":"" }, { "active":true, "assetGroupPath":"assets/test/simple/Sphere", "comment":"", "online":"Yes", "revision":"25", "revisionGroupPath":"rig/test", "tag":"" }, { "active":true, "assetGroupPath":"assets/test/simple/Sphere", "comment":"", "online":"Yes", "revision":"28", "revisionGroupPath":"shaderLink/test", "tag":"" }, ], /* Metadata セクションはリビジョンのメタデータを記述する。 */ "metadata":[ { "data":"http://www.turbosquid.com/3d-models/free-rig-3d-model/891648", "name":"message", "type":"text" } ], /* revisionFiles describes revision related file info. Our exporter export these data for each file: "path" : アセットアーカイブ内での相対パス (必須) "hash" : ファイルのハッシュ値(オプション) "id" : アセット管理ライブラリで管理している ID (オプション) "size" : ファイルサイズ (オプション) "srcPath" : パブリッシュ元になったファイルパス (オプション) 上記以外のオプションも必要に応じて含めることができる。 シーンファイルは我々のディレクトリ構造に沿ったファイルパスが含まれている。インポート時にはメタデータを 用いて、適切にパスの変換を行う必要がある。 */ "revisionFiles":[ { "hash":"1814092 03856a554f964226dff4052342741ea8", "id":"4f4d05c65a4a3fb97891c63ff4b48612", "path":"lampGray.mb", "size":1814092, "srcPath":"D:/chiyama/tmp/JCGS/JCGS_160131/JCGSProject/testXML/assets/furniture/lamp/lampGray/work/chiyama/Rig/scenes/lampGray.ma" }, { "hash":"254123 638611a50dc3201f693165a60ea977bb", "id":"92c05de1381aaa7ea815c30948d48a98", "path":"textures/lamp_mask_and_self-illum.jpg", "size":254123, "srcPath":"D:/chiyama/Downloads/Gray_lamp/lamp_mask_and_self-illum.jpg" } ] }