7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

チェックポイントを使って、シミュレーションのパターンを作成する! [Hip有り]

Last updated at Posted at 2025-12-08

はじめに

この記事は Houdini Advent Calender 2025 の8日目の記事です
今年はエフェクト向けの記事を書きます

題名の通り、今回はチェックポイントを活用して
シミュレーションのパターンを作成していきたいと思います!

使い方次第で、シミュレーションを切り分けて作業することができるので、
計算コストも抑えられるんじゃないかと思ってます

少しセットアップが面倒ですが、最後まで見て頂ければ嬉しいです!

また、今回使用している Hipファイル もアップしているので
こちら も参考にして頂ければと思います


使用バージョン : Houdini 21.0.440

00.チェックポイントとは

01.手順の確認

02.Pop Sim

03.Smoke Sim
FB_Smoke_Sim.gif

04.Flip Sim
FB_Flip_Sim.gif

05.ツール化

チェックポイントとは?

ざっくりと言えば
シミュレーションの途中結果を .sim ファイルとして保存しておき、
後から再開できる仕組みです

例えば海などの長尺のシミュレーションを掛けた時に
何らかの理由で処理が途中で終わってしまった場合、
チェックポイントを利用する事で途中からシミュレーションを再開することができます

今回は途中から再開できるという点を活かして、
任意の地点からシミュレーションを再開し、パターンを作っていきたいと思います

手順の確認

まずは、細かい内容は一旦置いて
先にざっくりと流れを確認しておきます

全体の流れはどのシミュレーションのタイプも基本的には同じで、
状況によって、手順が追加される感じです

ここから、いくつかシミュレーションのタイプをわけて
説明していきます

Pop Sim

Setup

Base Sim

シンプルなシーンから作成していきましょう

pop_network01.jpg

最初にベースとなるシミュレーションを掛けていきますが、
その前にチェックポイントを作成するためにDop NetworkのCheckpointを有効にします

pop_base_cache.jpg

  • Dop NetworkCacheタブにある Save CheckpointsON

  • Checkpoint File保存先を指定します。後で再利用する際に少し手を加えるので backup という一時的なフォルダに保存しています

  • Checkpoint Intervalチェックポイントを保存する間隔を設定します
    今回は60F毎にチェックポイントを作成するようにしています

設定ができたらシミュレーションを取っていきましょう
最低限の尺でもいいのですが、今回は比較のために長くとっています

Checkpoint Fileにはグローバルのタイムステップ($F)ではなく
シミュレーションのタイムステップ($SF)を指定する必要があります


取ったシミュレーション
FB_Pop_Sim_Base.gif

シミュレーションを取るとCheckpoint Fileで指定した場所に simファイル が作成されます

$HIP/checkpoint/$OS/
┗ backup
  ┣ Pop_Sim.60.sim
  ┣ Pop_Sim.120.sim
  ...

Restart Sim

ベースとなるシミュレーションが取れたので、
次は、再シミュレーションを行う為のセットアップを行います

Switchノードの作成

pop_network02.jpg

元のPop_SimCACHE_Pop_Simを複製、
そして、複製したDop Network内で Switch ノードと Null ノードを作成します

再シミュレーション前のフレームは計算しないように
Switch ノードの Select Input$SF<60 を設定しておきます


Checkpointを変更

複製したDop NetworkのCheckpointも変更します

pop_resim_cache.jpg

  • 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を一つ上の階層にコピーしています

上記のケース以外でも
古いチェックポイントが残った状態でシミュレーションを掛け直すと
設定を変えても、古いチェックポイントで上書きされるので注意です

下は25F間隔でチェックポイントを取った後(左)に
ソースを変えて再度シミュレーションをした結果(右)
青のソースが赤のソースで上書きされてしまっている

FB_Pop_Sim_Override.gif

設定を終えたらキャッシュを取って確認します

結果

上手くキャッシュが取れていれば、60フレーム目からシミュレーションを再開したものが
保存されているはずです

今回はネットワークを複製しただけなので、再シミュレーションしたものと
元のシミュレーションの結果が一致している事が確認できると思います

FB_Pop_Sim.gif

おおまかな流れについては以上になります
次はもう少し複雑なシーンでのケースを説明していきます

Smoke Sim

FB_Smoke_Sim.gif

smoke_network02.jpg

smoke_sim_dopnet.png

