>   >  痴山紘史の日本CG見聞録:第4回:USDシーンの作成
第4回:USDシーンの作成

第4回:USDシーンの作成

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月を予定しております。

プロフィール

  • 痴山紘史
    日本CGサービス(JCGS) 代表

    大学卒業後、株式会社IMAGICA入社。放送局向けリアルタイムCGシステムの構築・運用に携わる。その後、株式会社リンクス・デジワークスにて映画・ゲームなどの映像制作に携わる。2010年独立、現職。映像制作プロダクション向けのパイプラインの開発と提供を行なっている。新人パパ。娘かわいい。
    @chiyama

その他の連載