記事の目次

    CGWORLD MASTERCLASS ONLINE vol.9

    開催日:2022年9月17日(土)~18日(日)
    時間:11:00~18:30(予定)
    コース:Houdiniアドバンスコース
    価格:22,000円(税込) → 早期割引20%OFF:17,600円(税込)【8月31日(水)まで】
    公式サイト:https://cgworld.jp/special/masterclass-online/vol9/

    ●CGWORLD Online Tutorialsにて特別無料配信中!
    【無料】Houdini COOKBOOK +ACADEMY 特別編 ~コロナをやっつけよう!~

    Packed RBDをAdvectionで制御するフロー

    今回はPackを使ったRBDを、VelocityのAdvectionで制御するフローを紹介します。

    大量のRBDジオメトリを制御するためにPackは必要不可欠で、高速なシミュレーションを可能にしてくれます。その恩恵は計り知れないものがあり、今ではストレスがかなり低くなったと思います。また、Packで制御することでParticleライクなアプローチが容易で、割と自由度が高く、あまり難しく考えることなく直感的な制御もそこまで難しくないのも魅力的です。

    今回は、Advectionの下準備とRBDのシミュレーションを2つに分けたフローとなっています。同時に行うこともできますが、今回はあまり意味がないので、敢えて2つに分けることで、デバックのしやすさや制御の簡易化などを図っています。

    Houdiniでは、様々なシミュレーションにおいて、それぞれの良い部分やデータを抜き出して再利用が可能なため、斬新な動きを作りやすいと言うメリットがあります。今回のような作例は正にそれを話す上ではうってつけのモチーフだと思います。

    今回のHoudiniプロジェクトデータはこちら

    01 Geometry Flow / ジオメトリ準備のながれ

    ベースのジオメトリを読み込み【A】、PolyReduce SOP【B】で必要最小限にリダクションします【1】。Point from Volume SOP【C】を使って、ジオメトリの形状に対してPointをグリッド状に作成します【2】

    リダクションしたジオメトリと作成したPointを使って、Voronoi Fracture SOP【D】でジオメトリを分割します【3】。この際、Point数によっては非常に重い計算になりますが、気長に待ちましょう。分解したジオメトリをPack SOP【E】を使って、Packに変換します。この際、Name Attributeで"name"を使用することで、分割したジオメトリそれぞれでPackにすることができます。これをキャッシュしておきます【F】

    02 Smoke Flow / Smokeシミュレーションのながれ

    続いて、動きの元となる、Smokeのシミュレーションを作成します。

    まず、ソースを用意していきます。Pyro Source SOP【A】を使って、ジオメトリのVolumeからPointを作成します。次にRest Position SOP【B】で"rest"を作成し、VOP【C】でノイズを使ってデフォームします。Sphere【D】のPrimitiveを使って、中心点からの距離をVOP【E】を使って求め【1】、その範囲に入るPointの"temperature"の値を変更します【2】

    VOPではDistance VOP【F】で距離を計算し、Fit Range VOP【G】やRamp Parameter VOP【H】を使って範囲を調整します。Wrangle【I】を使って元のPositionに戻して、Volume Rasterize Attribute SOP【J】でPointをVolumeに変換します。これによって、"temperature"のVolumeが範囲によって変動するソースを作成できました【3】

    次に、Dopnet【K】でSmokeのシミュレーションを行います。

    今回は、Smoke Object【L】をSparseで作成し、同様にSparseのPyro Solver【M】で演算を行います。ソースは、Volume Source【N】でDensityとTemperatureを読み込みます。その際、Densityは序盤のフレームだけ読み込むようにしておきます。また、Temperatureは常に読み替えられるように設定しました。これで形状や動きを調整して【4】、DOP I/O【O】でFieldを読み込み、キャッシュを取って完了です。

    03 RBD Flow / RBDシミュレーションの手順

    次に、RBDのシミュレーションを準備します。

    グリッド状に分割したジオメトリに対して、"temperature"のVolume情報から、Atttribute from Volume SOP【A】を使って新たにAttributeを作成します。このAttributeをAttribute Reneme SOP【B】で"active”と変更しておきます。これにより、RBDで動き出す際の切り替えを行うための情報が作成できます【1】。これで、Packed RBDの準備が整いました。

    続いて、Dopnet【C】でRBDのシミュレーションを行います。

    Packed RBD Object【D】で作成したPackのジオメトリを読み込みます。Bullet Solver【E】を用いてシミュレーションを演算します。SOP Solver【F】で、元々のジオメトリからアニメーションしている"active”のAttributeを読み込み【G】、それをAttribute Copy SOP【H】でシミュレーションジオメトリに移します。そうすることで、Dop内の"active”の値が更新されます。

    Advect By Volume【I】を使って、SmokeのシミュレーションキャッシュからVelocityの値を使って、Packed RBD Objectに対して動きを追加します。Particleと同等の考え方ができるので、簡単に動きを移すことができます。これらのDataをMultiple Solver【J】を使ってObjectに適用します。Dop Import SOP【K】を使ってObjectを読み込み、キャッシュを取り【L】PackのRBDシミュレーションが完了します【2】

    04 Operators / 今月のオペレータ

    今回紹介するのはMultiple Solverです。

    直接的に今回の作例を支えてくれたオペレータではありませんが、これなしでは複雑なシミュレーションのセッティングができないと言っても過言ではない、縁の下の力持ちです。

    Dop内において、ObjectとDataの関係性、またSolverの立ち位置など、実際に肌感覚で理解できるようになるには、ある程度の経験が必要です。Objectに対してDataを新たに適用するなど、その他にもApply Dataなどのオペレータもありますが、今回はMultiple Solverのみで構成しています。

    今回のRBDシミュレーションのように、Dataを新たに更新したりVelocityの情報を更新したりなど、複雑な要素が絡み合う際にしっかりとしたシミュレーションの結果を得るためには、こうしたセットアップが必要不可欠となります。どういったシチュエーションで必要になるかはその都度考える必要がありますが、基礎知識としての構成はある程度引き出しに入れておくとスムーズなフロー設計が行えます。

    「Houdini COOKBOOK +ACADEMY」 Houdiniを基礎から楽しく学ぶオンライン講座

    公開日程:毎週金曜日公開(予定)
    価格:1,300円(税込)※セットでの割引販売有
    ※第一回「Houdiniの基本概念とインターフェイス」は無料公開中
    受講対象:Houdiniをこれから学びたい方、Houdiniの勉強で挫折した方など
    cgworld.jp/special/houdinicookbookacademy

    秋元純一 / Junichi Akimoto(トランジスタ・スタジオ/取締役副社長)

    日本でも指折りのHoudini アーティスト。
    アーティスト業務の傍ら、Houdiniアーティスト育成や布教活動に勤しむ

    www.transistorstudio.co.jp
    blog.junichiakimoto.com

    TEXT_秋元純一 / Junichi Akimoto
    EDIT_小村仁美 / Hitomi Komura(CGWORLD)