記事の目次

    プロシージャルモデリングの基礎を解説します。

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


    EDIT_小村仁美 / Hitomi Komura(CGWORLD)

    プロシージャルな考え方

    今回紹介するテクニックは、Houdiniでは最も基礎的な考えであるプロシージャルなモデリング方法に迫ります。基礎中の基礎でもあるこの考え方は、後々Houdiniを使いこなす上で、非常に重要な礎になってくるでしょう。

    今回はUVを作成しながらモデリングするゲームアセットなどにも応用できる内容です。単純なモデリングですが、UVをプロシージャルに作成しつつ、モデルもプロシージャルなアプローチで作成していくのは、なかなかセットアップが大変な作業でもあります。

    今回紹介する作例は鎖ですが、実際にこういったつくり方をする方が少ないかと思われます。ただ、こういったアプローチを理解することで、大量のくり返しのモデリングやランダムなモデリングに対し、Houdiniならではの制御を組み込むことが可能になります。

    鎖をつくることが今回の目的ではなく、一括制御や自動作成にフォーカスして考えてください。UVは基本的に後付けすることが多いですが、Houdiniでは、UVを意識したモデリングが可能であることが今回の作例で理解できるはずです。また、それがプロシージャルモデリングへの意識改革には非常に重要なポイントとなってきます。

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

    01 All Flow

    全体のワークフローを紹介します。

    全体のながれを確認してください。大きくは、鎖のリングを作成する部分になります。ここがプロシージャルなモデリングの要になります。作成したリングをカーブにコピーすることで、鎖を作成します。

    ノードの全体像




    • まずはリングのベースを作成していきます。Circle SOP【A】を使い、弧を作成します。このとき、Polygon【1】でArc TypeをOpen Arcに設定し【2】、180度の半円の弧を作成します【3】


    この弧に対し、Add SOP【B】を使用して両端にPointを追加します。Delete Geometry But Keep Points【4】でPointのみにして、2点追加します。このPointの座標は、ベースの弧の半径や位置、Divisionsなどから自動的に算出します【5】。こうすることで、弧のサイズや分割数が変わっても自動的に変化についてきます




    • さらに、[Polygons→By Pattern]から一括でPointをつなぎ、Polygon化します【6】。このときに$Nを使用することで、Pointの数が変わっても、こちらも自動的に対応するセットアップにしておきます【7】



    • この弧をMirrer SOP【C】でY軸方向へ鏡面コピーし【8】、 Join SOP【D】を使って2つの弧を1つのPrimitiveになるようにコネクトします。Wrap Last to Firstをチェックすることで、閉じた状態になります【9】【10】




    • このときはPolygonなので、Convert SOP【E】でU Orderが2のNURBSへ変換し【11】、Carve SOP【F】を使って、First Uを0の位置でカットします【12】




    • 次に、このNURBSに対し、UVを作成します。UV Texture【G】を使って、Arc Length Spline【13】をPointのクラスで作成します【14】。PointクラスでUVを作成する必要があるため、Carve SOPであらかじめカットしておく必要があります。また、Arc Length SplineはPolygonでは上手く動作しませんので、こちらもNURBSに変換しておくことも重要です。UVはUの方向へ作成しており、0~1の範囲に収まっています【15】。ただ、Arc Length Splineで作成することで、Pointの距離に応じて作成できるため、比率を維持することができます



    • Measure SOP【H】を使い、Perimeterでカーブの長さを計測し【16】、PerimeterのAttribute名をlengthへ変更します【17】。また、lengthはPrimitiveクラスのAttributeですので、PointへAttribute Promote SOP【I】を使ってクラス変更します。このlengthを使って、UVのUの値へ乗算しその積を新しいUVのUの値とします【18】【19】。このような単純な計算の場合は、Attribute Wrangle SOP【J】を使用すると簡単です




    • このカーブに対して、NおよびupのAttributeを作成します。これは後々コピーする際に必要となるAttributeです。Poly Frame SOP【K】を使用し、NormalNameを"up"【20】、Tangent Nameを"N"【21】とします。こうすることで、Tangent方向へ法線を作成することができます。この2つのベクトルを作成する手順は、配置の際に回転を指示するためのセオリーのようなもので、手癖としてできるようになっておくと便利です。これで、リングのベースとなるカーブが完成しました【22】


    次ページ:
    02 All Flow-2

    [[SplitPage]]

    02 All Flow-2

    次に、リングの断面となる円をCircle SOPを使って作成します。このとき円はUOrderが2のNURBS、またOpen Arcで360度の弧として作成しましょう。後は同じ手順でUVを作成し、長さを計測の後、比率を乗算しておきます。これで断面の完成です。この断面はくれぐれもUVの値は、V方向へ作成しておきます【L】



    • これら2つのカーブをCopy SOP【M】を使って配置します。このとき、Attributeを設定します。To PointへlengthをSetへ、uvをAddへ設定します【23】。ここが重要なポイントで、UとVを加算することで、それぞれのPointへ再配置することができます【24】。これはPointのAttributeであることが重要となります





    • Wrangle【N】でUVの比率を0~1の範囲に収めます【25】。このときに、lengthのAttributeを使用します【26】。 また、UVをVertexのAttributeへクラス変更します【O】。その後Fuse SOP【P】を使って切れているPointを接続し、Polygonへ変換します【Q】。最後にSkin SOP【R】を使ってPolygonを張って、UVを自動生成したリングの完成です【27】


    リングを配置するしくみをつくります。まず、リングのサイズを調整します。Transfrom SOP【S】でExpressionを使い、内径を1に揃えることで、後々制御しやすいでしょう【28】



    • 次に、カーブをResample SOP【T】で分割した際のLengthにTransform SOPでリサイズします【U】。これでコピーの準備が整いました。ベースとなるカーブにはPolyFrame SOPでNとupを作成しておきます【V】。それに対し、リングをコピーします【W】。このとき、Stampを使い【29】、1つ飛ばしで90度回転させながらコピーするように、Variableを作成します【30】。その値をTransfrom SOP【X】へStampし、鎖の完成です【31】。必要に応じて、UV Layout SOP【Y】を使って並べ直してもよいでしょう【32】

    次ページ:
    03 Operators

    [[SplitPage]]

    03 Operators

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

    Join SOP

    Join SOPは、開いたPoygonカーブなどを単一のPrimitiveへ繋げることができるノードです。

    Blend:Primitiveをどのようにつなげるかを設定できます。例えば、BlendがONの状態でToleranceが1の場合、PointがBiasに伴った位置でブレンドされた状態でコネクトされます。OFFの場合、元々の位置でコネクトされます。
    Multiplicity:接続された際に滑らかに接続されます。これは、PolygonやMeshには影響しません。
    Connect Closest Ends:Primitiveの順番ではなく、端点の近接度に基づいてコネクトします。
    Join:コネクションするためのルールを設定します。例えば、Nの数だけスキップするなどが可能です。
    Wrap Last to First:最初と最後のPointをコネクトし、Primitiveを閉じます

    今回のフローでは、Mirror SOPで上下に配置された弧を閉じるために使用しています。単純にPointを接続するのではなく、1つのPrimitiveとして変換するため、今回のようなシチュエーションには重要なSOPの1つです。カーブを扱う際には非常に使用頻度の高いものとなります。ただ、扱いには若干の癖があります。例えば、多数のカーブを扱う際などは、工夫が必要になるシチュエーションも多いです。

    UV Texture SOP

    UV Texture SOPはジオメトリにテクスチャUV座標を割り当てる役割をします。UVはAttributeとしてジオメトリへ追加されます。

    Texture Type:UVを投影するタイプを設定する箇所です。様々なタイプが準備されており、基本的な投影はここで設定可能です。ただし、あくまでも基本的な投影やジオメトリの情報に基づいたものですので、エッジを選んで展開するなど、複雑な展開方法には対応していません。
    Projection Axis:投影する際の軸を設定します。
    Attribute Class:UVが作成される際のAttributeのクラスを設定します。デフォルトではVertexに設定されています。

    カーブを扱うシチュエーションで重要な役割を果たすSOPです。Houdiniにおいては、UVはテクスチャのためだけに存在するものではありません。XYZの3D空間とは別のパラメトリックな座標系として、ジオメトリがもっていると何かと便利なAttributeとして機能させることができます。使い方は様々ですが、こういったイレギュラーなアプローチの積み重ねがHoudiniを輝かせるのです。

    あとがき

    今回は、UVを作成しながらモデリングをするためのアプローチを紹介しました。通常は、ジオメトリが完成してからUVを作成すると思いますが、今回のような組み立てをしておけば、ジオメトリの分割数が変わろうと、数が変わろうと、形が変わろうと、UVを取り直す必要はまったくありません。Houdiniはこのような大量くり返しのために様々なアプローチを生み出すことができます。今回のサンプルは非常に簡単なものですが、これを応用すれば様々なシチュエーションへ対応するしくみをつくり出すことができます。まずはHoudiniのプロシージャルな考え方に慣れていくことが必要です。