USDシーンを作成してみる
・レイアウト
用意した.abcファイルをリファレンスしてMaya上でレイアウトします。これは通常のMayaでの作業と変わらないです。
・MayaからUSDファイルを出力する
USD Mayaプラグインを使用するとMayaから簡単にUSDファイルを出力できます。ただ、この方法だとリファレンスしたabcファイルの内容も丸々入った形式でしか出力できないようです。特に何も考えなくても別のアプリケーションにデータをもっていけるので楽といえば楽なのですが、せっかく分けて作成したアセットを活用できないので、パイプラインに組み込むときは各自自前の出力ツールを作成するのがよさそうです。
ということでつくってみましょう。今回は単純な例なので、以下の2つが出力できればシーンは再現できます。
- ・リファレンスしているabcファイル
- ・トップノードの位置情報
このあたりは前回使用したKitchen_setやUSDのドキュメント、それからチュートリアルを参考にしながらスクリプトを書いていきます。
最終的に以下のようになりました。
$ cat exportLayout.py
usdtmpl = r'''
#usda 1.0
def Xform "World" (
kind = "assembly"
)
{
%s
}
'''
nodetmpl = r'''
def Xform "%(name)s" (
references = @%(path)s@
)
{
double3 xformOp:translate = %(trs)s
float3 xformOp:rotateXYZ = %(rot)s
float3 xformOp:scale = %(scl)s
uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ", "xformOp:scale"]
}
'''
import maya.cmds as cmds
nodes = []
for r in cmds.ls(type='reference'):
if r == 'sharedReferenceNode':
continue
fn = cmds.referenceQuery(r, filename=True)
ns = cmds.referenceQuery(r, namespace=True)[1:]
path = cmds.referenceQuery(r, filename=True, withoutCopyNumber=True)
root = cmds.ls('%s:*_root' % ns)
trs = cmds.getAttr('%s.translate' % root[0])[0]
rot = cmds.getAttr('%s.rotate' % root[0])[0]
scl = cmds.getAttr('%s.scale' % root[0])[0]
nodes.append(nodetmpl % {'name' : ns,
'path' : path,
'trs' : trs,
'rot' : rot,
'scl' : scl})
fp = open(r'/home/chiyama/Documents/usdtest/assets/layout.usd', 'w')
fp.write(usdtmpl % '\n'.join(nodes))
fp.close()
$
これをMaya上で実行すると、リファレンスしているアセットとそのトップノードの位置情報を含んだ.usdファイルを生成します。このようにすることで、Maya USDプラグインを使用すると百数十MBになってしまったショットデータのサイズを、数KBに抑えることができました。
出力したシーンをusdviewで確認してみます。
無事に再現されているようです。各アセットもきちんと外部の.usdファイルがリファレンスされています。このようにアセットがリファレンスされていると、このシーンを元にライティングやレンダリングを行なっている間にも、ほかの人がアセットをどんどん更新できます。
ちなみに、この.usdファイルをMayaでリファレンスすることもできます。この場合、各アセットはリファレンスのリファレンスになるわけではなく、シーン全体がひとつのリファレンスとして扱われるようです。インポートも同様で、各アセットもインポートされます。
前述のように、今回の記事でもusdviewを多用しています。使用してみるとわかるのですが、このツールは本当に頼れる相棒という感じです。何かデータに疑問があったら、とりあえずこれで開いて確認するという使い方を頻繁にしています。特に自分でエクスポータを書くような場合は、usdviewを使うことで格段に効率がよくなります。
次回予告
次回は出力したシーンのライティングやレンダリングを行なっていきます。これが終われば、USDを使用したワークフローを最初から最後まで一通り体験したことになります。ここで使用するのはImage Engineが開発・使用しているオープンソースのlookdev/lightingツールのGafferです。Gaffer は『キングスグレイブ ファイナルファンタジーXV』の記事でも取り上げられている、非常に強力なツールです。
第5回の公開は、2018年10月を予定しております。
プロフィール