すあまの備忘録

誰得内容の自分のための非営利目的備忘録ブログ(筆者がわかっても内緒にしてください)

Houdiniで稲妻

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

f:id:godofsuama:20200322150345p:plain

f:id:godofsuama:20200322164642p:plain

youtu.be

Scene Fileはこちら(Houdini 18.0.391、Nuke12.1)

アニメーション付きモデル

自宅で何かする際に、アニメーションついたデータが合ったほうがそれっぽくなる。

Mixamoはアニメーション付きのモデルをダウンロードできるサービス。

いろいろなポースがあるのでおすすめ。

Maya 2020.1以降であればRokoko Motion Libraryの一部が付属するようになったのでそれでもいいと思う。

後はUnityやUE4マーケットプレイスからいい感じのを探すとか。

ノード全体

f:id:godofsuama:20200322152149p:plain

仕様
  1. Curveをインプットする
  2. Curveは複数本可能
  3. 向きや大きな形状は元Curveで制御
  4. ノイズや色、数を増やして稲妻っぽく見せる処理をする

なるべく汎用性が高く流用しやすい作りが望ましい。

作り方

本数を増やす

f:id:godofsuama:20200322152849p:plain

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

ポイント数を増やす

f:id:godofsuama:20200322153020p:plain

ResampleでPoint数を増やし、Tangent Attribute、CurveU Attribute、Curve Number Attributeを設定

各Curveの長さを測る

f:id:godofsuama:20200322153214p:plain

MeasureのMeasureをPerimeterにする。

UVとupを作成する

f:id:godofsuama:20200322153545p:plain

各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アトリビュートを作成 f:id:godofsuama:20200322154104p:plain

多分Y軸に並行にできるはず。

"reset_P"で以下のWrangleを使い、Pをもとに戻す

@P = @rest;
ランダム値の元を作る

"set_amount"(Point VOP)でupをランダムにするためのアトリビュートを作成する

f:id:godofsuama:20200322154358p:plain

ノイズはいい感じに設定する。

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);

f:id:godofsuama:20200322154611p:plain

画像のようにYに並行だったupがランダムになる。

ただし完全にランダムにしてしまうと後々都合が良くないため、

Nの向きを中心とした軸固定の回転をさせてランダムにする。

ノイズをかける

次で使いやすいように、"attribswap1"でNとupを入れ替える。

"add_noise"でノイズを追加する。

ノイズはuvをベースに作成し、Offsetにupとランダムにするための値を加算する。

"Displace along Normal"でNの方向に作ったノイズをかける。

このNは先程作ったupなので、上下左右にのみポイントが移動し、Curveの前後にはノイズが移動しない。

f:id:godofsuama:20200322155614p:plain

ノイズをスムースする

f:id:godofsuama:20200322160354p:plain

"Smooth"を使ってノイズでぱきっとでこぼこしたものを滑らかにする。

問題がない場合を除き、SmoothやBlurで滑らかにするのが手軽でいい。

細かいノイズを追加する

"Mountain"で細かいノイズを追加する

f:id:godofsuama:20200322160521p:plain

pscaleを設定する

f:id:godofsuama:20200322160647p:plain

"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")

とかで取得するほうがいいかも

f:id:godofsuama:20200322160926p:plain

AOV用ノイズ設定

今回は以下のノードの組み方でノイズの値違いを2つ用意

ノイズは濃淡がぱきっと出づらいので"pow"でぱきっとさせる。

f:id:godofsuama:20200322161149p:plain

レンダリング

シェーダー

デフォルトの"Glow"シェーダーをアサインする f:id:godofsuama:20200322161756p:plain

Glowシェーダー内で、AOVをレンダリングするための設定を行う。 f:id:godofsuama:20200322161913p:plain

AOVs

f:id:godofsuama:20200322162049p:plain

Extra Image Planesで画像のように作成したAOVsを書き出すように設定する。

この際、Sample FilterがOpacity Filteringだと書き出されないので注意。

必ず、Full Opacity Filteringにすること。

Mantraレンダリングプロパティ

よくわかってないが、アルファがないのでちゃんと書き出されないという感じ。

コンポジット

f:id:godofsuama:20200322163811p:plain

Color Correct

f:id:godofsuama:20200322163940p:plain

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

Chromatic Aberration

f:id:godofsuama:20200322164150p:plain

厳密にはChromatic Aberrationではないが、それっぽい色収差を加える。

やりすぎるととてもダサくなる。

ShuffleでR,G,Bにそれぞれ分離し、RとG"iTransform"とNoiseを使って歪みを足すことで色をずらしている。

その後RGBを再度加算して結合。

"iTransform"は白黒画像をマスクにして画像を歪める処理をする。

標準で入っているが、以下の手順でAll Plugin Updateを押さないと出てこない。なんで?? f:id:godofsuama:20200322164359p:plain

Glow(Blur

f:id:godofsuama:20200322164655p:plain

よくあるBlurしたものを何度も重ねる方法と、もう一つで作成

グローで困ったことがある人はここを見るのがいい!

けど、逆自乗減衰が100%いいわけではないので、このセットアップで組んでから調整していくのがいいと思う。

compojigoku.blog.fc2.com

商用版であればExplo Glowとかを使ったほうが早い。

Glow(Convolve)

f:id:godofsuama:20200322165444p:plain

Optical Flaresとかフレア用のPluginがない場合や、中心点がないけどちょっと形のついたグローがほしい場合などに。

"Flare"ノードなどでほしい形を作る。Alphaが望みの形状ならどんな方法でもOK

f:id:godofsuama:20200322165629p:plain

これと、"Keyer"等で輝度の高い部分を取り出した画像を用意し、

"Convolve"につなぐと、輝度の高い部分に先程作った形状のブラーのようなものができる。