HoudiniBBAの台所

Houdiniを覚えたいリアルタイム系VFXババァが覚えたことをいろいろと残しておくブログ。

【Houdini】みんな大好き「らせん十字モデル」を自由自在かつ秒速で生成する【1/3】

おひさしぶりです。
しばらくフーディニババァではなくアンリアルババァをやっておりました。。。
前回の更新から2か月くらい経っちゃったよ...;x;
これからはコツコツ更新できるようにがんばります...

さてさて、SOPマスターへの道しりーず!
続編だよ!!

今回は線だけじゃなくて面もつくるよ!
面があるってことはUVも展開しちゃうよ!

ベースに使う「らせんカーブ」は前作のHDA「createSpiral」を使います。
もしよければ、前回の記事を見てから進んでくださいね。
「ベースにするカーブは自分で作れるよ!」って人はそのままどうぞ!

houdini-kitchen.hateblo.jp

今回の目標としては、エフェクト制作者ならみんな大好き、 あんなぐるぐるやこんなクルクルをすぐに作れるHDAを目指します。

要件としては

・らせんの形はあとから自由に調整できる(形状・分割数共に)
・クロスさせた面の場合と、単純に面を張っただけでいい場合を切り替えられる
・Importしてすぐ使える(UV展開とか頂点アルファとかの調整もおわってる)

あたりでしょうか。

あ、ちなみにそもそもエフェクトを作っていない方向けに補足説明をさせていただくと、 「らせん十字モデル」は↓みたいなエフェクトを作るときに活躍します。

f:id:houdini_kitchen:20181206232502g:plain

光の玉をまわしたりとか、パワー的なヤツを収束させたりとかですね。
RPG系のバフとか回復とかでみんなこういうグルグルした線、好きだよね。
モデルを十字にクロスさせておけば、カメラを360°回されてもペラペラに見えることがほとんど無いです。
(逆に2Dゲームや固定カメラ向けなら十字にしなくても良いこともある)

それでは今日もはりきっていきましょー。

さてまずは、「Geometry」を作って中のfileを消します。
前回作った「らせんカーブ」をさっそく使ってみましょう。
TabからHDAを呼び出します。(私の場合は「CreateSpiral」と入力)

f:id:houdini_kitchen:20181206232234j:plain


らせんの形は後から好きに調整ができるので、 先にMeshを張るしくみを作ってしまいましょう。
使うノードは「line」と「sweep」です。
「Line」は、ひとまずデフォルト状態で使います。
「sweep」ノードを呼び出したら、「Line」を第一入力(左側)に、「CreateSpiral」を第二入力(右側)に繋いでみましょう。
こんな結果になります。

f:id:houdini_kitchen:20181206232300j:plain

sweepノードは、「第一入力(左側)に入れたもの」を、「第二入力(右側)の各ポイントに配置」してくれるノードです。 

http://www.sidefx.com/docs/houdini/nodes/sop/sweep.html

スイープって名前をしてますが、仕組みとしては「はぁい、第一入力から来たみなさんは、第二入力のバミってあるトコ(point)に並んでくださ~い」的なことをしてくれています。
ちなみに今回の場合、「ポイントからLineが伸びる」ではなく「ポイントを真ん中として」Lineを配置したいので、左側の「Line」の位置に一工夫加えましょう。
左側の「配置するline」の真ん中が原点に来るようにしてあげると、理想の形にすることができます。 

f:id:houdini_kitchen:20181206232322j:plain

...が、単純にOriginの値に-0.5を入れてしまった場合、 「Length」を変えてしまうと整合性が取れなくなってしまいます。↓↓ 

f:id:houdini_kitchen:20181206232419j:plain

今は線の長さが1なので、たまたま1/2が0.5で上手くいくだけ、ってことですね。
ただ、これを読んでる皆さんはもうHoudiniますたーなので、ピンと来てますよね。

「1つの値が決まったら、もうひとつの値も決まる数(=関係がある数)」といえば...
そうです、関数です!!
「線の長さ」がどんなときでも、「線の真ん中が原点になる」ような関数を、エクスプレッションで書いてあげましょう~。

「Length」のチャンネルボックスを右クリックして「Copy Parameter」したら、

f:id:houdini_kitchen:20181206232605j:plain

OriginのYチャンネルのボックスの中身をすべて消して、「Paste Relative References」します。ここに入力されたch(“dist”)が、「線の長さ」です。

f:id:houdini_kitchen:20181206232619j:plain

「線の長さの半分の分だけマイナス方向に動かす」は、 線の長さ ÷ 2 × (-1) ですね。 今回の場合は ch(“dist”)/2*-1 になります。

f:id:houdini_kitchen:20181206232631j:plain

÷2は、×1/2(=0.5)なので、もちろんch(“dist”)*-0.5 も正解です。
(※私はあとから見たときに思考回路が分かるような式で残しておきたい派なので前者の書き方をしてます)
これで、線がいつでも真ん中に来るようになりました!!
この状態で、Sweepした結果に面が張られるようにします。

