HoudiniBBAの台所

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

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

メリークリスマス!月末年末残業BBAだよ!

らせんメッシュ三週目!
はりきっていきましょう!!!

f:id:houdini_kitchen:20181223184045g:plain

↑UnityとかUE4とかBishamonとかに突っ込むと、こういうのが作れます~

 

前回は「らせんMeshを好きな形に変形して、ついでに頂点アルファも設定」ってところまでを作りました。

houdini-kitchen.hateblo.jp

 

急にこの記事にたどり着いてしまった方は、良ければ第一回から読んでみてくださいね!

 

houdini-kitchen.hateblo.jp

さてさて今回は、この仕組みをあとから使いまわせるようにHDA(Houdini Digital Assets)にしつつ、これをfbx形式でエクスポートするところまでをやっていきます!

エクスポートできるのは有料ライセンス版限定になりますが・・・。
ネットワークをつくるところまでなら、アプレンティスでも出来るので、ぜひ最後までチャレンジしてみてくださいね!
(1年間がんばった自分へのご褒美にIndieライセンスを買ってもいいかもよ/悪魔のささやき)

 

まずはこのMeshが書き出されたときに問題が出ないように、足りないアトリビュートを足しましょう。
「AttributeVOP」の下に、「Normal」ノードをつなぎます。 

f:id:houdini_kitchen:20181223184026j:plain

「Add Normals to」は「Points」に変更しておきましょう。 

f:id:houdini_kitchen:20181223184224j:plain

これでモデルが法線情報を持ってくれます。


あとは好みの問題になってくるのですが、 最後にNullノードで「export_SpiralMesh」という「ここが終わりだよー」的な目印を作ってあげたり、第一入力のmergeノードをスルーして十字にしない版も作れるようにSwitchノードをつけたりします。 

f:id:houdini_kitchen:20181223184256j:plain

 

さらにHDAをつくっていきます~。

細かい操作の仕方は、らせんのHDAの記事も読んでみてくださいね!

houdini-kitchen.hateblo.jp

 

まず、サブネットワークに入れる内容ですが、この「線に沿って十字を貼る」というしくみは、らせん以外でも活躍する予感がするので「CreateSpiral」は対象から除外しちゃいましょう。
(らせんの代わりに真っ直ぐなカーブを渡したりとかでも使えそうだよね!) 

 

「Create Spiral」以外を選択した状態で、サブネットワークにつっこみます。 

 

f:id:houdini_kitchen:20181223184449j:plain

 