今度は、煙のシミュレーションを
それぞれ異なるコリジョンを使用して作成したいと思います!

その際、後半のコリジョンに当たる直前からシミュレーションを再開することで
全体のシミュレーション時間を短縮
していきます

Setup

まずソースと、コリジョンとなるジオメトリを用意します

FB_Smoke_Sim_Setup.gif

Base Sim

チェックポイント作成の流れは Pop Sim と大きくは同じですが、
今回はDop Networkではなく、Pyro Solverを使用しているので
若干チェックポイントの設定が異なります

smoke_network.jpg

ここでは一旦、下記のように設定しておきます

  • Base Namebackup/$OS
  • Base Folder$HIP/chekcpoint/$OS
  • Checkpoint Interval を 100

Houdini 20.5 まではチェックポイントのパラメータが表に出ていないので、
その場合はアセット内の Dop Network で指定する事になります

設定ができたらシミュレーションを取っていきましょう


取ったシミュレーション
FB_Smoke_Sim_Base.gif

Restart Sim

続いて再シミュレーションのためのセットアップをしていきます

Checkpointを変更

smoke_resim_network.jpg

  • Base Name はベースシムで書き出した simファイル の一つ上の階層を指定
  • Base Folder はベースシムのフォルダを参照
  • Checkpoint Interval再度保存されないように大きい値を指定

また、前半部分はベースのシミュレーションを使用したいので
Switch ノードで切り替わるように設定しています

simファイル をコピー

Base FolderBase Name で指定した場所に simファイル をコピーします

$HIP/checkpoint/$OS/
┣ backup
┃ ┣ Smoke_Sim.100.sim
┃  ...
┗ Smoke_Sim.100.sim <-- ここにコピー
Dop Network 内を修正

今回はコリジョンを追加したので、Dop Network 内を修正する必要があります

その前に、simファイル が読み込まれた時の Dop Network の状態を確認しておきましょう

read_sim_data_clip.gif

simファイル読み込まれるとDop Network 内のデータが復元されます
既にデータが存在していた場合は、チェックポイントの方が優先されます


ここで問題になるのが、復元されたデータの中に外部参照しているデータのパス
含まれていた場合、チェックポイントで読み込まれたデータは
古いデータのパスを読み込んでしまう事です


例として、Dop Network 内の Volume Source を見てみると
読み込まれたデータの soppath が古いパスを指しています

volume_source.jpg

merge_volume_soppath.jpg

デフォルトでは、この soppath のプロパティはデータを作成する段階で設定され、
以降は更新されない状態になっています


これを、チェックポイントが読み込まれた後、
soppath のプロパティが更新されるように修正していきます

Volume Source ノードの場合、 soppath のプロパティを設定しているのは
サブネット内にある Sop Merge Field ノードなので

アンロックして該当のプロパティを Set Always へと変更します

merge_volume.png

set_always_clip.gif

チェックポイントが読み込まれた後のフレームで、
新しいパスが適用されていることを確認します

fix_merge_volume_soppath.jpg

Volume Source が複数ある場合や、他のノードでもプロパティを更新する事もあるので、これらの処理をスクリプトで一括処理しておきましょう

Python
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 のデータは
シミュレーションの開始フレームで作成されるため、
再シミュレーション時には作成されません

collision.jpg

なので

  • Creation Frame を 再シミュレーションのフレーム+1 に変更
  • シミュレーションフレーム($SF)を基準にして 設定するために
    Creation Frame Specifies Simulation Frame をON

にすれば、再シミュレーション時にオブジェクトが作成されるようになります

collision2.jpg


Switch ノードの作成

Pop Sim の時と同様に、再シミュレーション前のフレームは計算しないように
Switch ノードの Select Input$SF<100 を設定しておきます

smoke_switch.jpg

設定が終わったらキャッシュを取っていきましょう

結果

他のコリジョンもそれぞれ同様の設定でシミュレーションを掛けてみます

FB_Smoke_Sim_Contact.gif

Flip Sim

FB_Flip_Sim.gif

flip_sopnet.jpg

flip_dopnet.jpg

今度は、フリップのシミュレーションでも、
それぞれ異なるコリジョンを使って作成していきます

海などのシミュレーションでは、
動きを安定させるために、使用するフレームよりも前に計算を開始させますが、

