SolarisでTimeshiftする場合の注意とか。
何が危ないのか?
SOP Import と Timeshiftノード
この組み合わせが一番良くないです。

どういうレンダーシーンが書き出されるかというと

ほぼ同じ要領のusdファイルが2つできています。
これはTimeshiftノードが時間をずらすのではなく、上流のファイルを指定した時間分ずらした状態の"PrimvarsとAttributes"を作成しているからです。
内部的にずらした状態のキャッシュを作り直しているのと同じです。なので倍のファイルサイズを意味なく使います。
Reference(Sublayer)と Timeshiftノード
この組み合わせも...

書き出されるレンダーシーンのファイルサイズがほぼキャッシュを出し直しているのと同じだけ使います。つまりほぼ意味ない。

回避方法1
Configure LayerノードでSave Pathを設定し、中間ファイルとしてSOP ImportとTimeshiftを結合したデータを手動で設定することです。


レンダーシーン内にはConfigure Layerへのパスが記載される。※他にノード繋いでたら項目は増えます。
#usda 1.0
(
endTimeCode = 120
framesPerSecond = 24
metersPerUnit = 1
startTimeCode = 1
subLayers = [
@./configureLayer.usd@
]
timeCodesPerSecond = 24
upAxis = "Y"
)
これはこれでいいんですが、Configure Layerをどこで書き出すのか、とか書き出し先指定はどうするか?等いろいろあります。
回避方法2
Reference / Sublayer時しか使えませんが、こちらのほうがスマートな回避方法。

そもそもUSDファイルをReference / Sublayerする場合、内部的には以下のような、ファイルパス(offset = -20)という表記を使うことで、Timeshiftノードがなくても時間をずらせます。
def "crag" (
prepend references = @./usdexport1.usdc@ (offset = -20)
)
キャッシュ読み込み時のここを設定するだけです。Time Offsetはマイナスの値で時間が未来へ進むのだけは注意です。


Time OffsetとTime Scaleの関係
上記ページを参考にすると、表示される時間=(USDファイルの時間 x Time Scale)+Time Offsetということです。
マルチショット時の対処療法的Python
これはおまけですが、マルチショット構築時等に1つのキャッシュで片方だけTime Offsetを少しして調整したい等があった場合の対処法。
このPythonはPrimにあるReferenceを元に再設定します。つまりReferenceノードで読み込み直しているのと同じです。

node = hou.pwd() from pxr import Usd,Sdf stage = node.editableStage() primpath = node.evalParm('prim') timeOffset = node.evalParm('offset') timeScale = node.evalParm('scale') prim = stage.GetPrimAtPath(primpath) ref = prim.GetReferences() child = ref.GetPrim() layerStack = child.GetPrimStack()[1] filepath = layerStack.layer.identifier filename = layerStack.name #clear References ref.ClearReferences() ##set References ref.AddReference( assetPath = filepath, primPath = '/'+ filename, layerOffset = Sdf.LayerOffset(offset=-timeOffset, scale= timeScale), position = Usd.ListPositionFrontOfPrependList)
Primで指定するのはReferenceしているPrimです。ほかだと動作しません。
PrimがPayloadで読み込まれている場合は、PythonのReferenceの箇所をPayloadに書き換えると動作します。
