CG, KATANA

アセット読み込みテンプレートの作成

※エイヤッと記事にはしたものの、どうもこの方法でショットシーンを作ることは無さそうです。まあテクニックの一つとしてこんなこともできるんだ的な感じということで;;;

ショットシーンを構築する際、一つ一つ手でアセット読み込み用のノードグラフを作ってファイルを読んで。。。とやっていたら大変すぎます。そこで、アセット読み込み用のテンプレートを用意し、スクリプトを使ってアセットの読み込みをできるようにします。

KATANA の場合、Alembic ファイルを読み込んだり LookFile をアサインするといった定例処理をノードとして組むので、CG ソフトのように Export Selection と Import や Merge をやる方法では対応できなさそうです。このあたりは 3DCG ツールというよりも Nuke のようなコンポジットソフトに感覚が近いです。

さてどうするかな。。。。と調べていたら、ノードの情報を XML 形式で入出力できるようです。これがきちんと動くなら、使えそうです。

まずは元になるノードグラフを作成します。今回はターンテーブル作成に使用したものを使います。

この、Alembic_In, LookFileAssign, LookFileResolve を使用します。

Python タブで以下のコードを実行すると、/home/chiyama/Documents/katanta/scene_build/template.xml に上記三つのノード情報が格納されたファイルが作成されます。

from Katana import NodegraphAPI
nodes = [NodegraphAPI.GetNode('Alembic_In'),
         NodegraphAPI.GetNode('LookFileAssign'),
         NodegraphAPI.GetNode('LookFileResolve')]

xmlNode = NodegraphAPI.BuildNodesXmlIO(nodes)

fp = open('/home/chiyama/Documents/katanta/scene_build/template.xml', 'w')
fp.write(xmlNode.writeString())
fp.close()

試しにこのファイルをそのまま使ってシーンにノードを作ってみます。空のシーンで

fp = open('/home/chiyama/Documents/katanta/scene_build/template.xml', 'r')
xmlData = fp.read()
fp.close()

xmlNode, result = NodegraphAPI.LoadElementsFromString(xmlData)
newNode = KatanaFile.Paste(xmlNode, NodegraphAPI.GetRootNode())[0]

と実行すると、見事にノードグラフが再現されました。

ここまでくればもう好きにやりたい放題です。

今回は以下のようなテンプレートファイルにしました。


<katana release="3.0v6" version="3.0.1.000002">
  <node name="__SAVE_exportedNodes" type="Group">
    <node baseType="Alembic_In" name="%(NAMESPACE)s_Alembic_In" selected="true" type="Alembic_In" x="413.984309" y="-302.346567">
      <port name="out" type="out"/>
      <group_parameter name="%(NAMESPACE)s_Alembic_In">
        <string_parameter name="name" useNodeDefault="false" value="/root/world/geo/%(NAMESPACE)s"/>
        <string_parameter name="abcAsset" useNodeDefault="false" value="%(ABC_FILE)s"/>
        <number_parameter name="addForceExpand" value="1"/>
        <string_parameter name="addBounds" value="root"/>
        <number_parameter name="fps" value="24"/>
        <number_parameter name="addToCameraList" value="0"/>
        <group_parameter name="timing">
          <string_parameter name="mode" value="Current Frame"/>
          <number_parameter expression="globals.inTime" isexpression="true" name="holdTime"/>
          <number_parameter expression="globals.inTime" isexpression="true" name="inTime"/>
          <number_parameter expression="globals.outTime" isexpression="true" name="outTime"/>
        </group_parameter>
        <group_parameter name="advanced">
          <number_parameter name="useOnlyShutterOpenCloseTimes" value="0"/>
        </group_parameter>
      </group_parameter>
    </node>
    <node baseType="GenericAssign" name="%(NAMESPACE)s_LookFileAssign" selected="true" type="LookFileAssign" x="413.084537" y="-370.293177">
      <port name="input" source="%(NAMESPACE)s_Alembic_In.out" type="in"/>
      <port name="out" type="out"/>
      <group_parameter name="LookFileAssign">
        <string_parameter name="CEL" value="(/root/world/geo/%(NAMESPACE)s)"/>
        <string_parameter name="location" value=""/>
        <group_parameter name="args">
          <group_parameter name="lookfile">
            <group_parameter name="asset">
              <number_parameter name="enable" value="1"/>
              <string_parameter name="value" value="%(KLF_FILE)s"/>
              <string_parameter name="default" value=""/>
              <string_parameter name="type" value="StringAttr"/>
            </group_parameter>
          </group_parameter>
        </group_parameter>
      </group_parameter>
    </node>
    <node baseType="LookFileResolve" name="%(NAMESPACE)s_LookFileResolve" selected="true" type="LookFileResolve" x="413.084529" y="-420.346567">
      <port name="A" source="%(NAMESPACE)s_LookFileAssign.out" type="in"/>
      <port name="out" type="out"/>
      <group_parameter name="LookFileResolve">
        <string_parameter name="passName" value=""/>
      </group_parameter>
    </node>
  </node>
</katana>

そして、以下のコードを実行します。

fp = open('/home/chiyama/Documents/katanta/scene_build/template.xml', 'r')
xmlTemplate = fp.read()
fp.close()

xmlData = xmlTemplate % {'NAMESPACE' : 'foobar',
                         'ABC_FILE' : '/home/chiyama/Documents/usdtest/assets/Zombie_OnFire_2B.abc',
                         'KLF_FILE' : '/home/chiyama/Documents/katanta/lookdev/zombie_on_fire.klf'}

xmlNode, result = NodegraphAPI.LoadElementsFromString(xmlData)
newNode = KatanaFile.Paste(xmlNode, NodegraphAPI.GetRootNode())[0]

できたノードグラフはこちら。

これで、ネームスペースと .abc ファイル、.klf ファイルを指定してアセットを読み込むことができるようになりました。これを使えば Katana 上でショットシーンを自動生成することはできそうです(これが一般的な方法かはわからないのですが)。

アセット読み込みテンプレートの作成”への1件のコメント

  1. とりあえずエイヤッ!!と作ってみたものの、どうもこんな泥臭い方法はとらなさそうな予感が。デスヨネー

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です