記事の目次

    DOPを使ってParticleを生成します。

    TEXT_秋元純一 / Junichi Akimoto
    (トランジスタ・スタジオ/ディレクター)
    日本でも指折りのHoudini アーティスト。
    手がけてきた作品は数々の賞を受賞している。
    代表作に、HIDETAKE TAKAYAMA『Express feat. Silla(mum)』など。
    CGWORLD Online Tutorialsにて、
    「Houdini COOKBOOK +ACADEMY」
    開講中

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


    EDIT_小村仁美 / Hitomi Komura(CGWORLD)



    CGWORLD Online Tutorials
    「Houdini COOKBOOK +ACADEMY」はこちら

    POPを入り口に、SOPとDOPのちがいを理解しよう

    今回は、POPを使ったParticleの基礎制御を解説していきたいと思います。POPはもともとは別のネットワークとして存在していましたが、数年前にDOPへと統合され、より高速に、より複雑に制御できるように進化しました。ただ、名残として、POPという名称がDOP内のオペレータへ残っています。少し紛らわしくもありますが、慣れてしまえば違和感はなくなるでしょう。

    今回からDOPの解説も少しづつ織り交ぜていきますが、まずは簡単に概要を解説していきます。SOPとDOPの大きなちがいは、データのもち方です。SOPでは、各コンポーネントのAttributeが大きな役割をもっていましたが、DOPでは主にDataが重要になります。時間軸で変化するデータがどのように格納されているのか、まずは感覚的にわかるようになることが大切です。

    特にSOPからDOPの作業へ初めて入るときは、その感覚のズレが問題になることがよくあります。まったく別の性質をもったネットワークということを十分に理解して、今後のシミュレーション作業へ向けて準備しましょう。今回は、感覚としてSOPに近いPOPを理解することで、DOP理解への足がかりになればと考えています。

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

    01 SOP Flow

    SOPでシミュレーションの下準備をします。

    シミュレーション前に、まずはSOPで必要なジオメトリの準備を行います。今回必要になるのは、Particleが衝突するコリジョン用のジオメトリと、床に相当するジオメトリになります。床はシミュレーションセッティング時に代替えのジオメトリを用意しますが、レンダリングする際にも必要となるので、ここで準備しておくと良いでしょう【A】。また、今回はフラットな床なので、代替えが効きますが、複雑な形状をもつ背景などは、ここでしっかり準備しておくことが重要です。

    このフローで大切なのは、Particleのシミュレーションに対して、最適なジオメトリになっているかどうかです。例えば、衝突判定しにくいモデルなどは、SOPの時点で簡易的なモデルへ調整しておくことなどが必要な作業になります。シミュレーションは、コストが低いに越したことはありませんので、なるべく必要最小限のデータ構成にしておきましょう。今回は、いつも使用しているスキャンモデルを調整し、PolyReduce SOPを使ってポリゴンを軽減しています【B】。これで衝突判定用のジオメトリの準備ができました【1】


    02 SIM Flow

    シミュレーションのフローを解説します。

    まず、先程準備したジオメトリの他に、Particleを発生させるエリアを決めます。今回は、Circle SOPを使ってそのエリアを設定します【A】【1】。ネットワークを跨ぐ作業になりますので、Nullを使って、ノードの区切りとなるアイコンノードを作成しておきます。Nullは何も行わないノードですので、栞の代わりに使用します。その際、わかりやすい名称を、PrefixやPostfix、Digits(末尾の数値)などを使って管理すると良いでしょう【B】。次に、DOP Networkを作成します。これがシミュレーションを行うネットワークで、この内部がDOPとなります【C】

    DOP内部に入り、必要なノードを組んでいきます。まず、Particleを発生させるにあたり重要なノードが、POP Object DOPになります【D】。このノードは、Particleの情報を格納する箱のようなイメージです。その次に、POP Solver DOPを作成します【E】。これは、格納した情報を基に計算を行うノードです。このとき、ノードのコネクションに注意します。グレーがオブジェクト情報、緑もしくは紫などが、データの情報になります。このように、DOPではアウトプットとインプットの種類が分けられています。


    次にPOP Source DOPを用意します【F】。これは、Particleを発生させるジオメトリを読み込んだり、発生するための設定を行う箇所で、POPの設定では最も重要な部分です。今回は、Particleがコリジョンに衝突した際に、分裂するイベントを作成しています。それを設定するのが、POP Group DOP【G】およびPOP Replicate DOP【H】です。

    続いて、Gravity DOP【I】を用意します。これはシミュレーションに重力の作用を追加するノードです。別系統で、Ground DOP【J】とStatic Object DOP【K】を用意します。それらをMergeしてStatic Solverに接続し【L】、この系統とPOPの系統をMergeします。DOPにおけるMergeは、SOPとはまったく異なり、それぞれの系統をどのような関係性で紐づけるか設定するための重要なポイントとなります。GroundやStaticはコリジョンです。そのため、MergeはCollide Relationshipに設定します。また、デフォルトでは左側のインプットが右側に影響するため、質量の重いものを左側にすると良いでしょう【M】。最後に、シミュレーションしたい場所にOutputのフラグを立ててノードの配置は完了です【N】。以下にそれぞれのDOPのパラメータについて解説します。

    ●POP Object DOP & POP Solver DOP


    • POP Object DOPはParticleの情報を格納したり、性質の簡単な設定を行うノードになります。ここでは、BounceやFrictionなど、動きにまつわる初期設定を行なっています。非常に重要なノードではありますが、基礎段階では設定やカスタマイズする機会も少なく、ただそこに設置すればよいという性質のノードです


    • POP Solver DOPはParticleのシミュレーションを演算するために設定します。シミュレーションの精度などもこのノードで設定します。今回は、Add Hit Attribute【2】を設定し、衝突判定のAttributeをデータに格納しています。ここも、初期段階ではあまり設定を変えなくても、シミュレーションは上手くいくことが多いですが、シビアなセッティングが必要になるシチュエーションも存在しますので、ひと通り目を通しておくと良いでしょう

    ●POP Source DOP


    • POP Source DOPは今回最も設定が必要なノードになります。Particleの発生に伴うセッティングはここにまとまっています。まず、SourceタブのEmission TypeをScatter onto Surfacesに設定します【3】。これはサーフェス上に発生させるもので、他にはPointから発生させたりなど、発生のタイプを設定できます。次に、どのジオメトリから発生させるかを設定します。Geometry SourceはUse Parameter Valuesに設定し、SOPから、準備したジオメトリを選択します【4】。このように、ここはどの場所から発生させるかを設定するタブになります


    • Birthタブでは、発生の量や寿命を設定できます。Impulseはフレームごとの数、Constantは毎秒になります。ActivationはON/OFFの設定で、CountもしくはBirth Rateで数を設定します【5】。次にLife ExpectancyでParticleの寿命を設定します。Life Varianceはバラツキのことで、今回の設定の場合、Life Expectancyの1/2のバラツキが発生しますから、1~3秒で寿命を迎える設定になります【6】。このように、ここでの数値の単位は秒です


    • Attributeタブでは、その名の通りAttributeにまつわる設定を担っています。主に、SOPから読み込んだSourceからInherit Attributeで引き継ぎの設定をします【7】。次に、Initial VelocityでVelocity(速さ)の初期設定をします【8】。今回は、Add to inherited velocityに設定し、初期速度に新たに値を足しています。最後に、Add ID Attributesです【9】。Particleは増えたり減ったりしますので、Point番号での制御はしません。そのため、発生してから消えるまで変わることのない、IDを追加します。これはParticleにおいて重要な考え方です


    • Streamのタブでは、Stream Nameを設定します。Streamとは、このPOP Source DOPで設定し、発生したParticleのながれを指します。その名前は、デフォルトではPOP Source DOP自身の名前にstream_のPrefixがついたPointグループになります


    • Bindingsのタブは、このParticleの情報が格納される先を設定する項目です。後述しますが、DOPではデータが格納される場所があり、今回のParticleの場合はGeometryというデータ名で情報が格納されています。これは、後々複雑なシミュレーションを行なったり、カスタマイズする際には必要な知識となります

    ●POP Group DOP


    • POP Group DOPでは、Particleに対して、設定した条件で各Particleをグループ化することができます。今回は、POP Solver DOPで設定したAdd Hit Attributeの情報を基にグループを作成しています。Group Nameは任意で設定し【12】、RuleをVEXpressionで記述します。概要としては、衝突したかどうか、衝突の回数が1回かどうかを判定し、もしその通りならグループに入れるという条件文になっています【13】。こうすることで、衝突した際に分裂するイベントを発生させることが可能になります

    ●POP Replicate DOP


    • POP Replicate DOPでは指定したグループ【14】からParticleを新たに発生させることができます。発生の数や寿命の設定は、POP Source DOPのBirthタブと同等で【15】、今回の場合はKill Original Particle【16】を設定し、発生の際に元のParticleを消しています。今回これを使用している主な理由は、バウンドする際にランダムな方向に飛ばしたいからです。Inpulse Countを大きくすれば、分裂が多くなります


    • Shapeタブでは、発生の際にどのようなかたちで発生するかを設定できます。今回は、Particleのその場所から発生すれば良いので、ShapeをPointにしています【17】


    • AttributeタブもPOP Source DOPと同等です。ソースとなるParticleのAttributeを引き継ぎ、VelocityにVarianceをつけてバウンドさせます【18】

    ●Static Object DOP


    • Static Object DOPは今回は説明を割愛し、SOPからジオメトリを読み込む際の設定だけ解説します。今回はSOP Pathで指定したジオメトリを読み込んでいます【19】。このノードは、今後のシミュレーションには欠かせない要素のひとつです。ただの静止物として鎮座していますが、この設定はシミュレーションのコストに多大な影響を及ぼします


    次ページ:
    03 Post Flow

    [[SplitPage]]

    03 Post Flow

    シミュレーション後のフローを解説します。

    シミュレーションの設定が完了したら、SOPに戻り、DOP I/O SOP【O】を設定します。DOP Networkと読み込みたいDOP Nodeを指定して【20】、PresetからParticleに設定します【21】。そうすると、設定したObjectがもつデータからGeometryを指定します【22】。これで、Particleのジオメトリ情報だけをSOPにインポートすることができます。さらにこのノードは、このままジオメトリキャッシュを書き出すことも可能です【23】


    最後に、VOP【P】を使って、レンダリングのためのセッティングを行います。今回は、簡単にLifeとAgeからグラデーションを作り【Q】、色と明るさをAttribute化します。ディテールとしてNoiseなども加えていますが、これは好みで構いません【R】。また、IDからランダムな大きさのPscaleを作成し、レンダリングの際の粒子の大きさとします【S】


    このように、シミュレーションはかけっぱなしではなく、SOPでの調整を含めて完了するイメージをしてください。それが、Houdiniでシミュレーションをかける醍醐味です【24】

    04 Operators

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

    ●DOP Network

    今回の主要オペレータはDOP Networkです。今後メインで使用していくノードでもありますが、その内容は非常に複雑で、理解には時間がかかります。このノード自体はネットワークへの入り口になるノードでしかありませんが、その考え方を今回の例を通しておさらいしたいと思います。

    DOP内でGeometry Spreadsheet【25】を確認してもらうと、SOPでのものとは若干異なることが見て取れます。左のツリーには、DOPの構造が記されています。そこには、今回作成したObjectがあり、それぞれのRelationship(関係性)があり、Objectの中には、様々なデータやSolverが格納されているのが確認できます。その中で、POP ObjectのGeometryを確認すると、ParticleがもつAttributeを見ることができます。これはSOPのときに見慣れている状態だと思います。その他のデータは、DOPで初めて見るものですが、Geometryで想像できるように、それぞれのデータでは、それにまつわるものが格納されているイメージです。


    DOPでは、【26】のようにObjectとそれぞれの関係性、データが存在し、それをSolverが毎フレーム再帰しながら計算を積み重ねるしくみになっています。SOPでキーフレームをつけたアニメーションとは、構造自体がまったく異なるため、ここを理解しないと混乱します。今後のシミュレーション作業のためにも、このワークフローを常にイメージできるようにするのが望ましいですね。