2020-06-11

usd rop


SOP Import に USD ROP を接続して、SOPパスとファイル出力先以外をデフォルトのまま USD として書き出すと、.usd ファイルは書き出されるがエラーが発生する。この理由と対処方法について説明する。



使用したビルド: Houdini 18.0.494 Windows 10

手順

  1. オブジェクトレベル (/obj) に Rubber Toy を作成。
      /ob/testgeometry_pighead1 が出来る。
  2. /stage で、SOP Import を作成 (sopimport1) し、SOP Path を /obj/testgeometry_pighead1/testgeometry_pighead1 に指定する。
  3. sopimport1 の出力に USD ROP (usd_rop1) を作成する。
  4. Output File を、例えば、 d:/out.usda とする。
      .usda で出力すれば ASCII で出るので、テキストエディタで内容が確認可能。
  5. usd_rop1 の Save to Disk をクリックすると、ファイルは書き出されるが、エラーが発生する。
      Error: Layer saved to a location generated from a node path: d:/obj/testgeometry_pighead1/testgeometry_pighead1.usd
この理由と回避策を以下説明する。

エラーの理由

上記に書いたとおり、.usda で出力すれば中身をテキストエディタで確認できる。上の手順で書き出した out.usda ファイルの内容は以下の通り。

#usda 1.0
(
    endTimeCode = 1
    framesPerSecond = 24
    metersPerUnit = 1
    startTimeCode = 1
    subLayers = [
        @./obj/testgeometry_pighead1/testgeometry_pighead1.usd@
    ]
    timeCodesPerSecond = 24
    upAxis = "Y"
)

7行目の SubLayer は SOP パスを指し示しているだけで、これでは他の USD から参照できるとは限らない。これがエラーの理由。

回避策1: SOP Import: Copy Contents into Editable Layer を使う

  1. sopimport1 に戻り、Copy Contents into Editable Layer をオンにする。
  2. usd_rop1 で、Save to Disk をクリックして、ファイルを出力する。
      エラーは消える。
これで書き出したファイル (out1.usda) は以下の通り。
#usda 1.0
(
    defaultPrim = "sopimport1"
    endTimeCode = 1
    framesPerSecond = 24
    metersPerUnit = 1
    startTimeCode = 1
    timeCodesPerSecond = 24
    upAxis = "Y"
)

def Xform "sopimport1" (
    kind = "component"
)
{
    def Mesh "mesh_0"
    {
        float3[] extent = [(-1.0025358, -1.3353765, -0.9231264), (0.9976697, 0.56609946, 1.2734325)]
        int[] faceVertexCounts = ... 以下省略

このオプションにより、出力ファイル内にメッシュ情報が書き出されていることがわかる。

回避策2: SOP Import: Layer Save Path を使う

  1. sopimport1 に戻り、Copy Contents into Editable Layer をオフにする。
  2. 同じく sopimport1 で Layer Save Path のオンにして、パスとして d:/out2a.usda などとする。
  3. usd_rop1 で、Output File を d:/out2.usda などとして、Save to Disk をクリックして、ファイルを出力する。
      これでもエラーは出ない。

out2.usda の中身は以下の通り。

#usda 1.0
(
    endTimeCode = 1
    framesPerSecond = 24
    metersPerUnit = 1
    startTimeCode = 1
    subLayers = [
        @./out2a.usda@
    ]
    timeCodesPerSecond = 24
    upAxis = "Y"
)


見てわかるとおり、 subLayers は out2a.usda を参照している。

ou2a.usda の中身は以下の通り。

#usda 1.0
(
    defaultPrim = "sopimport1"
    metersPerUnit = 1
    upAxis = "Y"
)

def Xform "sopimport1" (
    kind = "component"
)
{
    def Mesh "mesh_0"
    {
        float3[] extent = [(-1.0025358, -1.3353765, -0.9231264), (0.9976697, 0.56609946, 1.2734325)]
        int[] faceVertexCounts =  ... 以下省略

回避策3: USD ROP: Flatten All Layers

  1. 回避策1と2で行った sopimport1 の設定を元に戻す。
  2. usd_rop1 で Save Style を Flatten Implicit Layers (デフォルト) から Flatten All Layers に変更する。
  3. Output File を d:/out3.usda などとして、Save to Disk をクリックして、ファイルを出力する。
      これでもエラーは出ない。
これで出力した out3.usda と回避策1で出力した out1.usda の中身は同一。

回避策4: SOP Import の代わりに SOP Create を使う

  • LOP (Solaris) コンテクストで、TAB->Test Geometry: Pighead とする
  • または、SOP Create ノードを作成し、中に入って Pig Head を作成。
こうすると、上記設定したようなことが自動的に行われている。
    Copy Contents into Editable Layer がデフォルトでオンになっている。
SOP Create を使う事のもう一つの利点は、シェーディングも自動的に正しく処理されること。つまり、SOP Import だけだとテクスチャシェーディングの無い Pig Head (左)が SOP Create 経由であれば、自動的にテクスチャ付き (右) で表示される。

まとめ

何が起きているかがわかっているのであれば、USD ROP の Extra Files 以下に隠れている Error Saving Layers with Implicit Paths をオフにする。そもそもの原因は、最初の手順では、Layerが Implicit (暗黙、つまり明示的ではない) であったためで、この際のエラーを出さないようにすればエラーは出ない。

どれを使うかは何をしたいかによる。

0 件のコメント:

コメントを投稿