記事の目次

    Lineエフェクトのアプローチ方法を紹介します。

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


    EDIT_小村仁美 / Hitomi Komura、山田桃子 / Momoko Yamada

    Reboot

    「Houdini Cook Book」は約7年間本誌の方で連載を続けてきましたが、そちらは一旦終了として、装いも新たに本連載を開始することとなりました。こちらはWeb版として、本誌では説明が難しかった箇所や、文字数などに縛られることなく紹介できると考えております。内容も一新して、これまではひとつの作品をつくるということに自分で縛りをつけてきましたが、Web版ではそういった縛りを取り払い、もう少し小分けにしたアプローチを紹介していき、その中で登場したノードや、ワークフローに必要な技術にフォーカスできるようにしたいと考えております。

    本誌で紹介してきたテクニックも、時代と共に古くなっていくものもあります。ただ、レガシーとして知っておいて損のないアプローチももちろん存在します。そういったものをピックアップしたくても、これまでの「作品の中に使用する」という縛りの中ではなかなか登場させることが難しかったのも事実です。Web版では、ある程度のフォーマットを決めてそれらを自由に組み替えつつ、毎月様々なジャンルのワークフローを紹介できればと思います。長年積み上げてきたHoudini Cook Bookの歴史を踏まえつつも、これからのHoudini時代を乗り越えて行くための新しいテクニックをここに集約していきたいと考えています。

    今回紹介するテクニックは、ラインエフェクトの基礎的なアプローチ方法です。PointとLineは、Houdiniのオペレーションの中でも、非常に基本的な技術が凝縮されています。そのため、今回のワークフローはある意味でパッケージ的な覚え方をしてもよいと思います。実際、筆者も様々なプロジェクトでこれを基本形としたエフェクトを制作してきました。After Effectsなどでも同じようなエフェクトを素早く制作できますが、自由度は言わずもがなHoudiniに軍配が上がります。

    今回重要になってくるのが、Pointをどのようにしてラインに変換するか、また、そのラインをどのようにアニメーションするかという点です。こういったワークフローは様々なアプローチが存在しますが、今回はSOPのみを使用したインタラクティブ性にこだわっています。これもエフェクト制作には重要になってきます。そのために使用するSOPは非常に基本的なものですが、組み合わせによっては非常に力を発揮します。そういった部分にもフォーカスして、ワークフローを分解していきます。

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

    01 All Flow

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

    今回は、まずベースとなるラインを作成するところがポイントとなります。


    • ベースとなるカーブをCurve SOPで【A】で作成し、ある程度のPoint数になるように、Resample SOP【B】で分割します


    • また、Circle SOP【C】で円を作成し、このPrimitiveに対してScatter SOP【D】を使ってPointを散布します。次に、Attribute Create SOP【E】を使って各Point番号をidとしてAttributeを作成します。さらに、Add SOP【F】からAdd Particle Systemを使い、PointをParticle Primitive化します。これら2つの要素をSweep SOP【G】を使用して配置します。Sweep SOPを使うことで、簡単にカーブに沿ってジオメトリを配置することができます。Particle Primitiveにすることで、Point群をSweepで配置することが可能になります


    • 配置したPointはAdd SOP【H】のBy GroupからAttributeのidを使用してコネクトします【I】。こうすることで、各Pointをそれぞれのidごとにコネクトすることが可能になります


    • これらのカーブはConvert SOP【J】でNURBSに変換します。これで、ベースとなるカーブを準備することができました

    今回は、動きに味付けをするためにAttribute VOP SOP【K】を使ってノイズのデフォームを加えることで、揺らめきを追加しています。続いて、Assemble SOP【L】を使い、カーブそれぞれにnameを追加します。それを用いてFor Each SOPで各カーブをカットし、タイミングをずらしていきます【M】。カーブをカットするのには、Carve SOP【N】を使用します。これで、First[U]およびSecond[U]にアニメーションを作成し、Time Shift SOP【O】でForのmetadataを用いてタイミングをずらします【P】。このようにして動きをつけたカーブに、最終的にレンダリングするための設定を追加します。まずカーブにTextureUV SOP【Q】を使用してUV作成し、必要であればResample SOP【R】でPolygonへ変換します。最後に、pscaleやAlpha、CdなどのAttributeを設定して完成です【S】

    次ページ:
    02 Operators

    [[SplitPage]]

    02 Operators

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

    Add SOP


    • Add SOPはPointを作成、抽出したり、Pointを接続し、Polygonに変換することができるSOPです。また、単純なPointに対しParticle Systemを追加し、Particle Primitiveへ変換することもできます


    • Pointタブでは、Pointの座標値を設定して、任意の場所に新たなPointを生成することができます。Expressionなどを使用してPointを作成することで、さらに応用的なPointの生成も可能です


    • Polygonsタブでは、Pointを接続しPolygonへ変換することができます。By Patternでは、任意のPointを指定し接続リストを入力することで、指定したPoint同士を接続することができます。By Groupでは、Groupやスキップなどの法則に基づいた接続を選ぶことができます。By Attributeでは、同じAttributeの値をもつPoint同士を接続することができます。また、どのタイプでも、Closedにチェックを入れることで面としてPolygonを生成します


    • ParticleタブではPointに対しParticle Systemを追加することができます。これは新たにParticleがもっているAttributeを追加するものではなく、Pointだったものに対しParticle Primitiveへ変換するものであり、シミュレーションされたものではないので注意が必要です

    今回のフローでは、Sweep SOPで配置されたPointを接続するために使用しています。あらかじめidなどのAttributeが準備されていて、いとも簡単にPolygon化できるため、このようなワークフローでは非常に重宝します。Sweep SOPでPointをそのまま配置することはできません。そのようなときにAdd Particle Systemを使うことでPointをPrimitive化できるため、そういった箇所でも重宝します。特に、単純なPointはときとしてUnusedとして認識されることもありますので、そういった場合にも使うことができるかと思います。今ではレガシーなパラメータになりつつありますが、ときとして役に立つ機能のひとつです。逆に、PrimitiveやParticleから単純なPointにしたい場合は、Delete Geometry But Keep thePointsを使用することでPointのみを抽出することができます。

    Sweep SOP


    • Sweep SOPはBackboneにCross Sectionを沿わせて、リボンやチューブのように押し出されたジオメトリを作成します。このときCross Sectionは、Backboneの曲線上にあるPointに対して垂直に配置されます。Reference Pointsが入力されており、Aim at Reference Pointsにチェックが入っている場合、各Cross SectionはReference Pointsの方向を向きます


    • Sweepタブでは、どのようにCross Sectionを配置するかを設定することができます。デフォルトではTransform Using Attributesにチェックが入っており、Backboneがもつ性質によって配置されます。例えば、ScaleはBackboneがpscaleのAttributeをもっていれば、それに反応します。またTwistなどの回転は、BackboneがNやupなどのベクトルをもっているとき、それらの回転値によって決められます。通常では、カーブがもっているタンジェントに対し垂直に配置されます

    Outputタブでは、最終出力の形式を設定します。Skin Outputは、デフォルトではOFFになっていますが、Cross Sectionをつなげてメッシュを張りたい場合などにONにすれば、各断面間を繋いでメッシュを張ることが可能になります

    今回のフローでは、Cross SectionにPointを使用しています。こうすることで、簡単にPointをカーブに沿って配置することが可能になります。また、TwistやScaleを調整することで、その形にバリエーションをもたせることもできます。Attributeをあらかじめカーブにもたせることができれば、より細かな調整をすることが可能になります。今回は、Skin Outputを使用せず、配置後はAdd SOPを使ってPolygon化しています。実際にはこのような使用方法はイレギュラーではありますが、活用方法としては十分に実用的であるといえます。

    画像はNとupを事前に設定した例です。この場合、青いベクトルがNで、ピンクのベクトルがupとなります。このように、2つのベクトルが存在していれば、Sweep SOPはCross Sectionの回転を正確に割り出すことができます

    次ページ:
    Carve SOP

    [[SplitPage]]

    Carve SOP


    • Carve SOPはPolygonやNURBSなどをカットしたり、Pointや断面を抽出したりすることができます。日本語にすると「カーブ」と読めてしまい、曲線(Curve)と混同しがちですが、実際には「刻む」を意味する方のカーブなので、ご注意ください


    • Houdiniでは、PolygonやNURBSなどメッシュやカーブには、パラメトリックな座標値であるUVが存在しています。それを用いることで、カットや抽出する位置をUVで指定します。UVはそれぞれFirstとSecondでカット位置を指定します。また、Cut(切り出し)かExtract(抽出)を選択することができます

    今回のフローでは、複数本のカーブをカットすることに用いています。長めに生成したベースカーブの一部分を切り出し、それをオフセットしていくことで、あたかもカーブがレールに沿って動いているかのようにアニメーションをつけることが可能になります。本来の使い方を少々アレンジした使用方法ではありますが、こう言ったアプローチも非常に重宝します。例えばカーブのFirst Uにアニメーションをつけ、Extractで先頭のPointのみを抽出し、そのPointに対してジオメトリをコピーすれば、簡単にカーブアニメーションをつけることができます。通常はオブジェクトレベルで行うカーブアニメーションも、SOP内で複雑に行うことが可能になります。

    今回、For Eachを使っている理由として、カーブのアニメーションをグラフで制御する際に、カーブそれぞれをエクスプレッションでオフセットすることができないと言うことが大きく作用しています。本来、For Eachは使用したくないのですが、Carve SOPの仕様上、今回のようなフローにする必要があります。

    画像の例は、チューブ上のNURBSを指定したUとVの位置でカットしたものになります。今回のようなカーブだけではなく、このようにサーフェスに対してもカットを施すことができます。ちなみに、今回のプロジェクトのようなカーブは、Uのみが存在し、Vは存在しません

    Resample SOP

    Resample SOPはPolygon、NURBSなどのカーブに対し、Pointを距離や数によって再度サンプリングして、元のカーブ上へ再配置します。このとき、元のカーブは必ずPolygonへ変換されます

    Level of Detailは、Polygon以外が入力されている際、元のカーブの詳細レベルを設定するもので、大きいほど詳細に判定します。Resample by Polygon Edgeは、入力されているカーブのコーナーを保持します。Methodはどのようにエッジの長さを測定するかを決めます。デフォルトではEven LengthSegmentsになっており、そのままのエッジの長さを測定します。Resample SOPでは大きく2種類のサンプリング方法があり、エッジの長さから指定する方法と、エッジの最大数を指定する方法があります。Maximun Segment Lengthは、エッジの長さをLengthで指定することで、カーブに対して、指定した長さ分のエッジを生成します。こうすることで、エッジの長さは絶対的に決定されるので、入力のカーブの長さにかかわらず、一定のエッジの長さを維持することになります。したがって、入力カーブの長さが短ければエッジ数は少なく、長ければエッジ数は多くなります。もうひとつは、Maximum Segmentsです。これはSegmentsでエッジの絶対数を指定する方法で、カーブの長さにかかわらず、エッジの数は一定になりま

    今回のフローでは、NURBSで作成したカーブに対して使用しています。NURBSカーブとResample SOPは、筆者にとってはもはやセットのような感覚です。セオリー的に、Pointを一定の間隔にする方が扱いやすく、癖になっています。

    画像は、左からベースのNURBS、中央がLengthを指定した場合、右がLengthとSegmentsを指定した場合になります。Lengthはエッジの長さを指定しますが、さらにSegmentsの数を指定することで、その長さも強制的に変わります。Lengthがまず適用され、その後にSegmentsの数が設定されるために起こる減少です。これを利用すれば、カーブが伸びていく様子をResample SOPのみで行うこともできます

    あとがき

    これまでとは大きく連載の形式は変わりましたが、今回見ていただいたように、アプローチを紹介して、それにまつわるオペレータを紹介していくというながれを基本形にしていきたいと思います。今回は初級から中級の内容ですが、これは毎号変動する見込みです。はじめにお話ししたとおり、Webの場合ある程度自由度があるため、いろいろ組み替えて紹介できることも増えると考えています。細かい引き出しをどんどん増やしてもらえるような内容にして、それらをさらに応用として使いやすい切り分け方を検討していきたいと思いますので、どうぞ今後とも「Houdini Cook Book」をよろしくお願いします。