SOP Import に USD ROP を接続して、SOPパスとファイル出力先以外をデフォルトのまま USD として書き出すと、.usd ファイルは書き出されるがエラーが発生する。この理由と対処方法について説明する。
使用したビルド: Houdini 18.0.494 Windows 10
手順
- オブジェクトレベル (/obj) に Rubber Toy を作成。
- /ob/testgeometry_pighead1 が出来る。
- /stage で、SOP Import を作成 (sopimport1) し、SOP Path を /obj/testgeometry_pighead1/testgeometry_pighead1 に指定する。
- sopimport1 の出力に USD ROP (usd_rop1) を作成する。
- Output File を、例えば、 d:/out.usda とする。
- .usda で出力すれば ASCII で出るので、テキストエディタで内容が確認可能。
- 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 を使う
- sopimport1 に戻り、Copy Contents into Editable Layer をオンにする。
- usd_rop1 で、Save to Disk をクリックして、ファイルを出力する。
- エラーは消える。
#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 を使う
- sopimport1 に戻り、Copy Contents into Editable Layer をオフにする。
- 同じく sopimport1 で Layer Save Path のオンにして、パスとして d:/out2a.usda などとする。
- 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と2で行った sopimport1 の設定を元に戻す。
- usd_rop1 で Save Style を Flatten Implicit Layers (デフォルト) から Flatten All Layers に変更する。
- Output File を d:/out3.usda などとして、Save to Disk をクリックして、ファイルを出力する。
- これでもエラーは出ない。
回避策4: SOP Import の代わりに SOP Create を使う
- LOP (Solaris) コンテクストで、TAB->Test Geometry: Pighead とする
- または、SOP Create ノードを作成し、中に入って Pig Head を作成。
- Copy Contents into Editable Layer がデフォルトでオンになっている。
まとめ
何が起きているかがわかっているのであれば、USD ROP の Extra Files 以下に隠れている Error Saving Layers with Implicit Paths をオフにする。そもそもの原因は、最初の手順では、Layerが Implicit (暗黙、つまり明示的ではない) であったためで、この際のエラーを出さないようにすればエラーは出ない。
どれを使うかは何をしたいかによる。
0 件のコメント:
コメントを投稿