作者別: chiyama

CG, USD

USD Maya plugin でできること・概要

Maya での USD 対応についてこれまで大きな勘違いをしていたので、改めてまとめます。ここでは USD のアーキテクチャというより、実際の実装として何ができるのかに注目をします。

PIXAR 標準の USD プラグインでは、様々な方法で USD シーンファイルを Maya に読み込むことができます。

・Import(Open)
・Reference
・Scene Assembly

上の二つの方法で読み込んだ場合、結局は Maya のシーンデータとして扱うだけで、幾ら .usd ファイル内でアセットが分割して管理されていても Maya 上では巨大な一つのファイルを扱っているのと変わりがありません。そのため、Maya では .usd ファイルの入出力はできるけれども一番美味しいところは実質的に使えないのかなと思って調査を打ち切ってしまいました。

つまり、シーンファイルとして読めて必要な情報は再現できるけれども、その情報を保持したまま出力することができないという勘違いをしてしまったわけです。

最も重要だったのは Scene Assembly として読み込むことができることでした。Scene Assembly を用いることで、必要のない時はアセットを一つのノードとして扱うことができ、内部を編集したい場合は展開して操作することができます。

これを用いることで複数の .usd ファイルを読み込んで複雑なアセットを構築し、その構造を維持したまま .usd ファイルとして出力することができます。
少なくとも、この点に関しては Maya+USD で実現できるということになります。そのため、Maya で USD の恩恵を受けることができないというのは誤りです。非常に大きな恩恵を受けることが出来そうです。

Maya+USD を使ってトータルでどのようなことができるかは “05 USD at ALA – Pixar USD Maya plugin” を見るのが早そうです。こちらは Animal Logic の AL_USDMaya と luma pictures の Outliner(usd-qt?) を使用したフローの解説になるため今回使用した純正の実装とはまた別ですが、Maya 上でこんなことができるんだという参考になるかとおもいます。