この前半のベースシミュレーションを用意しておくことで、
再シミュレーション時にはその途中から計算を再開できます

これを使って、フリップでも全体の計算時間を効率的に短縮していきます

Setup

ソースと、コリジョンとなるジオメトリをそれぞれ用意します
また、Ocean Spectrum の動きに合わせるためのフィールドも用意します

FB_Flip_Sim_Setup.gif

flip_sopnet2.jpg

Base Sim

Smoke Sim と同様にチェックポイントの設定

flip_checkpoint.jpg

設定ができたらシミュレーションを取ります


取ったシミュレーション

FB_Flip_Sim_Base.gif

Restart Sim

続いて再シミュレーションのためのセットアップをしていきます

flip_sopnet3.jpg

Checkpointを変更

flip_checkpoint2.jpg

  • Base Name はベースシムで書き出した simファイル の一つ上の階層を指定
  • Base Folder はベースシムのフォルダを参照
  • Checkpoint Interval再度保存されないように大きい値を指定
simファイル をコピー

Base FolderBase Name で指定した場所に simファイル をコピーします

$HIP/checkpoint/$OS/
┣ backup
┃ ┣ Flip_Sim.200.sim
┃  ...
┗ Flip_Sim.200.sim <-- ここにコピー
Dop Network 内を修正

Smoke Sim と同様にDop Network 内を修正します

Switch ノードの作成

flip_switch.jpg

こちらも、再シミュレーション前のフレームは計算しないように
Switch ノードの Select Input$SF<200 を設定しておきます

FLIP Collide を修正

再シミュレーション時にコリジョンのトポロジーが異なる
切り替えのタイミングで正しくコリジョンが変形されず、破綻してしまう事があるので

切り替えた時点の Surface Collide を無効にするように設定します

flip_collide.jpg

これらの設定が終わったらキャッシュを取っていきましょう

結果

FB_Flip_Sim_TypeA.gif

他のコリジョンもそれぞれ同様の設定でシミュレーションを掛けてみます

FB_Flip_Sim_Contact.gif

ツール化

毎回セットアップをするのも、大変なので
スクリプトで自動化してしまいましょう

一から作成すると長くなってしまうので、
セットアップのためのパラメータを こちら に用意しました
その中の restart_sim_setup.ds をどこか任意の場所に保存して下さい

ds ファイルの読み込み

まず、パラメータを保存した dsファイル を読み込みます

ds_import01.jpg

ギアメニューから
Install Parameters From File... を押して先程の dsファイル を指定

ds_import02.jpg

そうするとパラメータが読み込まれます

ds_parm01.jpg

設定

Pop Sim で行った処理をここに当てはめてみます

ds_sopnet01.jpg

ds_parm02.jpg

  • Source Sim Source Filecache にベースのシムとキャッシュを指定
  • Target Sim Target Filecache に再シミュレーションのシムとキャッシュを指定
    ※複数ある場合は Targets の数を増やして同様に指定
  • Simulation タブで開始フレームやチェックポイントの書き出し先などを設定します
    Restart Frame には再シミュレーションの開始フレームを設定します
  • Clear Source Checkpoint はソースで指定しているチェックポイントを削除します
    ※チェックポイントを削除する理由は こちら の赤いノートを参照
  • Copy Checkpoint to Target でターゲットで読み込むチェックポイントをコピーします

実行

設定を終えたら上部にある Setup Checkpoint のボタンを押して
セットアップを実行します

ds_sopnet02.jpg

シミュレーションノードの
チェックポイントやサブステップ、開始フレームなどが設定されます

ds_sim01.jpg

ds_sim02.jpg

ファイルキャッシュノードの Pre-Render Script にそれぞれスクリプトが設定されます

  • ベースシムはシミュレーションを実行する前に古いチェックポイントの削除
    GUIで実行した時は、チェックポイントを削除するかどうかのダイアログが出ます
    ds_filecache01.jpg
    ds_confirm01.jpg

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

CACHE_Pop_SimCACHE_Pop_ReSim をそれぞれ取れば完了です!

おわりに

長文になりましたが、以上となります

今回はチェックポイントを利用したパターン出しの方法を書きましたが、
この方法が絶対!! という訳ではなく、こんなやり方もあるんだなぁぐらいに
思って頂ければなと思います

誰かのお役に立てれば幸いです
ありがとうございました!!

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?