CG, USD

USD のビルドの進捗を確認する

以前、CGWorld の記事で USD のビルドの進捗がわかり辛いということを書いたのですが、最近のバージョン(?) では ${INSTALLDIR}/build/USD/log.txt にビルド時の stdout(stderrも?) の内容が出力されるようです。

そのため、tail を使ってこんな感じで進捗の確認ができます。

[chiyama@docker USD]$ tail -f log.txt
[ 85%] Building CXX object pxr/usd/lib/usdGeom/CMakeFiles/_usdGeom.dir/wrapBasisCurves.cpp.o
[ 85%] Building CXX object pxr/usd/lib/usdSkel/CMakeFiles/usdSkel.dir/cacheImpl.cpp.o
[ 85%] Building CXX object pxr/usd/lib/usdLux/CMakeFiles/usdLux.dir/diskLight.cpp.o
[ 85%] Building CXX object pxr/usd/lib/usdShade/CMakeFiles/usdShade.dir/debugCodes.cpp.o
[ 85%] Building CXX object pxr/usd/lib/usdUtils/CMakeFiles/usdUtils.dir/coalescingDiagnosticDelegate.cpp.o
[ 85%] Building CXX object pxr/usd/lib/usdShade/CMakeFiles/usdShade.dir/input.cpp.o
[ 85%] Building CXX object pxr/usd/lib/usdUtils/CMakeFiles/usdUtils.dir/debugCodes.cpp.o
[ 85%] Building CXX object pxr/usd/lib/usdUtils/CMakeFiles/usdUtils.dir/dependencies.cpp.o

CG, Maya

Mayaのノードで数学の演算を実現する

Maya Advent Calendar 2018 の記事です。@rt_sporty さんがリグっぽいネタ無いですかね~?とかつぶやいていた気がするので、リグっぽいけど関係ありそうな無さそうなネタを投下します。

リグを組むとき、sin とか cos とか abs とかベクトルの計算とか多用しますよね。

でも、Expression で書くと遅い。そしてダサい。ノードベースなんだし全部ノードで組みたいじゃん!って思うのが人情です。

組みましょう。

足し算, 引き算

まずは手始めにここからいきます。これはそのままノードがあります。数値もベクトルもこれで行けます。

掛け算, 割り算, a の b 乗

四則演算を揃えます。

うむ。チョロいチョロい。

逆数

これは割り算がそのまま使えます。

絶対値

これは Maya 上にはズバリそのもののノードはありません。どうしようか。。。ということですが、0 からの距離と考えれば簡単です。

floor

アニメーションカーブと、 Pre Infinity, Post Infinity を使えば実現できます。
アニメーションカーブは通常は input に時間が入力されますが、このように任意の値を入れることもできます。この辺りは結構使うテクニックですね。

Mod

mod(a, b) = a – b * floor(a / b) なので、既にあるノードを組み合わせることで計算できます。

三角関数

これはちょっと困りものです。そのものズバリなものも無いですし、既存のノードで代替するのも難しそうです。展開して近似とかもめんどくさいし重たそうです。
しかたないのでアニメーションカーブで近似します。Pre Infinite/Post Infinite を使えば一周期だけデータを用意しておくだけで対応できます。厳密な計算をする場合はもうちょっとちゃんとやる必要があるんでしょうが、リグ用とかならこれで十分かなと。sin, cos, asin, acos はこの方法で対応できますね。

tan は sin/cos で計算できます。

Log

これも良い感じに軽く計算できる方法が思いつかないのでアニメーションカーブで逃げます。ある程度の精度とデータの軽さを両立するために、キーフレームの打ち方を工夫したりして悪あがきします。あと、余り使わなさそうな部分は Linear で外挿しています。

これくらいあれば必要な演算は大体できるのではないでしょうか。(ゼロ除算は全く考慮してないですが~;;)

CG, USD

AL_USDMaya

PIXAR 標準の USD Maya プラグインとは別に、AnimalLogic が公開している AL_USDMaya があります。個人的には、Maya を中心に据えて USD ベースのパイプラインを組むのならこちらが本命じゃないかなと思っています。あんまり確たる根拠は無いですが。そこは勘ですよ勘!!セブンセンシズですよっ!