まずは、1回のスイープで1つのプリミティブを作ってほしいので Sweepノードの「Cycle Type」を「One Primitive at a Time」に変更します。

f:id:houdini_kitchen:20181206232648j:plain

さらに「Output」タブに移動して、Skin Output を「Skin Unclosed」に変更すると...面が張られます!

f:id:houdini_kitchen:20181206232702j:plain

開始から5分も経ってないけど、完成形がもう見えてきたぞー!

meshを十字にするには、同じラインにそって、縦の線もスイープしてあげればいいので、 第一入力の「Line」ノードの下に「Transform」ノードをつなぎます。
「RotateZ」チャンネルに90をいれると、線が十字にクロスしますね。 

f:id:houdini_kitchen:20181206232716j:plain

この「横にまっすぐ」と「タテにまっすぐ」の結果を両方使いたいので、「Merge」ノードで合体させましょう!

f:id:houdini_kitchen:20181206232732j:plain

ちなみにこの十字の作り方、mayaでやる場合は「複製(duplicate)」してから結合したりしますが、Houdiniだと「両方の結果を結合」になるんですよね...。
これ(別に複製しなくてもmergeだけでOK)を教えてもらったときは、まさしく「その発想は無かった」状態でした...。

さてさて、それではSweepの結果を見てみましょう!
どどん!

f:id:houdini_kitchen:20181206232754j:plain

形状のキホンはこれで完成です~!!
やったね!!5分もかからずに作れるよ!!!

次に、UnityとかUE4のエフェクト用モデルとして使うために、このモデルのUVを格子状に展開していきます。 UVも、もちろんノードを繋いで開いていくのですが、HousiniのUV展開はちょっとしたお約束があってつまづきやすいです。。。
Houdiniマスターのみなさんには当たり前のことすぎるからなのか、なかなか解説記事とか動画が落ちていません・・・。
いまでもたまに「ウォァアアこんな単純なモデルならmayaにImportして手で開いた方が早ぇええええ!!!」って叫んでます。
Houdiniモデラーのみなさん・・・誰か素敵なUV展開方法を日本語で解説してください・・・お願いしますorz

まず、第2入力のらせんから。 格子状に展開するときは、「らせんの始まりから終わりまで」を、U方向かV方向に「0~1」としてマッピングできるのが理想です。
この方法が使えるのはNURBSだけみたいなので、いったん、らせんのラインをNURBSカーブに変換します。
変換は名前のとおり「convert」ノードでできますよー。
ノードをつないでから、「Convert to」を「NURBS Curve」へ変更します。

f:id:houdini_kitchen:20181206232844j:plain

さらに、分割数がそこそこあると見落としそうになる部分ではあるんですが、 ポリゴンのpointをそのままNURBSのcvに置き換えてしまうと、形状が変わってしまうことがあります。

f:id:houdini_kitchen:20181206232900j:plain

この形状の差を極力なくすために、「U Order」の値をギリギリ(2)まで下げてあげます。 

f:id:houdini_kitchen:20181206232918j:plain

この状態で、UVを開いてもらいましょう!
「UV Texture」ノードを呼び出して、Convertの下に繋ぎます。

f:id:houdini_kitchen:20181206232933j:plain

Texture Typeを「Arc Length Spline(弧の長さ)」に変更します。 Attribute Classは「Point」にしておきます。

f:id:houdini_kitchen:20181206232943j:plain

UVがどうなっているか確認するには、ビューの表示を変更します。
キーボードの「5」キーを押すか、新しいタブを追加して、右上のメニューから「UV Viewport」をえらびましょう。 (キーボードの5を押した場合は、「1」で元のビューポートに戻れます)

f:id:houdini_kitchen:20181206232959j:plain

一見、なにも無いように見えますが、ポイント番号表示などをONにすると、ちゃんとポイントが整列してくれています。 

f:id:houdini_kitchen:20181206233017j:plain

仕上げに「resample」ノードをつないで、「Maximum Segment Length」のチェックをはずします。
resampleノードは結果をポリゴンで出してくれるので、NURBSに変換したカーブをPolygonのカーブに戻すために使っています。
(curveuのダシにされたりコンバータ扱いされたり、なかなか本来の仕事をさせてもらえないresampleノード...)

f:id:houdini_kitchen:20181206233031j:plain

第一入力も同じように、「NURBSに変換→UV展開→Polygonに戻す」をやってみましょう!
ひとつだけ注意したいのが、展開したUVはどちらもU方向に向かって並んでしまうので、第一入力のほうの「uvtexture」ノードの「Angle」チャンネルには「-90」も入力します。 

f:id:houdini_kitchen:20181206233058j:plain

これで、「Sweep」ノードを表示してみましょう。 格子状にUVが展開されてます!! 美しい・・・。 

らせん形状を作ってから綺麗な格子に手開きする手間も無ければ、 なんといってもこれ、後から分割数とか形状を修正しても崩れません!
ありがとうHoudini、ありがとうSideFX!!

次回はこのらせんの形状をもっと自由に編集しつつ、頂点Alphaとかもつけていきます。

本日も最後まで読んでくださって、ありがとうございました!!