以下の内容はhttps://godofsuama.hatenablog.com/entry/2024/01/01/100000より取得しました。


Solaris - Timeshift LOPの罠と回避

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はマイナスの値で時間が未来へ進むのだけは注意です。

Referenceノード
Sublayerノード

Time OffsetとTime Scaleの関係

Transformations, Time-sampled Animation, and Layer Offsets — Universal Scene Description 23.11 documentation

上記ページを参考にすると、表示される時間=(USDファイルの時間 x Time Scale)+Time Offsetということです。

マルチショット時の対処療法的Python

これはおまけですが、マルチショット構築時等に1つのキャッシュで片方だけTime Offsetを少しして調整したい等があった場合の対処法。

このPythonはPrimにあるReferenceを元に再設定します。つまりReferenceノードで読み込み直しているのと同じです。

SwitchでShotを切り替えると想定します。

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に書き換えると動作します。

prim,offset,scaleのパラメーター




以上の内容はhttps://godofsuama.hatenablog.com/entry/2024/01/01/100000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14