※こちらは PIXAR 純正の USD Maya プラグインを使用した例でした。。。AL_USDMaya と outliner を使用した例は AL_USDMaya Layout and Animation Workflow でした。訂正記事中で訂正をおこなうという失態、、、、もうダメだ。。。(´・ω・`)

CG

“USDって結局何なのよ?”の内容に大きな誤りがあるかもしれません

(追記)訂正記事を書きました。やはり私の勘違いで、Maya でもかなりの恩恵を享受できそうです

先日、”USDって結局何なのよ?” にて USD の概要についてご説明したのですが、ここでとても重大な間違いがあるかもしれないことに気づきました。まだ詳しく内容を確認していないので今後確認をしてまとめていきますが、

USD という基盤技術を使うことでコンカレントパイプラインを構築することができますよということでプレゼンでもかなり力を入れて説明がされるところなのですが、残念なことに

通常、我々はそのまま享受することはできません。

(中略)

PIXAR は自社で Presto を開発して対応していますし、AnimalLogic は AL_USDMaya を開発して Maya 上で対応しています。コンカレントパイプラインという思想を実現するための強力な基盤技術として USD を使用するのです。

この部分、特に Maya 対応に関して私が根本的な勘違いをしていて、全く事実と異なる内容を書いていた可能性が高いです。この部分が間違っていると Maya における USD の実用性に対して全く違う結論が出てしまうので、改めて調査をして記事にまとめていきます。

そのため、この部分の判断については一旦白紙とし、保留していただけるようお願いします。

CG, KATANA

Live Render とオブジェクトの選択

KATANA では、膨大なデータを極力読み込まずに作業をすることでオペレーションを軽快におこなうことができるような造りになっています。

そのため、 Scene Graph を展開しても最後のジオメトリになるまでは Viewer 上でもバウンディングボックス表示のままになっていたりします。

ただ、これだと自分が操作したいオブジェクトがどこにあるかわかりません。それを知るためには結局全データを読み込んで確認しなければいけないんじゃ。。。?と思ってしまいそうですが、これに対する答えもきちんと用意されています。

その答えというのが、レンダリングした画像からオブジェクトをピックするという方法です。

まず、レンダリングしたいノード上で右クリック→ Live Render を選びます。

Live Render モードの時は、カメラやライト、カレントフレームなどを変更するとインタラクティブにレンダリング結果が更新されるモードになります。注意点として、変更全てに対して即座に反映されるわけではないことです。たとえばシェーダの値を更新したとしても Viewer には反映されません。

この Live Render モードの時、 Monitor には十字のカーソルが表示されます。このカーソルを移動すると、カーソル位置にあるオブジェクトの名前が表示されます。

ここで、オブジェクト名左の矢印アイコンをクリックして Select in Scene Graph を選びます。

すると、Scene Graph がそのオブジェクトまで展開されて選択されます。Scene Graph が展開されると、そのツリーのオブジェクトが Viewer にも表示されます。

このようにして、全てのデータを読み込まなくてもレンダリングした画像から自分が必要としているオブジェクトを選ぶことができます。

もちろん、このような方法を使わずにデータを全て読み込んでそこから選ぶ方法を取ることもできますが、想像力とツールの力を生かして操作をおこなうことで段違いの生産性を発揮することができるでしょう。

CG, KATANA

VariableSwitch

ショットの作成をする場合、異なるショット(カット)でも、一連の流れの中ではほとんど同じ設定で映像を構築します。このようなときにファイルをショット毎に分けて管理してしまうと、途中で設定を変更したときに全てのファイルを間違いなく更新するのはとても大変な作業になってしまいます。

KATANA では、大元になる設定を作ってからショット毎に調整が必要な部分だけ分岐することで、一つの .katana ファイル中で関連する複数のショットを作成することができるようになっています。

こうすることで、大元の設定が変わった場合でも一か所を変更するだけで対応でき、かつショット毎の細かい調整もおこなうことができます。

これを可能にするのが VariableSwitch ノードです。

まず、VariableSwitch ノードを作成して variableName を shot にし、patterns を三つ作成してそれぞれ 10, 20, 30 とします。

更に、カメラを三つ作成してそれぞれを VariableSwitch に接続します。

続いて、Project Settings タブ中の variables で先ほど作成したのと同名(shot)の変数を variables に追加します。

これで、shot 10, 20, 30 のカメラを一つのシーン中で切り替える準備ができました。

カメラを切り替えるには先ほどの Project Settings タブ中でもできますが、メインメニューにも値が表示されているため、ここで切り替えることもできます。

ここをクリックすると値をセットするための GUI が表示されます。最初は値の部分は空なので手で入力する必要がありますが、一度入力した値はプルダウンメニューから選ぶことができます。

このようにして作成したシーンで値を切り替えてみます。

このように、variable の shot の値を変えることで使用するカメラを切り替えることができます。

CG, KATANA

LiveGroup

Maya で言うリファレンスのように別に作成されたデータを読み込んでシーンを構築する方法が KATANA にもあります。これを LiveGroup と言います。

LiveGroup を使用するには、まずノードをグループ化します。グループ化したいノードを選んで ‘g’ キーを押すと Group が作成されます。

続いて、グループを LiveGroup 化します。これはグループ上で右クリック→Convert to LiveGroup でできます。

こうすると、アイコンに雷マークがつきます。この LiveGroup 化したノードをファイルに出力します。ノードの上で右クリック→Publish で出力できます。

この時出力されたファイルは .livegroup という拡張子になり、通常の .katana とは分けて考えられます。

このファイルを使用してシーンを構築します。LiveGroup の読み込みは File メニューから Import LiveGroup でおこなえます。

その他必要なノードを構築します。LiveGroup は Group とほとんど同じですが、中のノードがロックされています。

ここで、元のシーンに Teapot を追加して再度 Publish します。

そして、LiveGroup を読み込んでいるシーンで Reload をします。

無事に LiveGroup の内容が更新されました。

このように、アセット作成や Lookdev、アニメーション作成やライティングといった作業フェーズ毎にファイルを分け、成果物を .livegroup ファイルとして出力することで一つの最終シーンをあたかも複数人が同時に更新をおこなっているかのようなパイプラインを組むことができます。

CG, KATANA

XMLファイルを使ってショットシーンを構築する

Importomatic ノードで XML ファイル経由でアセットを読み込むことができたので、もう少し複雑なシーンも構築してみます。

使用するネタは CGWorld.jp の記事で使用したシーンです。この時は USD 形式でき出力しましたが、やることはまあ同じなので何となくパラメータを読み替えつつ XML ファイルで出力するようにします。


xml_tmpl = r'''
<scenegraphXml name="Zombie_OnFire" version="0.1.0">
  <!-- channelData startFrame="1" endFrame="10" 
      ref="/tmp/myChannelData" / -->
  <instanceList>
    %s
  </instanceList>
</scenegraphXml>
'''

instance_tmpl = r'''
    <instance type="reference" name="%(name)s" refType="abc" refFile="%(path)s">
      <xform value="%(xform)s"/>
    </instance>
'''

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)
    xform = cmds.getAttr('%s.worldMatrix' % root[0])
    nodes.append(instance_tmpl % {'name' : ns,
                                  'path' : path,
                                  'xform' : str(xform)[1:-1]})

fp = open(r'/home/chiyama/Documents/katanta/scene_build/layout.xml', 'w')
fp.write(xml_tmpl % '\n'.join(nodes))
fp.close()

このようにして出力したファイルを KATANA で読むと、Maya 上でレイアウトしたシーンを再現することができました。

※そのままでは見た目がよくわからなかったので、全てのオブジェクトにグレーなマテリアルを割り当てています

CG, KATANA

Importomatic ノードでアセットを読み込む(2)

昨日はアセット用 .abc ファイルと、それに使用する .klf ファイルを一つづつ選んでシーンを構築してみました。

が。

そんなことを実際のシーンでやっていたらめんどくさくて禿げちゃいます。アセット100個、名前を指定しながら読み込むとか無理デスヨネー。
しかも、Maya など前段階の作業でアセットの読み込みはしているため、どのアセットが必要なのか既にわかっているはずです。その情報をそのまま使いたいというのが人情です。

そんな時には XML ファイルを使用して Importomatic ノードでアセットを読み込むことができます。

まず、シーン構築用の XML ファイルを用意します。


<scenegraphXml name="Zombie_OnFire" version="0.1.0">
  <instanceList>
    <instance type="reference" name="zombie" refType="abc"
              refFile="/home/chiyama/Documents/katanta/scene_build/Zombie_OnFire_2B.abc">
      <xform value="1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1"/>
      <lookFile ref="/home/chiyama/Documents/katanta/scene_build/zombie_on_fire.klf" />
    </instance>
  </instanceList>
</scenegraphXml>

そして、これを Importomatic ノードで読み込みます。

無事にアセットは読み込まれたのですが、マテリアルがついてきていません。これは Scene Graph の階層構造が変わってしまってるためでしょう。この辺りは何度か手戻りを繰り返しながら良い感じになるように Lookdev 用ファイルを作り直したり XML ファイルをみなおして調整する必要があります。

まだちょっと調整が必要ではあるものの、これでレイアウトやアニメーションの時に作成した情報を元にアセットを集めてシーンを構築するためのメドがついたことになります。

CG, KATANA

Importomatic ノードでアセットを読み込む

ショットシーン構築のためにアセットを読み込む方法を試行錯誤していたところ、KATANA 警察の方から Importomatic というのがあるよッ!!というのを教えていただきました。どうやらこのノードをパイプラインに合わせてゴリゴリいじれば良さそうです。

ということで複数の .abc ファイルを読んでみました。

なるほどこれは簡単。そして、Look File のアサインもここでおこなうことができるようです。

アセットの読み込みと Look File のアサインの方法がわかったのでやってみます。

。。。。と、その前に。Importomatic を使用してシーンを構築する場合、Look File 作成時にも Importomatic を使用してアセットを読み込んでおいた方が良いようです。もしかしたら、ちゃんとやれば Alembic_In で読んでいてもいいのかもしれないですが私のケースでは Importomatic で読んだアセットに対して Look File を作らないとマテリアルが再現されませんでした。Attribute も確認したのですが、違いを見つけることができなかったので何故こうしなければいけないのかは謎です。

このようにして作成した .klf ファイルを使ってマテリアルをアサインし、レンダリングしてみました。無事に再現されています。

CG

USDって結局何なのよ?

本記事の内容に対して、事実と異なることが含まれている可能性があることに気づきました。今後、検証・訂正記事を書くのでこちらの内容は一旦白紙とさせてください。
(追記)訂正記事を書きました。やはり私の勘違いで、Maya でもかなりの恩恵を享受できそうです

SIGGRAPH ASIA 2018 が始まりましたね。皆さん有楽町の超長いレジストの行列並びましたか~?

今回も PIXAR は “USD and Scene Interoperability: Demystifying the State of the Art”と題して USD の紹介をするためのセッションを設けていました。

この USD なんですが、CGWorld.jp の連載で USD について記事を書いた関係でいろんな人から、「それで、結局 USD って何なのよ?」と聞かれることがちょいちょいあります。そこで、私なりの解釈で USD というものを説明したいと思います。

と言っても USD の内容については元PIXARの手島さんが日本語で詳細な解説をされていたり、本家でも詳細なドキュメントが公開されています

これと同じ話をしてもしょうがないですし、私もそこまで詳しくないので、本記事では開発元である PIXAR とは別の、ユーザー側の視点から補足する形で USD って一体何なのよ?という疑問にお答えします。

USD って一体何なのよ?

USD にはいくつかの側面があります。

  • シーンを記述するためのファイルフォーマット
  • シーングラフと API
  • パイプライン構築のための基盤技術

このどれもが USD であり、それぞれが密接に関わりあっています。そのため、一緒に解説がおこなわれてしまって混乱を招いている部分が大きいと感じます。そこで、ファイルフォーマットと基盤技術という二つの面を別々に説明します。
※シーングラフと API に関しては今回あまり重要じゃないので割愛します。

シーンを記述するためのファイルフォーマット

いわゆる .usd ファイル(に書かれれている内容)です。これは、ざっくりと Alembic や FBX の凄い版と考えて良いでしょう。DCCTool は .usd ファイルフォーマットの読み書きに対応することで、他のアプリケーションとやり取りをすることができます。

ただし。

ここが大事なことなのですが、アプリケーションが USD の全ての仕様を満たし、潜在能力を発揮できるとは限りません。USD ファイルを読みこんだ後はアプリケーションネイティブなシーンデータになるだけなので、USD の仕様にあるけれどもアプリケーションが対応していない機能は当然実現できません。

たとえば、Maya に RenderMan のシェーダ情報を埋め込んだ .usd ファイルを読み込んで Arnold でレンダリングをしても、RenderMan のシェーダを使ってレンダリングできるわけではないです。当然ですよね。

アプリケーションは、パイプラインの中で自分が必要とする USD の機能をサポートし、共通ファイルフォーマットとして入出力をおこないます。

んじゃ FBX でいいじゃん?って思うかもしれませんが、ここでレンダラまで一気通貫で対応している USD の強みが効いてきます。USD ならパイプラインのごく初めの段階で作ったデータを変換することなく、そのままレンダリングまで持っていくことができます。

また、共通のファイルフォーマットなので複数のアプリケーションを使用してデータを作成する場合にも複雑なデータ変換の手続きを踏まなくてもそのままガッチャンコとできます。

ここまでが共通ファイルフォーマットとしての USD のお話です。これは USD を導入するとすぐに享受できるメリットです。これだけでも十分すごいですよね。

パイプライン構築のための基盤技術

これが実はかなり厄介というか、初見殺しの内容になっています。

USD という基盤技術を使うことでコンカレントパイプラインを構築することができますよということでプレゼンでもかなり力を入れて説明がされるところなのですが、残念なことに

通常、我々はそのまま享受することはできません。

もう一回言います。

我々には使えません。

え?え?どゆこと!? PIXAR 嘘ついてるの!?と思うかもしれませんが、そんなことはありません。事実、PIXAR では USD を使ってそういうパイプラインを作っていますから。

そう、Presto があればねッ!!!!

先ほどのファイルフォーマットの時の説明を思い出してください。

“USD の仕様にあるけれどもアプリケーションが対応していない機能は当然実現できません”

※(訂正)USD プラグインとして提供される機能で対応している内容もあり、Maya の場合は USD 標準の Maya プラグインでかなりのことができるようです。USD が実現しようとしていることを完全に実現できているかはちょっとわからないですが、かなり高いレベルで実装されているようです。

つまり、コンカレントパイプラインを構築するためにはそれに対応した環境を自分で作る必要があります。これは当然ですね。パイプラインは各社各様それぞれなのでそこを USD がどうこうすることはできません。

PIXAR は自社で Presto を開発して対応していますし、AnimalLogic は AL_USDMaya を開発して Maya 上で対応しています。コンカレントパイプラインという思想を実現するための強力な基盤技術として USD を使用するのです。

また、当然ながらこの部分を USD に依存する必要性も無いのです。KATANA なんかは入出力として USD に対応しますが、シーン管理は自前でおこなっています。

よくわからないけど凄そうな usdview

ここで混乱に拍車をかけているのが usdview の存在です。USD のデモでは必ず登場し、ある意味 USD の顔のような存在になっています。ただ、これは名前の通り USD シーンのビューワでしかなく、シーンの編集機能は一切無いです。

何も知らないと “PIXAR で使っている CG ソフトがオープンソースに!?私も同じツールで CG を作れるの!?”とワクワクしてしまうのですが、そういうわけではないのです。

usdview 自体はとても強力なツールで、.usd ファイル(だけではなく、.abc ファイルも)を扱う時には手放すことのできない相棒のような存在です。

まとめ

私の視点からみた USD の概要についてまとめてみました。特に、PIXAR の中の人にとっては当たり前すぎて省略してしまいがちなことを重点的に書き出してみたので、この内容を念頭に置いた状態で PIXAR の資料を読むと、今までモヤッとしていた部分が晴れてくるんじゃないかなとおもいます。

CG, KATANA

OpScript を使ってアセットを読み込む

昨日の記事ではゴリゴリと Node Graph を編集する形でアセットを読み込む方向で進めてみたんですが、私のゴーストがこっちじゃないと囁くんでもうちょっとスマートな方法を調べてみることにします。

多分、KATANA 的にはショットシーンの雛形もあんまりゴリゴリ自動生成しないで、メタデータなりなんなりを読み込んで最初のシーンを構築するんじゃないかと思います。多分。

これには、OpScript で複数の .abc ファイルを読み込みつつ Scene Graph を構築する方法が確立できればいいんじゃないかということでチョチョッと調べます。

とりあえず .abc ファイルを一つだけ読み込むには

local argsGb = GroupBuilder()
abcFile = "/home/chiyama/Documents/usdtest/assets/Zombie_OnFire_2B.abc"
argsGb:set('fileName', StringAttribute(abcFile))
Interface.ExecOp('AlembicIn', argsGb:build())

こんなことをすればいいようです。

ExecOp で AlembicIn ノードを作ってデータを読み込んでいるっぽいことはわかったので、引数で良い感じにファイルを読み込む Scene Graph のパスを指定すれば複数のアセットを読み込むことができるんじゃないかとおもいます。

ちょっと謎なのが、KATANA でのノードの Alembic_In とは必要な引数名が異なるので、どのように読み替えればいいのかがわからないところです。

この部分が解決すればやりたいことはできるんでしょうが、生憎今日はここまでで閉店ガラガラ~。