VDBを用いてレイヤー状のジオメトリをプロシージャルにつくる方法を解説します。

記事の目次

    「HOUDINI COOK BOOK +」リリース!


    CGWORLD Online Tutorialsは、これからHoudiniを学習しようとしている方に向けて「Houdini COOKBOOK +Academy」を改訂しHoudini 19.5をベースとしたオンライン講座「HOUDINI COOK BOOK +」を11月7日(月)にリリースしました。

    第1回を無料公開中!! 1-1【無料】HOUDINI COOK BOOK + 《Introduction》-Houdiniを知る、導入、習得するまえに

    レイヤー構造をもったジオメトリ

    今回は、レイヤー構造をもったジオメトリをプロシージャルに作るアプローチを紹介します。

    プロシージャルモデリングに関しては、度々紹介していますのでそれが何たるかは割愛しますが、Houdiniを使いこなす上では、エフェクトと同等にプロシージャルモデリングもキーポイントになります。Houdiniにおけるモデリングとは、アニメーションなども入れ込みながら形状を作成できるという点で、最早エフェクティブな部分もあり、その区別は難しい部分でもあります。

    今回は、アニメーションは入れ込んでいませんが、当然動いている状態で作成することも可能なしくみとなっています。細かく重ねられたレイヤー構造をもつジオメトリなのでPolygonカウントでは重量級になりますが、キャッシュを取ればそのストレスも軽減しながら最終までもっていくことが可能なのもHoudiniの良いところです。

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

    01 All Flow / 全体のながれ

    ベースのジオメトリを読み込み【A】【1】、VDB from Polygons SOP【B】を使って、VDBでSDFを作成します【2】。 今回は、全体をFor【C】で複数回処理することで、レイヤー構造を作成しています。同等の処理をIterationのIndex【D】を利用し少しずつずらしながら行うことで、複雑な形状を簡単に作り出すことが可能になります。以降の手順は全てFor内部の1処理を解説したものです。

    読み込んだSDFにVDB Reshape SDF SOP【E】を使って、Iterationごとに少しずつシュリンクしていくように設定します【3】。詳細なパラメータは次項①にて解説します。

    そのSDFをいったんConvert VDB SOP【F】でFogに変更します【4】。このFogに対して、Volume VOP【G】でNoiseを乗算します。Noiseの値はIterationごとに少しずつかかり方を変えていきます(VOP内部、パラメータは次項②で後述) 。

    このFogをConvert VDB SOPでSDFに戻し、さらにPolygonへ変換します【H】【5】

    このPolygonに対して、VOP【I】でシュリンクしたSDFとの距離を計測し、Attributeを作成します【6】(VOP内部、パラメータは次項③で後述)。

    Rest Position SOP【J】を使って現在座標をAttribute化し、Wrangle【K】によりSDFとの距離のAttributeを使って、X軸方向へ一列に整列させます。それをClip SOP【L】を使ってカットします【7】。この後に、Wrangle【M】で"rest"の位置に戻します。こうすることで、Deleteでは作り出せない、リニアな消失エフェクトを作成できます【8】

    カットしたジオメトリのボーダーになっているEdgeを、Group SOP【N】のUnshared Edgeを使ってグループ化します【9】。このEdgeの情報からAttributeを作成し【O】、それを元のジオメトリへAttribute Transfer SOP【P】を使って転送します。こういうアプローチをすることで、Edgeからの距離を変更しやすくします。ボーダーのAttributeはSmooth SOP【Q】を使って滑らかにぼかしておきます【10】

    シュリンクしたジオメトリをPolygonに変換したものにPointの法線を作成します【R】。これをここまでのジオメトリ対して転送します【S】

    VOP【T】を使って、ボーダーの情報とNoiseを使って、ボーダー部分だけを軽くもち上げます。単純なレイヤー感だけではなく、多少の立体感を味付けするディテールになります(※VOP内部、パラメータは次項④で後述) 。

    ここまでをFor【U】に入れ込み、Iterationによるバラつき・ずらしを利用して、レイヤー構造を作成します。パラメータを微調整しながら良いところを探るため、ある程度分割数を減らして検証すると良いでしょう。このアプローチの利点としては、レイヤー構造をForのIterationの数で構成できることと、そのしくみをセミオートマチックに仕込むことができるため、非常にプロシージャルで、リテイク・量産がしやすいことです。 デメリットとしては、Forを使用するため、ある程度Cookingのコストがあり、場合によってはジオメトリも想定よりも重くなる可能性を秘めていることです。

    VDBの分割やレイヤー構造の反復数などとバランスを取りながら調整しましょう。 最後にキャッシュを取って完成です【V】【11】

    02 Each Flow / それぞれの詳細

    パラメータ詳細①

    VDB Reshape SDF SOPはErode【1】で内側にシュリンクします。 その際に、Add Spare Input【2】で作成したパラメータに前項【D】を指定します。 Offsetのパラメータには、detail()関数でSpare Inputを指定し、その"iteration"から値を抽出して、オフセット幅をIteration毎に変更します【3】

    パラメータ詳細②

    VOP内部では、元々SDFからFogに変更した際のNameに対し、Noise【A】を乗算します。ネガティブの値が入らないようにClamp【B】を挟むと良いでしょう。 ここでも同様に、OffsetやAmpritudeに対して、Iterationごとに変化が出るようにExpressionを記述します【4】

    パラメータ詳細③

    VOP内部では、Input2からもってきたSDFの情報を使って、Volume Sample VOP【C】でPointの位置とSDFの情報からその距離を計測します。SDFは、元々のサーフェス表面を0とし、内部が負、外部が正になるように符号をもっています。データを使用しやすいようにFit Range VOP【D】で値を調整します。

    VDBのVoxel Sizeによって自動計算されるようにします【5】

    パラメータ詳細④

    VOP内部では、ボーダーのAttribute【E】を使って、Noise【F】とかけ合わせて、Displace Along Normal VOP【G】で法線方向へもち上げます。これによって、めくれているようなディテールが追加できます。

    Iterationによる変化は他と同様に、めくれ具合を徐々に減らすようなExpressionを組んでいます【6】

    03 Operator / 今月のオペレータ

    ●Volume Sample VOP

    今回、紹介するのはVolume Sample VOPです。

    これまでも何度か登場していますが、今回のしくみをつくる上では欠かせない、縁の下の力持ちです。 SDFをそもそも理解している必要があります。SDFとは符号(Sign)というのが重要な要素で、サーフェス表面からの距離を計測することが可能です。今回はこの性質を利用して、Noiseで作り出した凹凸と元々の表面位置から差分を消し去っています。 シンプルな性能のノードですが、アイデア次第では様々なことが可能なのではと、毎度使用するたびに奥深さを感じるノードだと思います。

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