はじめに
この記事は Houdini Advent Calender 2025 の8日目の記事です
今年はエフェクト向けの記事を書きます
題名の通り、今回はチェックポイントを活用して
シミュレーションのパターンを作成していきたいと思います!
使い方次第で、シミュレーションを切り分けて作業することができるので、
計算コストも抑えられるんじゃないかと思ってます
少しセットアップが面倒ですが、最後まで見て頂ければ嬉しいです!
また、今回使用している Hipファイル もアップしているので
こちら も参考にして頂ければと思います
使用バージョン : Houdini 21.0.440
チェックポイントとは?
ざっくりと言えば
シミュレーションの途中結果を .sim ファイルとして保存しておき、
後から再開できる仕組みです
例えば海などの長尺のシミュレーションを掛けた時に
何らかの理由で処理が途中で終わってしまった場合、
チェックポイントを利用する事で途中からシミュレーションを再開することができます
今回は途中から再開できるという点を活かして、
任意の地点からシミュレーションを再開し、パターンを作っていきたいと思います
手順の確認
まずは、細かい内容は一旦置いて
先にざっくりと流れを確認しておきます
全体の流れはどのシミュレーションのタイプも基本的には同じで、
状況によって、手順が追加される感じです
ここから、いくつかシミュレーションのタイプをわけて
説明していきます
Pop Sim
Setup
Base Sim
シンプルなシーンから作成していきましょう
最初にベースとなるシミュレーションを掛けていきますが、
その前にチェックポイントを作成するためにDop NetworkのCheckpointを有効にします
-
Dop NetworkのCacheタブにあるSave CheckpointsをONに -
Checkpoint Fileで保存先を指定します。後で再利用する際に少し手を加えるので backup という一時的なフォルダに保存しています -
Checkpoint Intervalでチェックポイントを保存する間隔を設定します
今回は60F毎にチェックポイントを作成するようにしています
設定ができたらシミュレーションを取っていきましょう
最低限の尺でもいいのですが、今回は比較のために長くとっています
Checkpoint Fileにはグローバルのタイムステップ($F)ではなく
シミュレーションのタイムステップ($SF)を指定する必要があります
シミュレーションを取るとCheckpoint Fileで指定した場所に simファイル が作成されます
$HIP/checkpoint/$OS/
┗ backup
┣ Pop_Sim.60.sim
┣ Pop_Sim.120.sim
...
Restart Sim
ベースとなるシミュレーションが取れたので、
次は、再シミュレーションを行う為のセットアップを行います
Switchノードの作成
元のPop_SimとCACHE_Pop_Simを複製、
そして、複製したDop Network内で Switch ノードと Null ノードを作成します
再シミュレーション前のフレームは計算しないように
Switch ノードの Select Input に $SF<60 を設定しておきます
Checkpointを変更
複製したDop NetworkのCheckpointも変更します
-
Checkpoint Fileを先程保存したsimファイルの一つ上の階層に指定しておきます -
Checkpoint Intervalは再度保存されないように大きい値を指定
simファイル をコピー
Checkpoint Fileで更新した場所にはまだ simファイル が存在しないので
その場所に simファイル をコピーします
$HIP/checkpoint/$OS/
┣ backup
┃ ┣ Pop_Sim.60.sim
┃ ┣ Pop_Sim.120.sim
┃ ...
┗ Pop_Sim.60.sim <-- ここにコピー
チェックポイントはディレクトリ内の simファイル を全て読み込んでしまうので、
再シミュレーション時には、開始フレームだけが読み込まれるように
別の場所へとコピーしています
今回の場合、そのままの状態でシミュレーションを掛けると
60フレーム目に Pop_Sim.60.sim が読み込まれた後、
120フレーム目でPop_Sim.120.sim が読み込まれてしまうので、
それを回避するために、Pop_Sim.60.simを一つ上の階層にコピーしています
設定を終えたらキャッシュを取って確認します
結果
上手くキャッシュが取れていれば、60フレーム目からシミュレーションを再開したものが
保存されているはずです
今回はネットワークを複製しただけなので、再シミュレーションしたものと
元のシミュレーションの結果が一致している事が確認できると思います
おおまかな流れについては以上になります
次はもう少し複雑なシーンでのケースを説明していきます
Smoke Sim
今度は、煙のシミュレーションを
それぞれ異なるコリジョンを使用して作成したいと思います!
その際、後半のコリジョンに当たる直前からシミュレーションを再開することで
全体のシミュレーション時間を短縮していきます
Setup
まずソースと、コリジョンとなるジオメトリを用意します
Base Sim
チェックポイント作成の流れは Pop Sim と大きくは同じですが、
今回はDop Networkではなく、Pyro Solverを使用しているので
若干チェックポイントの設定が異なります
ここでは一旦、下記のように設定しておきます
-
Base Nameをbackup/$OS -
Base Folderを$HIP/chekcpoint/$OS -
Checkpoint Intervalを 100
Houdini 20.5 まではチェックポイントのパラメータが表に出ていないので、
その場合はアセット内の Dop Network で指定する事になります
設定ができたらシミュレーションを取っていきましょう
Restart Sim
続いて再シミュレーションのためのセットアップをしていきます
Checkpointを変更
-
Base Nameはベースシムで書き出したsimファイルの一つ上の階層を指定 -
Base Folderはベースシムのフォルダを参照 -
Checkpoint Intervalは再度保存されないように大きい値を指定
また、前半部分はベースのシミュレーションを使用したいので
Switch ノードで切り替わるように設定しています
simファイル をコピー
Base Folder と Base Name で指定した場所に simファイル をコピーします
$HIP/checkpoint/$OS/
┣ backup
┃ ┣ Smoke_Sim.100.sim
┃ ...
┗ Smoke_Sim.100.sim <-- ここにコピー
Dop Network 内を修正
今回はコリジョンを追加したので、Dop Network 内を修正する必要があります
その前に、simファイル が読み込まれた時の Dop Network の状態を確認しておきましょう
simファイル が読み込まれると、Dop Network 内のデータが復元されます
既にデータが存在していた場合は、チェックポイントの方が優先されます
ここで問題になるのが、復元されたデータの中に外部参照しているデータのパスが
含まれていた場合、チェックポイントで読み込まれたデータは
古いデータのパスを読み込んでしまう事です
例として、Dop Network 内の Volume Source を見てみると
読み込まれたデータの soppath が古いパスを指しています
デフォルトでは、この soppath のプロパティはデータを作成する段階で設定され、
以降は更新されない状態になっています
これを、チェックポイントが読み込まれた後、
soppath のプロパティが更新されるように修正していきます
Volume Source ノードの場合、 soppath のプロパティを設定しているのは
サブネット内にある Sop Merge Field ノードなので
アンロックして該当のプロパティを Set Always へと変更します
チェックポイントが読み込まれた後のフレームで、
新しいパスが適用されていることを確認します
Volume Source が複数ある場合や、他のノードでもプロパティを更新する事もあるので、これらの処理をスクリプトで一括処理しておきましょう
import hou
node = hou.node('/obj/smoke/Smoke_ReSim/dopnet1')
assettypes = ["volumesource","rbdfracturedobject","staticobject"]
sources = [child for child in node.allSubChildren() if child.type().name() in asset_types]
for source in sources:
source.allowEditingOfContents()
doptypes = ["sopgeo","sopmergefield"]
dopnodes = [child for child in source.allSubChildren() if child.type().name() in node_types]
for dopnode in dopnodes:
parm = subnode.parm("parmop_soppath")
if parm:
parm.set("always")
チェックポイントの読み込み時に、オブジェクトのデータがないケース
例えばベースのシミュレーション時にはコリジョンのデータがなく、
再シミュレーション時にコリジョンが発生する場合は Creation Frame を変更して
新たにオブジェクトのデータが作成されるようにしなければいけません
デフォルトだと Static Object のデータは
シミュレーションの開始フレームで作成されるため、
再シミュレーション時には作成されません
なので
-
Creation Frameを 再シミュレーションのフレーム+1 に変更 - シミュレーションフレーム(
$SF)を基準にして 設定するために
Creation Frame Specifies Simulation FrameをON
にすれば、再シミュレーション時にオブジェクトが作成されるようになります
Switch ノードの作成
Pop Sim の時と同様に、再シミュレーション前のフレームは計算しないように
Switch ノードの Select Input に $SF<100 を設定しておきます
設定が終わったらキャッシュを取っていきましょう
結果
他のコリジョンもそれぞれ同様の設定でシミュレーションを掛けてみます
Flip Sim
今度は、フリップのシミュレーションでも、
それぞれ異なるコリジョンを使って作成していきます
海などのシミュレーションでは、
動きを安定させるために、使用するフレームよりも前に計算を開始させますが、
この前半のベースシミュレーションを用意しておくことで、
再シミュレーション時にはその途中から計算を再開できます
これを使って、フリップでも全体の計算時間を効率的に短縮していきます
Setup
ソースと、コリジョンとなるジオメトリをそれぞれ用意します
また、Ocean Spectrum の動きに合わせるためのフィールドも用意します
Base Sim
Smoke Sim と同様にチェックポイントの設定
設定ができたらシミュレーションを取ります
取ったシミュレーション
Restart Sim
続いて再シミュレーションのためのセットアップをしていきます
Checkpointを変更
-
Base Nameはベースシムで書き出したsimファイルの一つ上の階層を指定 -
Base Folderはベースシムのフォルダを参照 -
Checkpoint Intervalは再度保存されないように大きい値を指定
simファイル をコピー
Base Folder と Base Name で指定した場所に simファイル をコピーします
$HIP/checkpoint/$OS/
┣ backup
┃ ┣ Flip_Sim.200.sim
┃ ...
┗ Flip_Sim.200.sim <-- ここにコピー
Dop Network 内を修正
Smoke Sim と同様にDop Network 内を修正します
Switch ノードの作成
こちらも、再シミュレーション前のフレームは計算しないように
Switch ノードの Select Input に $SF<200 を設定しておきます
FLIP Collide を修正
再シミュレーション時にコリジョンのトポロジーが異なると
切り替えのタイミングで正しくコリジョンが変形されず、破綻してしまう事があるので
切り替えた時点の Surface Collide を無効にするように設定します
これらの設定が終わったらキャッシュを取っていきましょう
結果
他のコリジョンもそれぞれ同様の設定でシミュレーションを掛けてみます
ツール化
毎回セットアップをするのも、大変なので
スクリプトで自動化してしまいましょう
一から作成すると長くなってしまうので、
セットアップのためのパラメータを こちら に用意しました
その中の restart_sim_setup.ds をどこか任意の場所に保存して下さい
ds ファイルの読み込み
まず、パラメータを保存した dsファイル を読み込みます
ギアメニューから
Install Parameters From File... を押して先程の dsファイル を指定
そうするとパラメータが読み込まれます
設定
Pop Sim で行った処理をここに当てはめてみます
-
Source SimSource Filecacheにベースのシムとキャッシュを指定 -
Target SimTarget Filecacheに再シミュレーションのシムとキャッシュを指定
※複数ある場合はTargetsの数を増やして同様に指定 -
Simulationタブで開始フレームやチェックポイントの書き出し先などを設定します
Restart Frameには再シミュレーションの開始フレームを設定します -
Clear Source Checkpointはソースで指定しているチェックポイントを削除します
※チェックポイントを削除する理由は こちら の赤いノートを参照 -
Copy Checkpoint to Targetでターゲットで読み込むチェックポイントをコピーします
実行
設定を終えたら上部にある Setup Checkpoint のボタンを押して
セットアップを実行します
シミュレーションノードの
チェックポイントやサブステップ、開始フレームなどが設定されます
ファイルキャッシュノードの Pre-Render Script にそれぞれスクリプトが設定されます
-
ベースシムはシミュレーションを実行する前に古いチェックポイントの削除
GUIで実行した時は、チェックポイントを削除するかどうかのダイアログが出ます


-
再シミュレーションは実行前にチェックポイントのコピー
GUIで実行した時は、チェックポイントをコピーするかどうかのダイアログが出ます


CACHE_Pop_Sim と CACHE_Pop_ReSim をそれぞれ取れば完了です!
おわりに
長文になりましたが、以上となります
今回はチェックポイントを利用したパターン出しの方法を書きましたが、
この方法が絶対!! という訳ではなく、こんなやり方もあるんだなぁぐらいに
思って頂ければなと思います
誰かのお役に立てれば幸いです
ありがとうございました!!












































