particle io

パーティクルの読み書き

Houdiniで作成したパーティクルを ASCIIデータとして書き出す方法と、タブで区切ったX Y Z 値の羅列ファイルをパーティクルとして読み込む方法を紹介。ここでは、.chan ファイルフォーマットとして扱う。.chan はチャネルデータをタブで区切ったASCII ファイル。Maya の .mov と同じ。

使用バージョン: Houdini 14.0.453
参考シーンファイルへのリンクは一番下にあり。

1. 元ファイルの作成

元になる簡単なパーティクルシミュレーションを作成する。

  1. Particles シェルフの Location Particle Emitter ツールをクリックし実行。
  2. 作成された AutoDopNetwork の中の location ノードの Const. Birth Rate を 50程度に、
  3. gravity1 ノードをバイパス (ノード左側の黄色いフラグをオンに)し、重力を無効にする。

再生すれば、パーティクルが全方向に放射される。

2. パーティクルの書き出し

パーティクルデータをフレーム連番の .chan ファイルとして出力するには、パーティクルの P (Position=座標) 情報を CHOPで tx, ty, tz に変換し、/out 以下で連番ファイルとして出力する。

  1. /obj で TAB->CHOP Network とするか、/ch へ移動。ここでは、CHOP Network (/obj/chopnet1) を作成し、i キーを押すなり、ダブルクリックするなりして中に入る。
  2. TAB->Geometry で Geometryノード (channel1) を作成。
    1. Geometry タブ以下の SOP に、Operator Chooser から /obj/location_particles/import_location を相対パス (Export Relative Path をオン) にして指定。
    2. Attribute Scope には P、Rename Scope には tx ty tz となっていること(ともにデフォルトのまま)を確認。
  3. /obj で TAB->ROP Network とするか /out へ移動。ここでは /out に行く (特に深い理由はない。どちらでも良い)。
  4. TAB->Channel で Channel ノード (channel1) を作成。
    1. Valid Frame Range を Render Frame Range に変更。必要であれば最初と最後のフレームを変更。
    2. CHOP Path に先ほど作成した channel1 ノードを指定。
    3. Output File にパスとファイル名を指定。連番で出すには out$F3.chan 等とする。
  5. Render ボタンを押せば、パーティクル情報が連番ファイルとして出力される。
  6. 出力先ディレクトリには、上記の設定の場合、240フレーム分の .chan ファイルがあり、それぞれ各フレームで存在するパーティクルの数だけX Y Z 値がタブで区切られ出力されている。例えば以下は1フレーム目のファイル(パーティクルは2個)。
            -0.00499891536310315    0.00223939050920308     0.00306932372041047
            -0.0123176770284772     -0.00221042614430189    0.00426115142181516
    

これでパーティクルの書き出しが終了。

3. パーティクル (データ) の読み込み

書き出したファイルを再度読み込むにも CHOP を使用する。ここでは

  1. CHOPデータの読み込み
  2. パーティクルを一つだけ作成
  3. 読み込んだCHOPデータの数だけパーティクルを複製
  4. 複製されたパーティクルの位置を調整
という順番に行う。
  1. CHOP データの読み込み
    先ほどの CHOP ネットワーク (/obj/chopnet1) の中に TAB->File で File ノード (file1) を作成。
    1. Channel File に書き出したファイル名を指定。正しく連番で読み込まれるようにするには、$HIP/out/out$F3.chanなどと、"$F3" がファイル名に存在するようにする。
    2. Name Options を "Use New Names" に設定。
    3. Name に "t[xyz] を指定。これにより、読み込むデータが tx ty tz と認識されるようになる。
    4. ファイルが正しく読み込まれいるか確認するには、Motion FX View を開き、タイムラインをスクラブ。各フレームの状態が確認可能。下は240フレーム目の状態。
  2. パーティクルを一つだけ作成
    1. /obj に戻り、TAB->Geometry で Geometry ノード (geo1) を作成。i キーを押すなり、ダブルクリックするなりして中に入る。
    2. TAB->Add で Add ノード (add1) を作成。Number of Points を 1 にする。
    これでパーティクルが一つ作成された。
  3. パーティクルの複製
    1. add1 の出力から TAB->Copy を実行、Copy ノード (copy1) を作成。
    2. copy1 の Number of Copies パラメータに以下のエクスプレッションを設定、CHOP ネットワーク以下の File ノード (file1) を指定し、CHOP で読み込まれるデータ行数がパーティクルの数になるようにする。
      chopl("../../chopnet1/file1")


      ただし、この状態ではパーティクルはすべて原点にあるだけ。
  4. 複製されたパーティクルの位置を調整
    1. copy1 の出力から TAB->Channel を実行、Channel ノード (channel1) を作成。
    2. CHOP に CHOP ネットワーク以下の File ノードまでのパスを指定。../../chopnet1/file1
    3. Method を "Static"、Channel Scope を "t[xyz]"、Attribute Scope を "P" に (それぞれデフォルトのまま)。
    4. 表示フラグを channel1 に移せば、ビューポート上にパーティクルが表示される。
  5. 再生すれば書き出したパーティクルのアニメーションと同じ挙動を確認可能。

まとめ

0 件のコメント:

コメントを投稿