前回に続き、Houdiniでツタのトンネルを制作していきます。
枝の作成と成長
今回は枝の作成と成長にフォーカスして解説します。
<1>ツタを這わせたい箇所にカーブを作成する
Curveノードで、ツタを這わせたい箇所にカーブを作成します。ここで描いたものが植物の枝が成長する起点となります。
<2>カーブをマージする
何本かカーブを描いたものをマージします。
<3>頂点数を調節する
Resampleノードで頂点数を調節します。
<4>カーブにノイズをかける
より自然な形にするためカーブにノイズをかけます。ここではAttribute Adjust Colorノードの[Bounding Box]のYをColorアトリビュートへ変換して、その数値を基にNoiseの強度を調節しています。
<5>ガイドオブジェクトとカーブの距離を設定する
カーブを描く際に使用したガイドオブジェクト(地面とトンネルの形状のモデル)から「どれぐらいカーブを離すか」という設定を作成します。ガイドオブジェクトの[N]をPointCloudで取得し、Pに加算することでサーフェスオフセットを設定できます。
<6>カーブの成長進行方向となるベクトルを取得する
再びResampleし、PolyFrameノードで[Tangent]からカーブの成長進行方向となるベクトルを取得。その後、[Wrangle]で方向が逆のものは反転させています。
<7>カーブ全体にノイズをかける
カーブ全体にノイズをかけてより枝っぽいルックにします。これでルートカーブ(大元となる枝)の設定は終わりです。
<8>ルートカーブから派生する枝を作成する
次に、ルートカーブから派生する枝を2段階に分けて作成します。まずはプライマリの枝から作成します。派生箇所を指定するため、Scatterノードでプライマリの枝の根元となる箇所へポイントを作成します。画像のようにCurveuアトリビュートを元とするDensityアトリビュートをWrangleにて事前に設定しています。
<9>Wrangleで [Trigger] アトリビュートを作成する
[Carve] で枝の成長アニメーションを付けたものに対して、Wrangleで [Trigger] というアトリビュートを作成しています。一方で右側ではScatterしたポイントへそのTriggerアトリビュートを [AttributeTransfer] で転送しています。
<10>成長アトリビュート [Growth] を作成し定義する
続いて、Solver内でTriggerアトリビュートを基にして成長アトリビュート [Growth] を作成し定義していきます。[Trigger] が [1] 以下の場合、毎フレームGrowthアトリビュートに数値が加算されていくものです。1以上の数値にならないよう最後にFit関数で [1] にクランプしています。
<11>ポイント群を起点に新しく枝を生成する
Growthアトリビュートを所有しているポイント群を起点に、新しく枝を生成します。今回はWrangleで記述しています。少し長いですが、要約すると……、
(1)枝の進行方向を決める
(2)現在の頂点位置からガイドオブジェクトへの方向を求める
(3)それらをLerpでGrowthアトリビュートを基にブレンドする
(4)その地点へ新規ポイントを作成
(5)[Add Prim] と[Add Vertex] でポリラインとバーテックスを作成
DeleteノードでGrowthアトリビュートが [0] のものを削除してからResampleを行なっています。
<12>ノイズを加えるため頂点数を増やす
Resampleをしてノイズを加えるのに十分な頂点数に増やします。
<13>自然な見映えにする
ルートカーブと同じく、ノイズを加えより自然な見映えにします。
<14>カーブをチューブポリゴンに変更する
PolyWire SOPでカーブをチューブポリゴンに変更します。このとき、あらかじめWrangleでWidthアトリビュートをCurveuアトリビュートを基にランプで作成しておきます。プライマリの枝は以上です。
<15>プライマリの枝から派生する枝を作成する
続いて、プライマリの枝から派生するセカンダリの枝を作成していきます。手順はほとんどプライマリ作成時と同様です。成長の方向をPolyFrameノードの [Tangent U] から定義し、再びTriggerアトリビュート(プライマリのTriggerと区別するため別の名前で作成する必要があります)をScatterしたポイント群に対してAttributeTransferで転送します。
<16>Solver内でWrangleでGrowthアトリビュートを作成する
プライマリと同様にSolver内でWrangleでGrowthアトリビュートを作成します。トリガーアトリビュートが1以下のときにGrowthアトリビュートが増えていくというもので、加算数値以外は先ほどと同様の条件です。
<17>派生した枝のベースとなるポイントとポリラインを作成する
Solverを出たら、同様にWrangleでセカンダリの枝のベースとなるポイントとポリラインを作成します。
<18>数値で設定できるようパラメータを作成する
コードはプライマリ作成時と同様です。「成長ゴール位置のランダムさ」、「成長方向のバイアス」、「ゴール位置をガイドオブジェクトからどれだけ離すか」という3点は、パラメータを作成して数値で変えられるようにしています。
<19>見映えを確認する
このように、プライマリの枝から伸びるセカンダリの枝がポリラインで表現されています。
<20>Resampleして頂点数を調節
こちらも同様にGrowthアトリビュートが [0] のものを削除した後、Resampleして頂点数を調節しています。
<21>ポリゴン化したものを確認
ノイズとPolyWireでポリゴン化したものがこちらです。
<22>全てをマージしたものを確認
ルート、プライマリ、セカンダリ全てをマージすると、このような感じになっています。
<23>花と草のオブジェクトを配置する
前回作成した花と草のオブジェクトをCopyToPointでプライマリとセカンダリ上に作成した頂点に配置し、完成です。
<完成>
森田悠揮 / Yuuki Morita
フリーランスキャラクターデザイナー/デジタルアーティスト/造形作家
国内外問わずアート、映画、ゲーム、広告、デジタル原型など様々なジャンルで活動しているフリーランスのアーティスト。ZBrushでの生物や怪獣などのクリーチャーデザインを得意とする傍ら、Houdiniを用いた動画、アート制作なども行う。初の著書 『the Art of Mystical Beasts』ボーンデジタルから発売中。
website: itisoneness.com
Instagram: yuukimorita
Twitter: @YuukiM0rita
TEXT_森田悠揮 / Yuuki Morita(@YuukiM0rita)
EDIT_みむらゆにこ / Uniko Mimura(@UNIKO_LITTLE)