サブネットワークの中身を見てみると、Sweepの第2入力は、このサブネットワークの1番に繋げられたデータをもとにするようになっています。
ふっふっふ...プロシージャルなつくりでしょ(ドヤ顔

 

f:id:houdini_kitchen:20181223184514j:plain

 

つぎに、HDAとして呼び出されたあと、調整しなければいけない項目をリストアップしてみましょう!

らせんの形状は「Create Spiral」で決めるので、
こっちのノードはおもに「太さとAlphaのRamp調整」がメインになりますね。

【十字メッシュにする?それとも平面にする?】
 ・十字にするか?:Sweepの第一入力に入れるLineの結果のSwitch

【十字メッシュの形状と分割数】
 ・Meshの幅:Sweepの第一入力に入れるLineのLength
 ・Meshの分割数:Sweepの第一入力に入れるLineのPoints
 ・形状の調整:Sweepに追加したRamp
 ・捻ったりとか:SweepのTwistとRoll

【頂点Alphaのグラデーション】
 ・長さの始点~終点のグラデーション:attributeVOPのramp_U
 ・Meshの幅に対してのグラデーション:attributeVOPのramp_V

今回はらせんのときのように、使いやすくなるように計算式を挟む必要もなさそうですね^^
こんな感じにしてみました! 

 

f:id:houdini_kitchen:20181223184634j:plain

 

あとはサブネットワークを右クリックして、「Create Digital Asset」から保存です!
クロス以外のMeshもsweepできますが、名前は「crossSweep」にしました。

さっそく使ってみましょう!

Uキーで位置階層上に戻り、いままで作業していた「geo1」を非表示にします。

新しいgeometryを作って、作ったHDA「createSpiral」と「crossSweep」を呼び出して繋いでみます。

はい、ベース形状、1秒で完成!

形状の調整、1分で終わり!!

出来上がったモデルはhipを保存しておけば、
あとから「ちょっと!このモデル分割しすぎ!」とか怒られちゃったり、
「あー、やっぱりこれ、もうちょっと幅が細くないとダメだった...」みたいな調整が出ちゃっても、
パラメータを変えるだけですぐに対応ができますね!!

なんていうか、うん、Houdiniつよい

 ---

おまけ★有料ライセンス持ってるひと向け
モデルをFBXエクスポート → ゲームエンジンに突っ込んでぐるぐるさせるまで

※今回書き出しに使う「ROP_FBX_output」ノードは、Houdini16.5以降のバージョンだと、Houdiniの本体に同梱されています。

★16.5より前のバージョンでやる場合は↓↓からHDAを落としてきてください。 

https://www.sidefx.com/ja/tutorials/game-development-toolset-overview/

ちなみに、どのバージョンを使っていても「Houdiniで作ったいろいろを、ゲームの中で見えるようにしたいな~」って考えている人は、この「Game Development Toolset」をDLして使えるようにしておくと便利ですよ!!

使い方はめちゃくちゃカンタンで、「ROP_FBX_output」ノードを先ほどのネットワークにつなぐだけです。

f:id:houdini_kitchen:20181223184930j:plain

 

あとはノードのレンダーフラグをONにして、出力先やら書き出し形式を設定したら、左上の「Save to Disk」というボタンをポチっと押すだけです。 

f:id:houdini_kitchen:20181223185047j:plain

AEみたいに「ピロリン♪」とか気のきいたSEが鳴ったりはしませんが(マジでノーリアクション)、指定したフォルダを見に行くと、今回作ったモデルがしっかりfbx形式で書き出されています!

ちなみに無料版(Houdini Apprentice)でもノードをつないだりパラメータをいじったりすることはできるんですが、「Save to Disk」ボタンを押すと、もちろんダメだよって言われちゃいますw

あとはUE4なりUnityなりに突っ込んで、 お好きなテクスチャをUVスクロールで流したりしてあげれば、ぐるぐるエフェクトの完成です~!!

UE4に入れるときは、スケールが1だと小さすぎたり、デフォルト設定では頂点カラーが無視されてしまったりするので、注意してあげてください。
 スケールは、ROPノードに繋ぐ直前にTransformノードを繋いでスケールをかけたりします。向きもここで変えておくといいかも?

あと、UE4の場合は、インポートするときに↓の頂点カラーの設定を「Replace(置き換え)」にしてあげる必要があります。 

f:id:houdini_kitchen:20181223185201j:plain

あとは、Houdiniで作ったMeshはUE4に入れると「No smoothing group found」とか、「スムージンググループが~」みたいな警告が出ますが、Houdiniにはそもそも「スムージンググループ」という概念が存在しないので、無視しても問題ありません^^ 

f:id:houdini_kitchen:20181223185242j:plain

とりあえずテクスチャの模様が出て、スクロールし続けるマテリアル(やる気ゼロ)↓ 

f:id:houdini_kitchen:20181223185306j:plain

 

以上で今回の「らせん十字モデル」シリーズ、完結です! おつかれさまでした~!

なにか間違っていたり、うまく動かなかったり、「こうしたほうが簡単で便利だよ!」などありましたら、ぜひコメントやTwitterまでご連絡いただければと思います。

本日も最後までお読みいただき、ありがとうございました!!

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

 こんにちは! 今回もらせん関連です!
もうこのブログめっちゃグルグルが好きな人のブログみたいになっちゃってるよ...
とりあえず前回は、らせんのカーブに沿ってMeshをはる方法を紹介させていただきました!

急に今回の記事にたどり着いてしまった方は、ぜひ前回の記事から読んでみてね!!

houdini-kitchen.hateblo.jp

さて、面を張ったらせんモデルですが、こういうのってだいたい先端が尖っていたり、INとOUTでフェードアウトができると良い感じ、ってことがほとんどですよね。
そこらへんを自由にカスタマイズできるようにしていきます。

まずは形状。 Sweepノードの「Sweep」タブの「Transform Using Attributes」のチェックをはずします。
このチェックを外すと、下の3つのパラメータを編集してSweepの結果を加工することができるようになります。

f:id:houdini_kitchen:20181213004837j:plain

注目したいのは「Scale」のアトリビュートです!

この「Scale」、全体の太さとか細さをスケーリングしてくれる値なんですが、このスケール値、「カーブの中間は今のままで、先端だけ細くして~」とかワガママを聞いてくれたらいいな~、なんて考えちゃうわけです。

f:id:houdini_kitchen:20181213004912g:plain

まずは、「このへんはこんな感じで!」と操作をする必要があるので、パラメータを増やしましょう。

今回は「処理結果と似たような見ためになる」ので、floatのrampパラメータを使います。
もともと存在していないパラメータを増やすには、右上の歯車アイコンからでしたね。
「Edit Parameter Interface」から小さいウィンドウを呼び出して...

f:id:houdini_kitchen:20181213005037j:plain


「By type」タブからRamp(float)を選んで、右のツリーに追加します。 パラメータの名前も分かりやすいものをつけておくと◎

f:id:houdini_kitchen:20181213005059j:plain

 Rampパラメータが追加されるので、パラメータの名前を右クリックして「Copy Parameter」をえらびます。

f:id:houdini_kitchen:20181213005123j:plain

さきほど編集できるようになった、「Scale」パラメータの値を消して、右クリックして「Paste Relative References」でエクスプレッションを貼り付けます。

f:id:houdini_kitchen:20181213005244j:plain

 

「Paste Relative References」で貼られる「ch(“〇〇”)」というエクスプレッションは、そのパラメータの値を1つしか返してくれません。

今回は「それぞれの位置に対応するRampパラメータの値」が欲しいので、 これを書き換えます。
chramp("SpiralShape",$PT/($NPT-1),0) これでHoudini先生に対して、「"SpiralShape"っていうRampパラメータの、$PT/($NPT-1)の値ちょうだい!float値(浮動小数)で。」って言っていることになります。

まず、「chramp」は、2番目の引数で指定したポイントのRampの値を返してくれる関数です。

日本語にだと分かりづらいと思うので、画像で説明します。。。 

f:id:houdini_kitchen:20181213005330j:plain

今書いている関数は、2つめの引数(上記の画像のオレンジの部分)に定数ではなく、さらに「$PT/($NPT-1)」というエクスプレッションを書いています。
Rampを反映させるには、「ここのポイントの場合は、Rampのここ!」っていうの(2つめの引数)を、各ポイント番号ごとに求めなきゃいけないわけです。

f:id:houdini_kitchen:20181213005509j:plain

しかも、chrampのヘルプページによると、「2番目の引数は0~1で指定してね!」って書いてあります。

http://www.sidefx.com/docs/houdini/expressions/chramp.html

つまりどうにかして、このポイントたちの位置を0~1の数値で表してあげる必要があります。
マジかよ難しそうだよできるかな...。
とりあえず、いきなり関数が書けなさそうなときは、 具体的な数字でやってみるのがセオリーです。

「10コのポイントがあるなかの、3つめのポイントの位置」を、0~1の範囲で求めてみましょう!
実は、図解してしまえば小学校の「さんすう」レベルの知能の人ならできる問題だったよ! 

f:id:houdini_kitchen:20181213005631j:plain

ポイントが10コのときの3番は、「0~9番まであるうちの3番」なので、 「3/9」 になります。
(なんで割り算なのかピンとこない人は、「3/9」を分数として読んでみてね)

ではもうちょっと数字をあいまいに。
ポイントがn個のときの3は、「0~(n-1)まであるうちの3」なので、 「3/(n-1)」になります。
(ポイント番号は0から始まるので、総数より1つ少ない)
ここまで来れれば、もう簡単ですね!!

ポイント番号は「$PT」です。 ポイントの総数は「$NPT」です。
ポイントが$NPT個のときの$PTは、「0~($NPT-1)まであるうちの$PT」なので 「$PT/($NPT-1)」になります!

もともと入っている式になりました!

ちなみに「現在のフレーム数」とか、「このモデルのポイント番号をそれぞれ」みたいな、「数字の代わりに使える、$とか@とかつくようなヤツらの名前」は、「エクスプレッション変数」って呼ぶみたいです。
Houdiniの公式ヘルプを見たり、Google先生に「Houdini expression variables」とかで聞くといろいろ出てきます!

あと、XからYまでの範囲を0~1までの範囲にあてはめなおす(リマップする)ことは、「正規化(ノーマライズ)」って言うそうです。
明日から「あぁそのパラメータ、0~1の範囲にじゃないと正しい結果にならないよ。正規化してあげないと(ドヤァ」って言えば、なんかデキる人っぽい雰囲気を醸し出せる...かもしれません。(誰も得をしない)

長くなってしまったので、まとめとして「chramp("SpiralShape",$PT/($NPT-1),0)」をムリヤリ日本語に直すと、
「各ポイントごとに、それに対応するRampの値」
ってことになります。

これで、「先が尖っている」どころか、Rampで自由自在に変形させることができるようになりました!!
もう、どんなリテイクも怖くない...!!!!! 

f:id:houdini_kitchen:20181213005823j:plain

※さすがにこんなにモデルはめったに使わないけど※

形状の調整はこれで事足りそうなので、 次は「先端でフェードアウトさせたい(モデルに頂点カラーを設定したい)」って部分ですね!
これも、モデルがどんな形状になっても引き継ぎ&修正が簡単にできるようにしたいので、UV座標をもとにして、モデル全体にグラデーションをかけてみようと思います。

処理が複雑なので、VOPでやっていきましょう!
Sweepから、「attributeVOP」を繋ぎます。 

f:id:houdini_kitchen:20181213005906j:plain

VOPの中に入って、まずはUVの座標を使いたいのでbindノードを作って、名前を「uv」にします。(小文字だよ!)

また、bindノードはデフォルトではfloat値(浮動小数1つ)を呼んでくれる設定になっていますが、今回は「UV座標」なので、UとかVとかが1セットにまとめられた数値です。
UVだから2つセット...と思いきや、GeometrySpreadsheetで見てみると、実は3つで1セットのようです。
(本当はUVW座標だったんだね...!Wいつも0だけど...!) 

f:id:houdini_kitchen:20181213010114j:plain


と、いうことでTypeは「3float(vector)」に変えてあげましょう。

f:id:houdini_kitchen:20181213010007j:plain

U座標とV座標をそれぞれ別に加工したいので、 「UV座標」としてセットになっている数値を個別にバラします。
「3つセットをそれぞれバラバラ」は、もうおなじみですね!
Vector to Float」です! 

f:id:houdini_kitchen:20181213010056j:plain

グラデーションをかけたいので、Rampパラメータを用意しましょう。 U用とV用で2個作ってあげてください。

ちなみに、このパラメータ自体はfloatの計算ですが、RampのタイプはRGBのままにしておきます。
UIがグラデーションの方がイメージし易いので! 

f:id:houdini_kitchen:20181213010205j:plain

UとV、それぞれの結果を掛け算します。 

f:id:houdini_kitchen:20181213010226j:plain

あと、これは無くても上手くいくときは上手くいくんですが、念のため。 数値のケタの丸め込みをしちゃいます。

実はHoudini、長~い少数(小数点第3位以下から先)がいっぱいある計算が、あまり得意じゃないんです。
なので、最終的な計算結果はズレちゃうかもしれないけど、小数点第三位以下の違いなんて人間の目ではジャッジできない誤差なので、切り捨てちゃいます!

まず、最終的に、計算結果はFloat型の「Alpha」に渡すことになるので、Rampの掛け算の結果のRチャンネルだけを貰ってきましょう。
さらに、その数値を100倍します。定数は「constant」ノードで入れられます! 

f:id:houdini_kitchen:20181213010304j:plain

100倍した結果を、Round to Integerノードに渡します。
(Round to Integerは、少数点以下をぶった切って整数にしてくれるノードだよ!)

最後に「÷100(×0.01)」をしてあげれば、すべては計画通り!
「クッソ長い少数?知らないよ?そんなのあった?」って訳です。
(計算結果が0.000141421356....とかだと、fbxエクスポートしたときにバグっちゃうんですよねぇ...)
「bind export」ノードのnameを「Alpha」にして、結果を渡してあげましょう。
頂点カラーアルファは、最初が大文字なので注意してくださいね!

f:id:houdini_kitchen:20181213010341j:plain

あ、あとこれもFBXにエクスポートするときのためのおまじないなんですが、「Cd」にConstant(Vector)で1を渡しておきます。
(Cdが存在していないと、頂点カラーが無視されてしまうので...) 

f:id:houdini_kitchen:20181213010513j:plain

これで仕組みは完成です! キーボードのUキーでSOPネットワークに戻り、Rampパラメータの挙動を確認してみましょう~。 

f:id:houdini_kitchen:20181213010536j:plain

※VのRampを触ってみたらほとんどのAlphaがゼロになっちゃった!という方は、Sweepの第一入力の大元のLineノードの分割数をすこし増やしてみてください^^

うまく動けば、ネットワーク自体は完成です!!おつかれさまでした!!!
次回は、FBXに書き出すためのおまじないと、HDA化です!

あっ・・・Meshのエクスポートだけは、有料ライセンス(indie以上)じゃないとできないです><
(最後にノードを1つ繋ぐだけなので、Apprenticeで勉強中の方もゴール「は」できます...![書き出せないけど])

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

【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とかもつけていきます。

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

【Houdini】自由に形を決められる「らせんカーブ」を作る(3)

HoudiniのSOPマスターになろう企画第三弾!いぇーい。
第一弾と第二弾の続きなので、急にこの記事にたどり着いてしまった方は過去記事もよろしくね!!!

houdini-kitchen.hateblo.jp

houdini-kitchen.hateblo.jp

 

今回はHoudiniの最強機能なんじゃないかと呼び声高い(?)もののひとつ、HDA(HoudiniDegitalAsset)化!について!です!

音声だと「エイチディーエー」っていう人が多いかな?
「デジタルアセット」って言う人もいますが、両方同じものを差しています。

HDAは、乱暴に言ってしまうと「カスタムノード」。
自分で作ったネットワークを「自分特製のノード」として保存しておいて、 あとから繰り返し使いたい時にtabからすぐ呼びだせるよ!っていうものです。

私はまだまだHoudiniを使い始めたばかりなので手札が少ないのですが、 師匠は「指定のフォルダに〇〇って命名規則でfbxエクスポート」とか、「シミュレーションのキャッシュを作って余計なデータを省いて圧縮して呼び出し」とかを作ってHDA化してました。

感覚としてはPhotoshopのアクションとか、ゲームのマクロみたいな感じです。
Max使いの人は「あー、欲しいプラグインを自分で作って保存できる感じね」って言ってました。

長年Houdiniを使い続けた人であればあるほど、「あぁー、その処理ね。HDA化してあるからすぐだわー」と秒速で仕事を終わらせていくのです。
あなおそろしや。

もちろん環境をそろえてあげれば他の人が作ったHDAを呼び出して使うことができるので、作ったHDAをスタジオやチーム内で共有しちゃえば、命名規則やらお決まりのルーチンやら〇〇さんしか作れないあれやこれやから解放されてみんなハッピー、という寸法です。最高かよ!

ではでは早速、つくりかたを見ていきましょう。

 

 Step1.HDA化したいノードをサブネットワークにつっこむ

必要な部分をネットワークウィンドウで選択します。
今回はひとつの処理しか作ってないので全選択しちゃいます。
この状態で右上の箱のアイコンを押すと、選択したネットワークが「subnet」というノードの中に収納されます。

f:id:houdini_kitchen:20181010234925p:plain

 

Step2.サブネットワークのプロパティをカスタムする

らせんの高さや巻き数などを調節できるようにしていきましょう。
ノードのプロパティの右上の歯車アイコンから「Edit parameter Interface...」というメニューを選ぶと、ひとまわり小さい設定ウィンドウが開きます。

f:id:houdini_kitchen:20181010235009p:plain

左側のエリアの「From Nodes」タブから「subnet1」を選び、circle1>Arc Angeles>endangle を選んで右向きの矢印ボタンを押してみましょう。
真ん中のエリアに何やら項目が追加されます。
(テスト用に余分なジオメトリ作ってるので、記事を見ながら制作してくださっている方とはちょっと見た目が違うと思います。ここの見た目がちょっと違っていても特に問題はないです。) 

f:id:houdini_kitchen:20181010235050p:plain


下の方の「Apply」ボタンを押してから、先ほどサブネットワークの階層に戻ってみると、「Arc Angles End」というプロパティが増えています。 スライダを動かすと、もちろん結果も反映されます。

f:id:houdini_kitchen:20181010235123p:plain

もうひとつの方法として、各チャンネルの項目名を直接ドラッグ&ドロップしても、同じようにパラメータを追加することができます。(入り組んだ構造じゃなければこっちのほうが楽かも)

f:id:houdini_kitchen:20181010235143p:plain

間違った項目入れちゃった!!」という時もご心配なく。
選択して「Delete」キーで削除ができます。

 

ちなみに、最初から存在している「Imput#1~~」という項目は、サブネットワークの入力の0番~3番です。
今回のらせんの場合はこのデフォルトの4項目はいらないので、Interface Options の「Invisible」のチェックを入れてしまいましょう。非表示にしてくれます。

f:id:houdini_kitchen:20181010235229p:plain

操作が分かったところで、どんなパラメータを作ればよいか洗い出しをしてみましょう。
今回いろいろと調整したいのは、下記のとおり。

1)ベースのかたちについて
 ・らせんの半径(CircleのRadius)
 ・らせんの高さ(PointVOP1のhight)
 ・コイルの巻き数(CircleのArcAnglesEnd)
 ・ラインの分割数(CircleのDivisions)

2)デフォームについて
 ・上側のテーパ(bend1のTaper)
 ・上側のベンド(bend1のBend)
 ・下側のテーパ(bend2のTaper)
 ・下側のベンド(bend2のBend)

