moyasiエフェクト館

主にエフェクト関係の記事を上げていこうかと思います。


エフェクトに関係する記事上げてきます
エフェクト関係の記事の内容は緩く募集中
自分がわかる範囲であれば書いていこうかなと。

【Houdini】Stamp機能をCopyToPointで代用し、角度を調整する

f:id:tktknkyo:20191023010725p:plain

Verは17.5.391です

 

【初めに】

Houdiniには

f:id:tktknkyo:20191022193628p:plain

CopyStamp、という非常に便利なノードがあります

複製しつつ、ランダム性も持たせるという機能なのですが

ただ難点として、これがかなり重いです。

 

データ量が少なくても、このStamp機能で処理が結構かかってきてしまう

という事が起きたりします。

 

f:id:tktknkyo:20191022194127p:plain

なので、こちらの、CopyToPointを使って

この機能を擬似的に真似してみようかと思います。

 

【複製する角度を乱数に】

f:id:tktknkyo:20191022194536p:plain

まずは、このようなものを作りました。

棘のようなものを、円状に並べたものです。

氷や岩などのベースなどに使えそうです。

 

f:id:tktknkyo:20191022200300p:plain

作り方としては、まず複製するジオメトリ自体は、Tubeを二つ繋げて作ります。

横に倒してあるのは、複製する場合に向きが可笑しくなってしまった為です。

 

f:id:tktknkyo:20191022200417p:plain

複製するポイントは、Circleを使っています。

デフォルトだと角度がおかしいので、X軸に90度回転を入れています。

 

 

 

 

解りやすく極端な例としては

f:id:tktknkyo:20191022195153p:plain

このように、複製する毎にランダムな角度になるようにします。

そもそもこの角度はどこで決まるのか?という話になります

CopyToPointノードの設定で第1入力か第二入力かのどちらかを選択できます。

ここでは第二入力の角度を取得するようにします(デフォルト設定のままです)

 

f:id:tktknkyo:20191022195436p:plain

この場合、第二入力の、法線の方向によって決定されます。

つまり、法線さえ弄ってしまえば、角度を自由に変更できるということになります。

 

法線はPointWrangleで作っていきます

f:id:tktknkyo:20191022200947p:plain

内容としてはこんな感じになりました。

やっている手順としては

元の法線の情報である@N(今回は全て(0,1,0)の上向きの法線になります)と

中心から外に向かうベクトルを仮の法線として

その二つの間からランダムに持ってくる。というイメージです。

 

f:id:tktknkyo:20191022201620p:plain

中心から外に向かうベクトルは、このような方向を向くベクトルになります(青い線がそうです)

 

f:id:tktknkyo:20191022205836p:plain

単純に、角度をバラバラにしたいのみであれば、これだけで十分です

ただ、これだと調整ができないので

自由に調整をしたいのであれば、ここを編集する必要があります。

 

f:id:tktknkyo:20191022211211p:plain

次に移る前に、コードを少し書き換えます。

内容としては変わっていません

この状態で、このAngleという変数に入れた数値で、法線の角度が変わるようになります。

 

では、このAngleに何を入れるのか?という部分になります。

現段階で、このAngleが0であれば、上向きに複製されます

逆に1になれば、中心から外を向く配置になります。

 

どのように角度を調整するようにすればいいのか?

という部分は、個人差があると思いますが。

今回は、基準となる角度と、振幅を指定する二つの角度で制御します。

 

まず基準の角度を作ります

f:id:tktknkyo:20191022212458p:plain

ch関数を使うことで、下に操作できるスクロールバーが追加されるので

ここで角度を調整できるようになります。

 

f:id:tktknkyo:20191022212616p:plain

ここのパラメータで複製される角度が一律に変更されていれば完了です。

 

この段階を、基準の角度として、ここに乱数を加えていきます。

 

乱数の部分は見やすいように、一旦変数を作ります

f:id:tktknkyo:20191023005358p:plain

また、rand関数で0~1の乱数は使うので、一旦作ります。

 

やりたい事としては、Angleの変数に乱数を追加する訳ですが

その乱数を、制御したい、という事になります。

厳密には例えば0.2であれば-0.1~0.1という事になります。 

 

今回であれば、この0.2は後から調整するので、パラメータを作ります

f:id:tktknkyo:20191023005745p:plain

実際にどのくらい変化するかは、スクロールバーで調整できるようになりました。

 

f:id:tktknkyo:20191023005904p:plain

また、更に受け取った数値を0.5で掛けた数値を引き算すれば

0.2の場合であれば-0.1~0.1の数値が返ってくるようになります。

 

f:id:tktknkyo:20191023010102p:plain

次は、計算した変数を、Angleの変数の中に加算します。

最後に、ランダムシードも作っておきます。

 

f:id:tktknkyo:20191023010250p:plainこれも解りやすいように、変数に入れておきます。

randの変数の中のrandの関数の中の数値が変われば変化がするので

@ptnumでポイント番号からとってきている部分に、加算するだけで設定ができます。

 

f:id:tktknkyo:20191023010619p:plain

これで、こんな感じに、パーツごとに倒れたり、倒れてなかったりの調整ができるようになってると思います。