記事の目次

    RBDを用いた出現エフェクトを紹介します。

    TEXT_秋元純一 / Junichi Akimoto(トランジスタ・スタジオ/ディレクター)
    日本でも指折りのHoudini アーティスト。
    手がけてきた作品は数々の賞を受賞している。
    代表作に、HIDETAKE TAKAYAMA『Express feat. Silla(mum)』など。
    www.transistorstudio.co.jp
    blog.junichiakimoto.com


    EDIT_小村仁美 / Hitomi Komura(CGWORLD)

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

    プロシージャルモデリングを用いた物体の出現

    出現エフェクトや消失エフェクトは、シチュエーションに合わせて千差万別で、かなりの需要があります。今回は、その中でもインパクトが必要な出現エフェクトにフォーカスを当てて検証しました。

    そもそも出現エフェクトとは、キャラクターや物体が画面内に登場する際に華を添えるものです。無から出現する際にはインパクトのある登場が求められることが多く、光物や煙など、エフェクティブなものから幾何学的なものまで、多種多様です。

    今回検証していくのは、敢えてHoudiniらしくプロシージャルモデリングを用いた物体の出現です。元々のポリゴンモデルから、どのように内部構造を構築して、エフェクティブな要素を足すかを考察していきます。

    今回は単純に2つの要素に分けて考え、表面と内部を作成し、出現させるためのフローをシンプルに組んでいます。エフェクトのフローも考え方によってはプロシージャルモデリングの一要素として組み込むことができ、単純なモデリングのアプローチも考え方をひねれば出現エフェクトとして利用することができます。Houdiniの良いところは、本来の使用方法から外れることが決して間違いではなく、新たな発見の可能性を秘めているというところだと思います。

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

    01 Shell Build

    外皮のジオメトリを作成します。

    ベースになるジオメトリを読み込み、VDB from Polygons SOPでSDFに変換します。それをVDB Reshape SDF SOPを使ってErodeし、VDB Combine SOPで中をくり抜きます【1】。これをPolygonへ変換すれば、外皮のジオメトリを作り出すことができます【A】


    Polygonはそのままだと高解像度すぎるので、必要最小限までPolyReduce SOPを使って削減し、Scatter SOPでPointを作成し、Voronoi Fracture SOPを使って、外皮を分割し、ここまでのながれをキャッシュしておきます【B】。分割した状態は、Exploded View SOPなどで確認しておきます【2】


    シミュレーション用に、Proxyのジオメトリを作成します。そのままPolyReduce SOPにかけると、小さいピースが消失してしまう可能性があり、そうなるとピースの数が合わなくなり不都合が起きます。そのような状況を避けるため、少々フローとしてはコストが高いですが、Forを使って、ピースを1つ1つリダクションします。ピースごとにForで切り分けてPolyReduce SOPを使いリダクションし、その際、Primitiveの数が0になっているようなら、元々のジオメトリを使用するようIfによるスイッチを行います【3】。これによって、ピースの数を維持することが可能になります【C】【4】

    このProxyジオメトリをPackに変換します【D】。それに対してRest Positionを作成し、VOPを使ってNoise Deformをします【E】。Sphere SOP【F】で球のPrimitiveを作成し、その半径がジオメトリを覆うように配置します。中心点が起点となるイメージです。

    VOP【G】を使って、球の中心点からの距離をDistance VOP【H】を使って算出します。その後は距離の値を使って、中心点から末端までを0-1に収めてオフセットできるようにセットアップします。


    Wrangle【I】を使い、Rest Positionから元の形状に戻します。作成した"area"のアトリビュートは、"active"へ変換します。これによって、中心点からエリアを拡大していくようにアトリビュートをアニメーションさせることが可能になります【5】


    シミュレーション用に、さらに少しErodeさせたSDFをPolygonへ変換して、これをコリジョンとします【J】

    02 Shell Simulation Flow

    外皮のシミュレーションを解説します。

    dopnet【A】を準備して、内部でシミュレーションのセットアップを行います。

    RBD Packed Object DOP【B】を使って、Proxyのジオメトリを読み込みます。このジオメトリは"active"のアトリビュートをもち、これがRBD Packed Objectの動き出すタイミングになるため、Overwrite Attribute from SOPでセッティングします【1】


    Bullet Solver DOP【C】はMulti Solver DOP【D】でObjectに適用させています。その他、ForceもPOP ForceやPOP Dragなど、パーティクル向けのForceを使用して制御します【E】。Collisionのセッティングをして、シミュレーションのセットアップは完了です【F】

    シミュレーションはDOP Import SOPを使ってPackとして読み込み、キャッシュします【G】。ハイメッシュのジオメトリに対してPack化を施し、ProxyのFragmentの数が一致しているか確認します【H】

    Transform Pieces SOP【I】を使って、Proxyのシミュレーション結果をハイメッシュのジオメトリに流し込みます。これによって、無駄にハイメッシュのジオメトリでシミュレーションをすることなく、シミュレーションコストを下げることができます【2】


    シミュレーション前の"area"のアトリビュートは広がるアニメーションをしていますが、シミュレーション後のジオメトリにはアトリビュートのアニメーションは無駄に重くなるので適用していません。そのため、Attribute Copy SOP【J】を使って、アトリビュートをそのままコピーします。コピーした"area"のアトリビュートをVOP【K】を使ってRampなどでバイアスを付けておきます。

    Retime SOP【L】で逆再生することで、破片がくっついていくようなアニメーションに変換します。Primitive SOP【M】を使い、PrimitiveのSizeを調整します【3】。VOP【K】でバイアスを付けたアトリビュートは、ここでのアニメーションのタイミングに直結します。これによって、破片がくっつく直前で出現するようなエフェクトが作成できました【4】

    次ページ:
    03 Inside Flow

    [[SplitPage]]

    03 Inside Flow

    内部構造のセットアップを解説します。


    内部構造は、同じしくみを繰り返し作成するレイヤー構造をベースにしました。今回発生する動きのしくみは、シミュレーションの際に作成した"area"のアニメーションをそのまま流用するかたちをとっています。

    レイヤー構造のようなくり返し作業を敢えてマニュアルに間隔などを調整しながら作りこむ場合のアプローチを紹介します。くり返しの場合は、Forなどを使って手作業の煩わしさを省きたいところですが、やはり細部の調整はマニュアル作成にはかないません。そういった場合に役立つ方法を検証します。

    今回はメインとなるストリーム【A】と同等のくり返しのストリーム【B】の2種類に分類されます。最終的にはNormalやタイミングの調整を入れていますが【C】、大きくはメインストリームをくり返しのストリームへ適用するためのながれが重要です。

    基のSDFをErodeして内側に小さくしていき、必要に応じて少しSmoothをかけておきます【D】。このフローは全体にも同じ構造になっていて、Erodeの距離でレイヤー構造を構築しています。

    Compile Blockを使って、くり返しの作業を効率化していきます。

    まず、SDFをPolygonへ変換した後、一定量のリダクションを行い、Rest Positionを追加してNoise Deformをかける一連をCompile Blockで処理します【E】

    次に、距離計測の原点【F】からVOPを使って距離を計測し、距離に応じた座標へPを並び替えます【1】。直線に並んだジオメトリをClip SOPを使用してカットするアニメーションを作成します【2】。その後、Rest Positionから元の形状に戻す一連をCompile Blockで処理します【G】【3】


    ここで注意すべきは、原点【F】をインプットするCompile Beginを作成しておくことです。また、2つのCompile Blockに分けた理由としては、アニメーションが入っている処理を行うために、無駄な処理時間がかかるのを避けるためです。例えば、PolyReduce SOPはアニメーションしていませんが、Clip SOPがアニメーションしているため、1つのCompile Blockにまとめると全て毎フレーム処理されてしまいます。

    Compile Blockでの処理の後は、PolyExtrude SOPで内側に厚みを付けて、Reverse SOPで反転します【H】。また、Retime SOP【I】を使用してアニメーションのタイミングをレイヤーごとに変更できるようにしておきます。最後にGroup SOP【J】でレイヤーごとにグループを作成して完了です。

    この一連を、その他のレイヤーに対して、Invoke SOP【K】を使ってそれぞれ適用して内部構造の完了です【4】


    04 Operators

    主要ノードを解説します。

    ●Clip SOP

    今回大活躍しているノードとしてはCompile Blockが挙げられますが、以前にも詳しく紹介したことがあるので、ここでは、地味に便利すぎるノードを取り上げたいと思います。

    それはClip SOPです。筆者のフローにはいつも欠かせないものとして使用することが多く、大好きなノードのひとつです。

    Clip SOPの機能は非常にシンプルで、方向を決めて真っ直ぐにカットするだけのノードです。その切断能力はすさまじく、基本的に切れないPolygonはありません。ただ問題なのは、方向に対して垂直にしかカットできない愚直さです。そのため影に隠れていますが、使い方次第では非常に強力な武器になるのがHoudiniの良いところです。

    愚直なまでのシンプル機能を逆手に取り、変形させてカットして元に戻すサンドイッチのアプローチをとることで、Booleanよりも確実にカットすることが可能になります。

    Houdniにおいても現実世界においても、シンプルだけど確実なものと言うのは、古びれることなく、使用者の創意工夫によって進化し続けるものと確信しています。


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

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