3)頂点カラーについて
 ・そもそも頂点カラーあり?なし?(SwitchのSelectInput)
 ・頂点カラーのRamp(PointVOP2のRamp)

どんどん項目をEdit parameter Interfaceウィンドウに放り込んでも良いんですが、 「半径」とか「巻き数」は、そのままの値をパラメータにすると若干操作性が悪そうなので、すこし元のデータを改造してみます。

まず「ベースの円の半径」。
円が正円じゃないこともあるといえばある気もしますが、私の場合は常に正円であることを想定しているので、RadiusXとRadiusYは常に同じ値を入れることになります。

「必ず○○と同じ」や「○○の1/2」など、何かに関係するパラメータにはエクスプレッションを使うと便利です。

今回は「RadiusX」の値を使いたいので、RadiusXのチャンネルボックスの中で右クリック>Copy Parameter を選択します。

f:id:houdini_kitchen:20181010235447p:plain


続けて、「RadiusY」のボックスの中身をすべて消してから右クリック>Paste Relative References を選択すると「ch(“radx”)」という式がはいるので、そのままEnterを押します。

f:id:houdini_kitchen:20181010235501p:plain

f:id:houdini_kitchen:20181010235519p:plain

これで、RadiusXに入れた値がRadiusYにも、そのまま反映されるようになりました!

 

