Houdiniで稲妻っぽいのを作ってみた。


Scene Fileはこちら(Houdini 18.0.391、Nuke12.1)
アニメーション付きモデル
自宅で何かする際に、アニメーションついたデータが合ったほうがそれっぽくなる。
Mixamoはアニメーション付きのモデルをダウンロードできるサービス。
いろいろなポースがあるのでおすすめ。
Maya 2020.1以降であればRokoko Motion Libraryの一部が付属するようになったのでそれでもいいと思う。
後はUnityやUE4のマーケットプレイスからいい感じのを探すとか。
ノード全体

仕様
- Curveをインプットする
- Curveは複数本可能
- 向きや大きな形状は元Curveで制御
- ノイズや色、数を増やして稲妻っぽく見せる処理をする
なるべく汎用性が高く流用しやすい作りが望ましい。
作り方
本数を増やす

"Copy and Transform"のTotal Numberで各カーブの数を増やす。
ポイント数を増やす

ResampleでPoint数を増やし、Tangent Attribute、CurveU Attribute、Curve Number Attributeを設定
各Curveの長さを測る

MeasureのMeasureをPerimeterにする。
UVとupを作成する

各Primitive(Curve)ごとにFor-Eachで処理をする
最初の"set_uv"で以下のWrangleを書く。
これでUVのxがCurveの長さのUVができる
//get perimeter float peri = prim(0,"perimeter",0); //fit peri float curveLength = fit(@curveu, 0, 1, 0, peri); //set uv v@uv = set(curveLength, @curvenum, 0);
その後Restを作り、"uv_to_P"で以下のWrangleでPをuvにする。
@P = @uv;
"Poly Frame"でupアトリビュートを作成

多分Y軸に並行にできるはず。
"reset_P"で以下のWrangleを使い、Pをもとに戻す
@P = @rest;
ランダム値の元を作る
"set_amount"(Point VOP)でupをランダムにするためのアトリビュートを作成する

ノイズはいい感じに設定する。
Fit Rangeはこの次で回転させるので-360~360とか回しやすい値にする。
upアトリビュートを回す
"calc_rot"に以下のWrangleを書く
//set axis vector axis = @N; //calc rot float rot = @amount; vector4 q = quaternion(radians(rot), axis); //set rot v@up = qrotate(q, @up);

画像のようにYに並行だったupがランダムになる。
ただし完全にランダムにしてしまうと後々都合が良くないため、
Nの向きを中心とした軸固定の回転をさせてランダムにする。
ノイズをかける
次で使いやすいように、"attribswap1"でNとupを入れ替える。
"add_noise"でノイズを追加する。
ノイズはuvをベースに作成し、Offsetにupとランダムにするための値を加算する。
"Displace along Normal"でNの方向に作ったノイズをかける。
このNは先程作ったupなので、上下左右にのみポイントが移動し、Curveの前後にはノイズが移動しない。

ノイズをスムースする

"Smooth"を使ってノイズでぱきっとでこぼこしたものを滑らかにする。
問題がない場合を除き、SmoothやBlurで滑らかにするのが手軽でいい。
細かいノイズを追加する
"Mountain"で細かいノイズを追加する

pscaleを設定する

"set_pscale"でpscaleを設定する。
FitとRampで何割かが太くなるような調整をする。
//get min max
float minScale = chf("min_scale");
float maxScale = chf("max_scale");
//random and fit
float randScale = rand(@curvenum);
f@pscale = fit(randScale, 0, 1, minScale, maxScale);
//set hero
float heroRamp = chramp("Hero", randScale);
float minHero = chf("min_hero");
float maxHero = chf("max_hero");
//set pscale
f@pscale += fit(heroRamp, 0, 1, minHero, maxHero);
色を設定する
"Color"で色を付ける
この際のRangeは
ch("../set_pscale/min_scale") + ch("../set_pscale/min_hero")
ch("../set_pscale/max_scale") + ch("../set_pscale/max_hero")
とかで取得するほうがいいかも

AOV用ノイズ設定
今回は以下のノードの組み方でノイズの値違いを2つ用意
ノイズは濃淡がぱきっと出づらいので"pow"でぱきっとさせる。

レンダリング
シェーダー
デフォルトの"Glow"シェーダーをアサインする

Glowシェーダー内で、AOVをレンダリングするための設定を行う。

AOVs

Extra Image Planesで画像のように作成したAOVsを書き出すように設定する。
この際、Sample FilterがOpacity Filteringだと書き出されないので注意。
必ず、Full Opacity Filteringにすること。
よくわかってないが、アルファがないのでちゃんと書き出されないという感じ。
コンポジット

Color Correct

AOVのNoiseA,Bを使用して、ちょっとオレンジっぽく色を振った部分と、彩度を抜いて輝度をあげた部分を作成する。
Chromatic Aberration

厳密にはChromatic Aberrationではないが、それっぽい色収差を加える。
やりすぎるととてもダサくなる。
ShuffleでR,G,Bにそれぞれ分離し、RとG"iTransform"とNoiseを使って歪みを足すことで色をずらしている。
その後RGBを再度加算して結合。
"iTransform"は白黒画像をマスクにして画像を歪める処理をする。
標準で入っているが、以下の手順でAll Plugin Updateを押さないと出てこない。なんで??

Glow(Blur)

よくあるBlurしたものを何度も重ねる方法と、もう一つで作成
グローで困ったことがある人はここを見るのがいい!
けど、逆自乗減衰が100%いいわけではないので、このセットアップで組んでから調整していくのがいいと思う。
商用版であればExplo Glowとかを使ったほうが早い。
Glow(Convolve)

Optical Flaresとかフレア用のPluginがない場合や、中心点がないけどちょっと形のついたグローがほしい場合などに。
"Flare"ノードなどでほしい形を作る。Alphaが望みの形状ならどんな方法でもOK

これと、"Keyer"等で輝度の高い部分を取り出した画像を用意し、
"Convolve"につなぐと、輝度の高い部分に先程作った形状のブラーのようなものができる。