PIXAR 実装は Scene Assembly として USD の情報を扱う実装になっていますが、AL_USDMaya はそのあたりの扱いを自前でゴリゴリと頑張っているようです。.usd ファイルを読み込むと AL_usdmaya_ProxyShape ノードが作成され、単一のノードとして表示されるのですが、ビューポート上でオブジェクトをピックするとそこまでの階層がシーン中に現れて操作できるようになります。

このプラグインを使用している様子は “AL_USDMaya Layout and Animation Workflow” で見ることができるのですが、結構独自のツールを作って実現している機能が多いようなので、オープンソースになっているプラグインをビルドすればこれができると思ってしまうのは甘い感じです。そもそも、Hydra を Maya 上で使ってるっぽいことを言ってるんですがこれは一体。。。?

あと、手元でも環境を作ってみてはいるものの、まだ完全に動くようにはなっておらず試行錯誤しているところです。特に VP2 との相性が悪い様でオブジェクトのピック周りの問題が解決していないです。この辺りは PIXAR 版とは違って自前でゴリゴリ頑張っている弊害ですね。

もしかしたら Luma Pictures の outliner を併用すれば PIXAR 標準 Maya プラグイン(+ゴリゴリ自前開発)でも必要なことはできるのかもしれないですが。。。。このあたりは引き続き要調査です。

CG, KATANA

GroupStack

作業をする際、多くの種類のマテリアルをアサインしたり、ショットシーンで大量のアセットを読み込んでそれぞれに Lookfile をアサインしたくなります。
これまでやっていたように、一つ一つ MaterialAssign ノードなどを作成してそれを繋げてもできるのですが、ノードグラフが無駄に長くなりますし、管理も煩雑になってしまいます。

このような問題に対応するため、GroupStack ノードが用意されています。

たとえば、下図のように複数の MaterialAssign が連なっているケースを例にしてみます。

これでも要求は満たしていますが、見た目も良くありませんし、MaterialAssign ノードを増減するために Node Graph を更新しなければいけないので管理も煩雑です。

そこで GroupStack ノードを作って MaterialAssign ノードを選択し、Shift+中ボタンクリックでドラッグアンドドロップします。


すると、GroupStack ノードに MaterialAssign ノードの情報が登録されました。GroupStack ノードを元々あった場所に繋げると、元と同じ状態になります。

GroupStack ノードは一つのノードに対して同じ種類のノードを複数登録できます。反面、異なる種類のノード(MaterialAssign と LookfileAssign とか)を一つのノード中に含めることはできないです。また、登録できるノードの種類は一入力一出力のものに限られます。このあたりは、ノードの性質を考えれば妥当な仕様ですね。

CG, KATANA, USD

USD for KATANA

USD のリポジトリには KATANA 用プラグインも含まれています。ビルドも難しくなく、KATANA プラグインビルド用のオプションを追加して USD をビルドするだけですんなりいけます。

ビルドができたら、KATANA が USD プラグインを認識できるように起動スクリプトに手を加えます。私はこのようにしました。

#!/bin/sh

export KATANA_ROOT=/opt/Katana3.0v6
export DEFAULT_RENDERER=arnold
export USD_INSTALL_ROOT=/opt/usd

export KTOA_ROOT=/opt/KtoA-2.2.1.0-kat3.0-linux
export "KATANTA_TAGLINE=With KtoA 2.2.1.0"

export KATANA_RESOURCES=$USD_INSTALL_ROOT/third_party/katana/plugin:$KTOA_ROOT
export KATANA_POST_PYTHONPATH=$USD_INSTALL_ROOT/third_party/katana/lib:$KATANA_POST_PYTHONPAT

export PATH=$KATANA_ROOT/bin:$KTOA_ROOT/bin:$PATH
export PYTHONPATH=${KTOA_ROOT}/python:$USD_INSTALL_ROOT/lib/python:$PYTHONPATH

$KATANA_ROOT/bin/katanaBin "$@"

KATANA を起動すると、PxrUsd から始まる名前のノードが選べるようになっています。

PxrUsdIn でサンプルシーンを読んでみました。
※ZUp なようなので、TransformEdit で X 軸に -90° 回転を加えています

これで、KATANA でも USD を使用することができるようになりました。

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 ファイルとして出力することで一つの最終シーンをあたかも複数人が同時に更新をおこなっているかのようなパイプラインを組むことができます。