次に「巻き数」。
設計した側の人間からすると、360°で円が一周するので、デフォルトで360としたいところですが、初見の状態で「巻き数」と聞かれたら「1で1巻き」になっていた方が気持ちいいですね。
(半円でいい場合も、0.5巻きとかにすればいいし)

なので、それ用のパラメータを増やしちゃいましょう。

サブネットワークにパラメータを増やしたときと同じく、Circleノードのプロパティの右上の歯車アイコン>Edit parameter Interface から、設定ウィンドウを開きます。

今度は新しく追加するパラメータなので、「By Type」ウィンドウから「Float」を選びましょう。

後から何のパラメータなのか分かりやすいように、Name(変数の名前)とLabel(UIに出すときの名前)に「Coil」と入力します。
「Range」で値の範囲も決められますが、0~10のデフォルトで良さそうです。

f:id:houdini_kitchen:20181010235706p:plain

あとは初期値がゼロになっているので、「Channels」タブでデフォルト値を1に変更してApplyすればOK!

f:id:houdini_kitchen:20181010235732p:plain

さらに、この「巻き数」に対して360をかけた数が「ArcAnglesEnd」に入ればいいので、「Coil」をCopy Parameterして、ArcAnglesEndのボックスの中身をすべて消してから右クリック>Paste Relative Referencesでエクスプレッションを貼り付けます。
今回は、この結果に360をかけたいので、入力された式の後ろに「*360」を追加しましょう。

f:id:houdini_kitchen:20181010235855p:plain

これで、「Coil」のスライダを動かすと、それに応じて巻き数が変わるようになりました!

 

改めて、各チャンネルをサブネットワークのパラメータに入れていきましょう。

ラベルやRange、デフォルトの値に気を付けながらどんどん追加していきます。
Alphaのように「あり?なし?」の二択のときは、Typeを「Toggle」にするとチェックボックスタイプのUIになるので、変な数値が入ってくることも無く安心です!

f:id:houdini_kitchen:20181011000014p:plain

チェックが期待してた挙動と逆になっちゃった場合はラベルを変えるか、Switchノードに入力する順番を変えてみてくださいね。

すべての項目を追加し終わったら「Accept」を押してサブネットワークを見に行ってみましょう。
きちんとパラメータが並んでますね。 ...若干見づらいけど。

f:id:houdini_kitchen:20181011000049p:plain

 ここからは正直好みの話になってしまうのですが、あとちょっとだけ見やすくしましょう!
この「入力させる部分」、だれかに使ってもらうときに分かりやすいことはめっちゃ大事だから!!!

もう一度右上の歯車マークから「Edit parameter Interface...」を選びます。
左側の「By Type」タブから「Folders」を選んで、追加してみてください。
普通のファイルブラウザと一緒で、フォルダの中に任意のパラメータを追加できます。 まずは「BaseShape」と「Deform」と「PointAlpha」のグループに分けてみました。 この状態でAcceptしてみると...

f:id:houdini_kitchen:20181011000308p:plain

じゃじゃん。 項目ごとにタブ分けされました!

 

さらに、フォルダとフォルダの間に「Separator(セパレータ、仕切り線)」を追加してあげると...

f:id:houdini_kitchen:20181011000358p:plain

タブを保ったまま、項目が縦に並びました

 

あとはLabelで項目名を補足してみたり、Folderの中にさらにSeparatorを追加してあげたりして、最終的にこんな感じにしてみました。

f:id:houdini_kitchen:20181011000424p:plain

後から使いまわすことを考えて、きっちりUIまで設計できるようになっている...
Houdiniさんマジぱないの!どこぞのm〇lとは大違いじゃ!!!!!←

 

Step3.いよいよHDA化。

やり方はとっても簡単!

サブネットワークのノードを右クリック→Create Digital Assetを選ぶだけ!

f:id:houdini_kitchen:20181011000607p:plain

保存先とかいろいろ聞かれますが、基本はデフォのままAcceptで大丈夫です。
(ヘタにいじると、そのシーン専用とかになっちゃうらしいので)
名前だけはしっかりつけましょう。
あとで思い出せるように、分かりやすくね!!

f:id:houdini_kitchen:20181011000620p:plain

さっそく新しくGeometryを作ってHDAを呼び出してみましょう。
tabキーに先ほどのHDAの名前(私の場合は「createSpiral」)を入力すると...

f:id:houdini_kitchen:20181011000716p:plain

らせんが出ましたー!
パラメータも正しく動いています!やったぁあああ!

ちなみに、HDAは基本的にそのノードのパラメータのみを変更するだけで良いように作られているものが多いので、中身のネットワークはロックされています
1発でうまくいかなかったり、あとから何か修正したいときは、ノードを右クリックして「Allow Editing of Contents」を選ぶと、ロックが解除されます。

f:id:houdini_kitchen:20181011000831p:plain

f:id:houdini_kitchen:20181011000844p:plain

ネットワークの中身を更新しおわったらHDAの階層まで戻って、もういちどノードを右クリックし、出てきたメニューの「Match Current Definition」を選ぶとHDAの内容が更新されます

f:id:houdini_kitchen:20181011000910p:plain

まさかの3記事にわたる超大作になってしまいましたが、「らせんカーブのHDA作成」これにて完結です!
おつかれさまでした!!!

...ちなみにこんなに素敵ならせんができたら、このカーブに沿って板ポリゴンとか十字ポリゴンとか張りたくなりませんか...?
このカーブに沿って自動でMeshを作るHDAの紹介記事も鋭意制作中です。
もう少々おまちください...!

本日もありがとうございました!

【Houdini】自由に形を決められる「らせんカーブ」を作る(2)

HoudiniのSOPマスターになろう企画第二弾!いぇーい。

さてさて、前回は「好きな高さと巻き数のコイルを作る」ってとこまで作りました。

houdini-kitchen.hateblo.jp

 

でもどうせみんな、らせんを作るってなったら「竜巻型も作りたい」とか言い出すんでしょ。知ってるよ!!

変形といえばmayaでもお馴染み、デフォーマの出番です。
「bend」ノードを使っていくよ!
mayaのベンドとはちょっと感覚が違うけど、難しくはないので、張り切っていきましょー。

まずは、前回作った「PointVOP」の下へ、bendノードをつなぎます。
線とbendデフォーマの向きと位置を合わせてあげましょう。

まずは向き。
Up Vectorのxを1に、Capture Directionのyを1にします。

f:id:houdini_kitchen:20181010233243p:plain


向きを合わせただけだと、らせんの長さが変わった時に不都合が生じてしまう(高さが高すぎるとデフォーマからはみ出しちゃう)ので、線の長さに応じて、デフォーマのサイズも可変になるようにします。

考え方としては、デフォーマの端っこは

 ・初期位置:原点(固定)
 ・高さ:らせん自体の高さ(可変)

なので

「らせん自体の高さ」の値が常にCaptureLengthに入るようになれば問題解決しそうですね。

オブジェクトの「高さ」とか「横幅」を使いたいときは、「バウンディングボックス」を使うと簡単に済むことが多いです。
「bbox表現関数」っていうのがあるので、ありがたく使わせてもらいましょう。
めちゃくちゃ荒く説明するとbbox(オブジェクト,どの値が欲しいか)って書くと、その値返してあげるよ、って関数です。 

http://www.sidefx.com/docs/houdini/expressions/bbox.html

いまの場合、「処理してるオブジェクトの高さちょうだい」なので、
bbox(らせん,D_YMAX)になりますね。

