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"につなぐと、輝度の高い部分に先程作った形状のブラーのようなものができる。