そして、「らせん」を指定するにはオブジェクト名を書いてもいいのですが、後々のことを考えて(らせんじゃなくなった時も使えるように)「このノードの0番入力に刺さってるやつ」って教えてあげるのがよさそうです。

「ここの〇番に入力されてるやつ」の書き方は opinputpath("参照ノードの場所",何番目か) です。
ノードの場所は相対参照です。
パス表記はもうそういうルールなので覚えるしかないので覚えちゃいましょう。
丁寧に解説してくれてるWebサイトさんがいっぱいあります。

絶対パスと相対パス

このノード(.)の0番入力に刺さってるやつ、は

opinputpath(".",0)

ですね。

実際にcaptureLengthに入れる関数は

bbox(opinputpath(".".0),D_YMAX)

となります。

f:id:houdini_kitchen:20181010233427p:plain

これでらせんをねじったり、大きくしたり、曲げたりできるようになりました!
試しに「Bend」とか「Taper」とかのスライダを動かしてみましょう~ 。

f:id:houdini_kitchen:20181010233537p:plain

ちなみに、bendはup方向のほうのデフォーマしか動かないので、下方向も動くようにしたい!という場合はいまのbendノードの下にもう1回bendノードを作ってあげる必要があります。

今度は「らせんの一番高いとこ」が基準点で、キャプチャ方向はYの-1、 lengsは変わらず、「らせんの高さ」です。
今までに作ったものだけで出来ますよ~。
スクショを見ながら作ってみてください・x・

f:id:houdini_kitchen:20181010233617p:plain

ついでと言っては何ですが、頂点カラーも決められるようにしておきましょう。
カーブのポイントにAlphaを持たせておくと、それを基準に押し出しなどをしたときに、meshにも引き継がれて便利ですよ!!

bend2から「pointVop」をつなげて中に入り、らせんを作った時のように「bind」ノードを使ってcurveuを呼び出しましょう。

f:id:houdini_kitchen:20181010233653p:plain

curveuの値をrampにしてからAlphaに渡してあげれば狙った結果になりそうです。

f:id:houdini_kitchen:20181010233911p:plain


が、出力にAlphaらしきものが見当たりません(;ω;)!

でも大丈夫!!!
入力と同じようにデフォルトで用意されてないアトリビュートは、「bind export」ノードで名前を指定してあげると渡すことができます

デフォルトの入力と出力を全無視するのが若干申し訳ない(笑)
あ、頂点カラーAlphaのアトリビュート名は大文字のAなのでご注意を!

あとは、デフォルトのrampパラメータから出てくる値はVector型(色の情報)なので、Vector to Floatで少数に直してあげるのを忘れずに。
(Ramp自体をFloat型にしてもいいけど、パラメータのUIが見辛いので...)

ちなみに、おまじないというかお約束になってしまうのですが。 頂点カラー(Cd)を指定せずにAlphaだけを指定してしまうと、UE4やUnityでカラーが何をやっても0から変わらなくなってしまうことがあるので、Cd(頂点カラー)には定数(Constant)で「1.0」を入れておきます。

VOPはこんな感じになりました!

f:id:houdini_kitchen:20181010233814p:plain

最後に、頂点カラーは要る時と要らないときがあるので、Switchノードで「頂点カラーをつけるorつけない」を切り替えられるようにしておきます。

Switchノードに「bendが終わったらすぐSwichに入る」ルートと、「bendのあとpointVOPで処理をしてからSwichに入る」ルートを、それぞれつなげましょう。
※入力部分が●ではなく「うにょーん」と繋がっているノードは、複数の入力を受け付けているよーってことです!

f:id:houdini_kitchen:20181010234111p:plain

あと、これはお好みになるのですが、処理が一区切りついたらNULL(空白)ノードを作って「ここがゴールだよー」ってわかりやすくしてる人が多いです。

f:id:houdini_kitchen:20181010234135p:plain

今回も念のため「export_spiral」って名前をつけておきました。

ここまでで「仕組み」を作る工程は終了です!
おつかれさまでした。
名前を付けて大事に保存しておきましょう。

ここまで出来てめでたし、めでたしなんですが...
このチュートリアル(?)には、もうちょっとだけ続きがあるんじゃよ。

だって毎回こんな面倒なネットワークを組むのは時間の無駄だし、そもそも調整のためのパラメータが色んなノードにゴッチャリとしてて、「便利」とは対極くらいの位置にいるし。

 次回はそれらをスッキリさせつつ、3秒でこの「らせんカーブ」を呼び出す仕組みを作っちゃいますよ!
Houdiniが本気でデキル子に化けるのはここからじゃー!
おたのしみにぃ!

本日もありがとうございました!

続きは↓↓

houdini-kitchen.hateblo.jp

【Houdini】自由に形を決められる「らせんカーブ」を作る(1)

HoudiniのSOPマスターになろう企画第一弾!いぇーい。

今回は私がHoudiniを始めてすぐの時に、師匠から教えてもらった「らせん」を作ってみたいと思います。
主にHoudiniで制作するときの考え方とか、pointVOPの説明かな。

らせんカーブの作り方はこれ以外にもたくさんあるので、興味がある人は調べてみてね。
(師匠いわく「結局これがいちばん汎用性高くてシンプルで最強」とのことですが)

 

 

Step1.ベースになるcircleをつくる

円をゴニョゴニョしてらせんにしていきたいと思います。
1.Polygonで呼ぶ:ポイントいじりたいので
2.xz Planeにする:地面と平行の向きに
3.Arc TypeをOpenArcにする:閉じてると都合悪いので
4.ArcAnglesは暫定で360よりちょっと小さくしておく:後で増やすけど

f:id:houdini_kitchen:20181010222826p:plain

Step2.circleをresampleする(curveuアトリビュートを持たせる)

後々これが大活躍することになるんですが、 まぁいまは騙されたとおもってノードを作ってみてくださいな。
ネットワークでCircleとresampleへノードをつないだ後、 resampleノードのパラメータをいくつか変更します。

1.Maximum Segment Length(最大セグメント長)とMaximumSegmentsのチェックをはずす:大きさ(線の長さ)も分割数も自由に変えたいので
2.curve U Attributeにチェックを入れる :curveuアトリビュートが生まれて、0→1の値を持つようになる

f:id:houdini_kitchen:20181010222905p:plain


Step3.どうやってグルグルにするか考えてみる

さて、今回作りたいのは「ばね」のように、グルグル巻いてある形です。
いまは、地面にぶった切った円が置いてあるだけです。

たとえば、mayaで同じ状況に出くわしたなら、 どうやってらせん状にしましょうか?
(まぁmayaはプリミティブでらせん呼べるんでそこからの変換が一番早いんだけどね)

おそらく一番簡単なのは、 「どちらかの端っこをソフト選択して、上に持ち上げる」ですね。

f:id:houdini_kitchen:20181010223046p:plain

f:id:houdini_kitchen:20181010223100p:plain


この「ソフト選択で掴んで、上にもちあげる」を、 Houdiniが計算できるように、数学っぽい考え方にしてみましょう。

「ソフト選択」を噛み砕いて考えてみると、「選択した点に近い場所ほど、持ち上げられたときの影響が大きい」、と考えることができます。
つまり、「先端から終端にかけて、だんだん高くなっていく(一番高い所が欲しい高さ)」という処理ができれば良いわけです。

そして、この「先端から終端にかけて」の部分。
ここでさっきのStep2で作った「curveu(かーぶ ゆー)」アトリビュートの出番です。
「curveu」は、線の長さが何であろうと「始点0→終点1」という値を持つアトリビュートです。
まだピンと来てない人はmayaの「パスアニメーション」を思い出してみてください。

f:id:houdini_kitchen:20181010223214g:plain


パスの始めから終わりまでアニメーションさせるとき、「U値」というパラメータに0→1のアニメーションキーを打ちますね。
まさにあのU値の「U」です。
「カーブのU値」なので「curveu」です。

それを踏まえて、さっきの「最後の点ほどだんだん高く」を図解するとこんなかんじになります。
(一番上の高さを「1」にしたい場合。)

f:id:houdini_kitchen:20181010223254p:plain

 

Step4.さっきの仕組みをHoudiniで作ってみる

『ポイントが持っている「位置(P)」の高さ(Y)の値を、「curveu」の割合に応じて「高さ」を追加する』VOPを組んでみましょう。

「VOPって何ぞや?」って方は、いったんシーンを保存して、別の記事の中盤あたりの「VOPって何?食べれるの?おいしいの?」って項目を読んでみてね。

houdini-kitchen.hateblo.jp

 

まずは、処理したいノードの出力から、pointVOPの入力に繋いであげます。
繋ぎ終わったら、pointVOPノードをダブルクリックして中に入りましょう。

まず、今回ですが「位置(P)」の「高さ(Yの値)」だけ、変更をかけてあげなければいけません。勘の良い方はお気づきかもしれませんが、「VOPって何?」の例で位置(P)を頂点カラー(Cd)に渡したときはX、Y,Zの値が3つセットになって渡されていました。


位置Pに対してcurveuを直接足し算してしまうと、残念なことにZ,Y,Zすべてに数値が足されてしまいます。
原因はさっきもチラっと言っていましたが「X,Y,Zが3つセット」になっているからです。
この「浮動小数3つで1セット(Vector型)」の数値を、「浮動小数1つ(Float型)の値が3つ」の状態にしてあげる必要があります。

f:id:houdini_kitchen:20181010231700p:plain

 

そこで登場するのが「Vector to Float」ノード。(名前そのまんま!) さっそくTabから呼び出して、入力のPから繋いでみましょう。

f:id:houdini_kitchen:20181010231537p:plain

このノードの右側の水色の文字の出力たちが、上からX,Y,Zの数値になります。

今回、XとZは変更の必要がないので、そのままPに返してあげましょう。
なお、P(Vector型)に渡す数値なので、Float型から元のVectorに戻すのを忘れずに。 Tabメニューの「Float to Vector」から、float3つをVector1つに合体できます。

f:id:houdini_kitchen:20181010231813p:plain

さて、主役(?)のcurveuの登場なんです...が。
入力のアトリビュート一覧の中に「curveu」が見当たりません...

f:id:houdini_kitchen:20181010231857p:plain

こんなときは、「bind」ノードを使います。
curveuに限らず、自分が後から追加した等で一覧に表示されないアトリビュートはbindノードで呼び出すことができるんです。

さっそくTabメニューから呼び出し、分かりやすいところに配置して、パラメータの「Name」に「curveu」と入力してあげましょう。

f:id:houdini_kitchen:20181010232001p:plain

この「curveu」と、位置(P)のYの値を「足し算」します。
使うノードは「Add(加算)」です。
Tabで呼んで、入力の1番と2番にそれぞれの数値をつなぎます。
足し算の結果をPに渡してあげましょう。

f:id:houdini_kitchen:20181010232056p:plain

Addの出力を、XやZと同じように、Float to Vector の2番目の入力(Yにあたる部分)につないであげると...

f:id:houdini_kitchen:20181010232114p:plain

 

らせんができましたー!

f:id:houdini_kitchen:20181010232127p:plain

 

ただ、いまはcurveuを足し算しているだけなので、 いつも高さが1になってしまいます。(curveuは最大値が1なので)

これを解消するために、「高さを決めるパラメータ」を追加してあげましょう。
やること自体はとても単純。
curveuに欲しい高さの分だけ数値を掛け算してあげればいいだけです。

「高さの指定」ですが、円のアトリビュートには当然、 「Hight」など、高さに関係するパラメータは存在しません。
無いなら、勝手に作るしかないね!
パラメータの追加も、VOPの中で「parameter」ノードを使います。(そのまんまの名前...)

Tabメニューでノードを呼び出して良い感じの場所に置いたらノードを選択します。 「Name」には分かりやすいパラメータ名(今だとhightとか)をつけます。
1Float Defaultには、初期値を入れます(今回は1にしました)
Float Rangeには、このパラメータをGUIで操作するときの上限値と下限値を決められます(このあと紹介します。とりあえず0~10にしておきました。)

f:id:houdini_kitchen:20181010232350p:plain

乗算でおなじみの掛け算は「multiply」ですね。
addと同じようにcurveuとhightをかけて、その結果をaddの2番に渡してあげましょう。

ちなみに、もともと引いてある線を消したいときは、キーボードのYキーを押し込むとカーソルがはさみの形になります。
その状態でスパっと線を切るようにドラッグしてみてください。

f:id:houdini_kitchen:20181010232515p:plain

デフォルト値を1に設定したので、一見すると何も見た目は変わっていませんが、 キーボードの「U」キーを押して、VOPの中からgeometry1のネットワークに戻り、 pointVOPノードを選択すると、ひっそりと「hight」というパラメータが増えています。

f:id:houdini_kitchen:20181010232542p:plain

ためしにスライダを動かしてみると、らせんの高さが変わりますよ~ 。

なんと、らせんの作成自体はこれで完了です!!はやーい!!!
「らせんの半径」はcircleのRadiusを、 「カーブの分割数」はcircleのDivisionsを、 「何回ぐるぐる巻くか」はcircleのArcAnglesの数値をそれぞれ変更してあげることで、どんなぐるぐるでも作ることができます。

パラメータを決めてあげる場所がバラバラだったりしてちょっと不便ですが、 「自由にらせんを作るしくみ」はのベースがばっちり出来上がりました!

次回以降はこの「らせん」を竜巻の形(先がすぼんだりしてるやつ)にも変更できるようにしてみたり、 そこかしこに散らばっている入力項目を1か所にまとめたりして、 さらに使いやすいデータにクオリティアップさせていきます・x・!

だいぶ長くなってしまったので、ひとまず今回はここまで。

本日もありがとうございました!!

続きは↓↓

houdini-kitchen.hateblo.jp

海外の動画チュートリアルを勝手に日本語で解説する(その1の前編:VOPとかSOPとか)

海の向こうの先駆者さまに感謝。
バージョン16.5のAPPRENTICEで↓のチュートリアルを追っていきますー。 

vimeo.com

こちらはRohan Dalvi さんという方がアップロードしてくださったチュートリアルです。
Houdiniのバージョンが13のときの物なので、現行バージョンで差異が出て困っちゃった人とかの助けになれば。
(たぶんVOPが昔の仕様なのでそこで詰んでる人が多い?)

あと、私は基本的に英語ワカランの人なので、音声はけっこうスルーします(ひどい

動画で言っていないであろう補足説明とかもあれば、やっていきます。
もしかしたら英語で説明してくれてるかもだけどね!

ちなみにみんな大好き「SOP」(ジオメトリの形状をいろいろするネットワーク)と、 シミュレーションを計算する「DOP」ネットワークが出てくるので、混乱しないように気を付けてくださいね。

 

00:00~02:10:DOPネットワークの説明

最初のほうは、Houdini13でParticleの計算がいろいろ変わったよー 的なことを説明してます。
(昔、パーティクルの計算はPOPネットワークだったんですが、今はDOPネットワークの中で計算できるように統合されちゃいました。ちなみにその名残として、パーティクル制御系のノードは「POPなんちゃら」という名前が健在しています。)

単純にパーティクルってどんなものなのー?って確認してみるには、 シェルフの「Particles」タブから「Location Particle Emitter」を選択してEnterキーを押すと ポイントエミッターが作られて、タイムスライダを動かすとパーティクルがドバーっと出るよーって説明をしてます。

さらに、ネットワークウィンドウを見てみるとHoudiniがなにやらいろいろと自動でネットワークを作ってくれています。
(シェルフのボタンからものを作ると、こんな感じでプリセットをすぐに置いてくれます)

f:id:houdini_kitchen:20181010223931p:plain

f:id:houdini_kitchen:20181010224128p:plain

ちなみに、今は、自動で作られた「AutoDopNetwork」という階層の中に居ます。
キーボードの「U」を押すか、ネットワークのリストの最上層(objって書いてあるとこ)をクリックして一番上の階層に戻ってみましょう。

いつも使う「Geo」に似たアイコンの「Location_particles」というノードと、灰色の「AutoDopNetwork」というノードができています。

「AutoDopNetwork」パーティクルの動きの計算をしています。

「Location_particles」は、「AutoDopNetwork」の結果を読み込んで表示させているだけです。
レンダリングとかに使います。

とりあえず「ほーん、シェルフのボタンを押すと、計算するノードとレンダリング用のノードを作ってくれるのね」ってことが分かればOK。

f:id:houdini_kitchen:20181010223946p:plain

確認ができたら、「AutoDopNetwork」ノードをダブルクリックして中にもどりましょう。

DOPの基本構造を確認してみます。

f:id:houdini_kitchen:20181010224212p:plain

左側の「popobject」は、名前の通りオブジェクトが持つ情報です。
どれくらいの速度を持っているとか、重力このくらい受けるとか、こんな形状してる、とかですね。

右側の「location」がつないである部分は、 particleに影響する情報をいろいろ追加できる部分です。
基本的に「POP○○」系のノードをつなでいきます。
(たとえば風を吹かせたりするときはPOP fan をつなぐ)

f:id:houdini_kitchen:20181010224245p:plain

「popslover」というノードは、脳みその絵がついているとおり、 パーティクルがどうやって動くか、「考えて」くれるノードです。
どんなシミュレーションでも「○○sloverに材料を渡してあげて、計算してもらう」のが基本のカタチになります。

ちなみに、「marge」のノードがありますが、 このネットワークの中では、モデリングなどのマージ(合体)ではなく、 「こいつら、関係してるよ」というときに使います。
たとえば、「パーティクルが地面と衝突する」場合、 「パーティクル」と「地面」をmargeしちゃいます。

f:id:houdini_kitchen:20181010224307p:plain

ちょっとややこしいですが、もうこれはDOPネットワークの中のお作法なので、脳死で「そういうもん」と覚えちゃいましょう。
Macユーザーの人が何のためらいもなくUSBメモリアイコンをゴミ箱に突っ込むのと同じです。
(ずっとWinユーザーだったので、初めて取り外し現場見たときちょっとびっくりした)

説明が終わったところで、プレビュー用の「AutoDopNetwork」と「Location_particles」は消しちゃいます。

ここから、サムネイルにもなっている「粒子を飛ばしながら消えていく球」を作ります。
大まかな流れとしては、「浸食されながら消えていくSphere」を作るパートと、 「消えていくSphereからparticleを飛ばす」というしくみを作るパートがあります。

 

02:19~ 浸食されながら消えていくSphereをつくる

きれいさっぱりな状態からスタートです。
まずは何事も「入れ物」から。
Tabメニューから「Geometry」を呼び出して、中の「File」を削除しましょう。

f:id:houdini_kitchen:20181010224403p:plain

そのまま、新しくTabメニューから「Sphere」を作ります。

f:id:houdini_kitchen:20181010224516p:plain
Sphereのパラメータを設定していきます。
今回はPolygonの球を使いたいので、PrimitiveTypeを「Polygon」にしましょう。
あと、分割数も細かい方が都合がいいので、Frequencyを30くらいに増やしちゃいます。

f:id:houdini_kitchen:20181010224535p:plain


次に動画では「vopsop」というノードを繋いでいますが、 新しめのHoudiniでは、このノードは存在しません。 (※「pointVOP」や「primitiveVOP」など、どこのアトリビュートをいじるのかによって細分化されたからです)

今回はスフィアのポイントに対して処理をかけたいので「pointVOP」を使います。 動画のように「Sphere」の出力を「pointVOP」につなぎます。名前がちょっと違うだけで、機能は同じなのでご安心を。

f:id:houdini_kitchen:20181010224601p:plain

ちょっと動画からいったん離れてしまいますが、軽くVOPの説明をしますね。

 

VOPって何?食べれるの?おいしいの?

VOPは、ポイントやプリミティブなどに対して、「何かしらの規則に従って処理をする」ときにすごく便利な方法のひとつです。
たとえば「偶数のポイントは白、奇数のポイントは黒にする」とか「上からだんだん透明になっていく」とか。

数式を直接記述する「Wrangle」という方法もありますが、VOPだと処理の流れがグラフィカルに見える&触れるので、プログラミングがさっぱりなデザイナーでもHoudiniの強力な計算機能をバリバリ使いこなせる、というわけです。
(ちなみにVEX言語でWrangleをゴリゴリ書いたとしても、最後はHoudiniがVOPに自動変換してるっぽいです)

使い方の例として、ポリゴンの球体のポイントに対して、 pointVOPで「位置(P)」の情報を「頂点カラー(Cd)」に出力してみようと思います。
(実際にHoudiniを操作しながら読んでいる方は、この部分は作らずに読むだけでOKです!)

まずはSphereを作り、出力(ノードの下側の丸いやつ)を pointVOPノードの入力(上側の丸いやつ)に繋いであげました。

f:id:houdini_kitchen:20181010224741p:plain

pointVOPノードをダブルクリックすると、ノードの中にはいれます。
中に入ると、デフォルトで「入力」と「出力」が用意されています。
この「入力」には、先ほど「入力」につないだものの情報が入っています。
いまなら、先ほど繋いだSphereの情報ですね。
そして、ポイントの「位置(P)」を「頂点カラー(Cd)」にドラッグして繋いであげると、球が虹色になります。

f:id:houdini_kitchen:20181010224817p:plain

何が起こったのか詳しく説明すると、それぞれのポイントが持っている 位置(X,Y,Z)の値がそのポイントの頂点カラー(R,G,B)に渡された、という結果が見えている、という状況です。

ためしに、画面の上の方にある「Geometry Spredsheet」というタブを開いて確認をしてみます。


この画面には、いま見ているオブジェクトが持っているアトリビュートの値が一覧として並べられています。
P(位置)の値とCd(頂点カラー)の値が等しくなっているのが確認できます。

f:id:houdini_kitchen:20181010224917p:plain

 念のため、36番のポイント(X0,Y0,Z1)をビューポートで見に行ってみると・・・ (Geometry Spredsheetと同じ行に並んでいる「Scene View」タブにいくと戻れます) ちゃんと青色(R0,G0,B1)になってますね。

f:id:houdini_kitchen:20181010225015p:plain

今回は「自信の位置情報を頂点カラーに反映する」というVOPを組みましたが、 計算式やRamp(グラデーション)をうまく使って「Y方向にだけグラデーションさせる」なんてこともできます。
「赤色のとこだけ法線を反転させる」とか「ランダムな方向にポイントを移動させる」とか、 処理内容を言葉で説明できるときは、だいたいVOPで実現できる、というわけです。まぁ使って覚えたほうがいいかも!VOP便利だよ!

......。
雑にVOPを推したところで、チュートリアル動画の解説に戻ります。

先に動画で作られているVOPの内容を先にネタバレしてしまうと、

1)ポイントのカラーにランダムな値を持たせて「まだら模様」を作る
2)時間経過と共に、黒→白、と、色の面積が浸食しながら移り変わるようにする
3)「白い部分のポリゴンは削除する」

という処理を加える という流れになっています。

 

ポイントのカラーにランダムな値を持たせる

さっそく「ポイントのカラーにランダムな値を持たせる」というVOPを組んでいきましょう。

まずはSphareの出力と「PointVOP」をつなぎます。
「PointVop」ノードをダブルクリックして、中に入りましょう。


今回は「ポイントのカラーにランダムな値」をもたせてあげたいので、 ゴールは「Cd(頂点カラー)」ですね。


「Cd」に「ランダムな値」を入れてあげます。
今回の場合は「ジワジワと部分的に欠けていくように消えていく」画が欲しいので、 完全にランダムにしてしまうと、結果が砂嵐のようになってしまって制御が難しそうです。

そんな時に活躍するのが「ノイズ」!
エフェクト屋さんはみんな大好きノイズです。

ぱっと浮かばない方はAfterEffectsの「タービュレントノイズ」を思い出してみてください。
あの雲模様、いい感じのディゾルブになりそうでしょ?

f:id:houdini_kitchen:20181010225405p:plain

と、いうことでさっそくTabメニューから「Turbulent Noise」を呼びだします。

f:id:houdini_kitchen:20181010225459p:plain
ちなみに、Houdiniでノイズを使うときはかならず、何かしらの位置の情報(pos)が必要です。
今回はSphereのPを使いましょう。

f:id:houdini_kitchen:20181010225515p:plain

結果のノイズは「Cd(頂点カラー)」に渡してあげます。
球がまだら模様になりました!

f:id:houdini_kitchen:20181010225538p:plain

...が、このままだと「時間経過と共に黒の面積を増やす」っていうのが厳しそうですね。
この結果をSphereに渡す前に、もう一工夫入れてあげましょう。

このノイズの結果がRamp(グラデーション)でいうと、どのあたりの数値になるか、として出力してあげるようにします。

f:id:houdini_kitchen:20181010225640p:plain


この「グラデーションに置き換えたらどれくらい?」という結果を出してくれるのが「ramp」ノードです。
Mayaでもグラデーションを作れるrampマテリアルっていうのがありましたね。
あのランプです。

そして、時間の経過と共に「黒」と返される範囲が多くなっていけば、黒の面積がだんだん増えていきますね。

f:id:houdini_kitchen:20181010225704p:plain

ただ、Houdiniのお約束として、Rampに渡す値は必ず0~1の範囲内でなければいけません。

いまはノイズの出力した乱数をそのまま渡しているだけなので、大きすぎたり小さすぎたり、マイナスだったりする可能性があります。
この問題を解決してくれるのが「fit Range」ノード!
このノードは、数字を渡すと、決められた範囲にリマップ(新しい範囲の中だとどのくらいなのか、適切に置き換え)してくれます。

たとえば「1~100」という数字の範囲の中で「50」という数字があった場合、 fit rangeさんに「"50"って、0~1の範囲の中に存在してた場合だといくつ?」と聞くと「0.5だよ」と返してくれるわけです。
ちょっと言葉だけだと難しいので、公式のfit Rangeノードのリファレンスを見た方がいいかも^^; 

Fit Range (Unclamped)

とりあえず、「0~1の範囲内に収まるように」とか「0~100だった場合に置き換えて」とかいう言葉が出てきたら fit rangeさんの出番、ってことですね。

動画では「Unclamped」のほうを使っているみたいなので、fit range(Unclamped)を使います。
(※普通のfitは、範囲外の数値がある場合は最大or最小値に固定しますが、unclampedだと「こんくらいじゃね?」と推定された値を返します。)

Tab>fit range で呼び出したら、Souse Minを-0.644くらい、Souse Maxを0.61くらいにしておきましょう。

f:id:houdini_kitchen:20181010225934p:plain

そしてタービュレントノイズの「noise」をfitの「val」に渡します。

さらに、fitの「Shift」をrampの「imput」に渡して、結果(ramp)を頂点カラー(Cd)に渡してあげましょう。

f:id:houdini_kitchen:20181010225902p:plain

球の見た目はほとんど変わっていませんが、rampの処理を入れたおかげで黒色の割合などをいい感じに制御できるようになっています。

ちなみに、rampはVOPの中でパラメータを変更しても最終結果に反映されません。 VOPのひとつ上の階層(SOPの中)でパラメータを設定してあげましょう。

f:id:houdini_kitchen:20181010230036p:plain


ノイズを制御しているTurbulent NoiseはVOPの中でパラメータを操作することができますが、 ノードを右クリック>VEX/VOP options>Create Input Parameters を選択することで、ひとつ上の階層から操作ができるようになります。

f:id:houdini_kitchen:20181010230121p:plain
(Rampの下に、ノイズ関係のパラメータが追加されます)

f:id:houdini_kitchen:20181010230139p:plain


上の階層からの入力値を受け取っているノードのインプットの●は、ビョーンって横に伸びています。わかりやすい!

f:id:houdini_kitchen:20181010230153p:plain

Uキーで上の階層に戻って、ノイズを調整していきます。

Noise Typeを「Original Perlin Noise」に変更します。
Frequencyを1.5くらいまで上げます。
(※各チャンネルでは中ボタンクリックすると数値調整用のメニューが出ます。数字の上でドラッグで調整するとその分の数値が足し引きできます。チャンネル名の上でやるとすべて同じ値を入れてくれます。入力要らずで楽ちんです)

f:id:houdini_kitchen:20181010230252p:plain

「だんだん黒い面積が減っていく」というアニメーションをつけます。

タイムスライダの位置が「1」になっているかどうか確認してから、 Rampパラメータの黒色のメモリ(PointNo1)を、7割くらいの位置まで移動します。
Altキーを押しながらチャンネル名(いまなら「Position」)をクリックすると、アニメーションキーを打つことができます。

同じように白色のメモリ(PointNo2)も、Alt+クリックでキーを打ちましょう(動かす必要はないよ)

さらに、タイムスライダを「120」まで進めて、こんどは 黒色のメモリ(PointNo1)を、0の位置まで移動させてキーを打ちます。

f:id:houdini_kitchen:20181010230356p:plain

白色のメモリ(PointNo2)も、2割くらいのところまで移動させてAlt+クリックでキーを打ちましょう。

キーを打ち終わったら、タイムスライダを動かして確認してみましょう。 じわじわと色が浸食されるアニメーションができているはず!!
※挙動がおかしい場合は、どこかにキーフレームの打ち忘れが無いか確認してみてください。

f:id:houdini_kitchen:20181010230431p:plain

あとはこのノードが何をしているノードなのか、 あとから見たときに分かりやすくするために、名前を変更しましょう。

ネットワークウィンドウでノード名をクリックすると入力ができるようになるので、「noise」に変更しておきます。

f:id:houdini_kitchen:20181010230459p:plain

白色に変化したポイントは消していくようにします。
何かを消すときは「Delete」ノードを使います。(名前そのまんまやな...)
Tabメニューから呼び出して、「noise」からつなぎます。

f:id:houdini_kitchen:20181010230537p:plain

そのままつなぐとすべてが削除されてしまうので、「白いやつだけ消してね」と、消す条件を追加してあげましょう。

Deleteノードを選択して、Operationを「Delete by Expression」に変更します。
さらにFilter Expressionに「$CR > 0.8」と入力します。

f:id:houdini_kitchen:20181010230635p:plain


(※「プリミティブのRが0.8より大きい」っていう条件式です。今回はグレーなのでどのチャンネル見ても数値が一緒のため、Rチャンネルを見てます。)

エクスプレッションの書き方は、いい感じにまとめてくださっている方がいらっしゃるのでそちらを見て使いながら、チマチマ書いて覚えるのがいいかと↓↓ 

 一気にいけるかと思ったけど、 けっこうしんどかったので分割することにします・・・。
ここまで作れていれば、球がだんだん消えていくはずです!

f:id:houdini_kitchen:20181010230802p:plain


後編ではいよいよ、DOPネットワークでパーティクルをとばしますよー!

本日もありがとうございました!