この記事はアドベントカレンダーの記事の枠を使った備忘録です。
以下の6つの方法を紹介してますがラストの二つは完全におまけで水増し分です。
-
数字の大きい方へベクターを向ける polyframe/attrib gradient
-
ベクターを回り込ませる (v - N * dot(N, v))
-
固有のアトリビュート数 nuniqueval
-
平面のvdb化vdb convert/unsigned distance field
-
ジオメトリの変形についてくるscatter attribute interpolate
-
ノイズのポジションにノイズ
hiplcはこちらからどうぞ。
数字の大きい方へベクターを向ける polyframe/attrib gradient
色でベクターを制御する方法。最初の画像は腹部を中心にジオメトリに沿ってグラデがつくられてますがこれを使って2画像目のようなベクターを生成します。明るい部分から暗い部分に向かっている感じです。
方法
黒から白に代わるグラデーションをつくってpolyframeをつなげる
polyframe/styleをattrib gradientにしてここにCdを入れる。これによってpolyframe/tangent nameのアトリビュートが黒から白に向かうベクターになります。
ここではグループで指定した位置からdistance along geometryで距離を生成してこれをカラーにしたものをattrib gradient使ってます。このアトリビュートはフロートではなくベクターである必要がありますがRチャンネル以外は使ってません。
似たようなノードにfind shortest pathというのがありますがあれに必要な知識は汎用性がゼロでおぼえても忘れますし、使えそうな状況で事あるたびに使おうとして一度もいい感じになったことがないので個人的には一切使わないです。
用法
微妙に入り組んだオブジェクトに沿ってなんかある程度は正確なベクターが欲しいときに使います。
逆に単純なオブジェクトならこういう面倒なことはやらないで単なる放射状のベクターとかでいいと思います。白と黒でベクターとか制御しづらいですし。
ベクターを回り込ませる (v - N * dot(N, v))
ジオメトリのノーマルと方向のベクターを使ってジオメトリを沿ったベクターを作ります。
たとえば1枚目の画像(ノーマル)と2枚目(方向)をつかって3枚目みたいにします。
式は以下の通り。
v@N = (v - N * dot(N, v) );
原理としてはvector alignmentというものを使ってます。日本語ではなんていうか知りません。単語数的に簡単に説明すると直行するベクターを足すと斜めの傾いたベクターをえられるので斜めのベクターから垂直ベクターを引くことで平行ベクターを得る、というもので、この平行ベクターがジオメトリに沿ったものになります。
v = x(v)+y(v)なので x(v) = v-y(v) という感じです。ただしこれは単なる原理でありこれだけだと上の式は導き出せません。
あと実際の式は v-N*dot(N,v)/length(N); でlengthとかあるんですがなくても欲しいベクターは得られるし複雑な式はおぼえたくないのでスルーします。
用法
パーティクルにいい感じに迂回させたいときに使います。普通にコリジョンさせるとあらぬ方向に反射していきますからね。
あるいはフィールドを作るときとか。
固有のアトリビュート数 nuniqueval
特定のアトリビュートの固有の数を使いたいときに使います。
例えばnameの固有の数を知りたいときは以下の通り。
i@names = nuniqueval(0,"prim" , "name");
nameがpiece[1-100]とかなら100個で確定ですがいらない破片を削ったりすると数えるのが超だるくなりますそういう時にこのコマンドを使うと個数がわかります。
用法
wedgeとかで正確な個数を使いたいときに使います。
平面のvdb化 vdb convert/unsigned distance field
板に厚みを持たせる方法。
1枚目のような厚みのないポリゴンを2、3枚目のように厚みを持ったポリゴンあるいはvdbにします。
方法
vdb from polygons でunsigned distance field にチェックを入れて
vdb convertにつなげます。ポリゴンにしたいときはそのままポリゴンに、surfaceが欲しいときはvdbにして vdb clasを convert fog to sdfにします。
ポリゴンにする場合でもvdbにしたい場合でもiso valueをいじらないと表示されないことが多いです。
scatter - vdb from partiles でも同じようなことはできますが大きいサイズだと多分めっちゃ重いのでこの方法のがよさそうです。
用法
煙をシミュしたいときに地面をコリジョンしたいのにもらったジオメトリがバキバキに平面が刺さってるときとかあるんですがそういう時にこの方法を使います。
extrudeすればいいじゃねーかという意見もあると思いますがそれをやると謎のトゲが発生することが稀によくあるのでそういう時は上記の方法が良いかと。extrudeでいい時もありますけどね。
ジオメトリの変形についてくる scatter attribute interpolate
動くジオメトリにスキャッターを撒きたいときに使います。この方法でスキャッターすると粒が暴れずアニメーションについてきます。
方法:
時間を止めたジオメトリにscatterをつなげてoutput attribタブの上から二つのチェックを入れ、そと元オブジェクトをattribute interpolateにつなげるとできます。
個人的にこの機能は使わないです。人のファイルを見てるときにこの機能を使ってるのを見つけて、そういえばそういうのもあったよね、くらいの感じです。使わない理由はこのやり方に汎用性がなく、ここでおぼえたことは他では使えないので忘れやすいからです。
代わりにpoint deformを使ってます。どちらを使うかは趣味の問題です。
さらに詳しい説明は別の人がやってたと思うので探せば出てくるんじゃないでしょうか。
用法、、、の説明はいらないかと。
ノイズのポジションにノイズ
そういえばそんなのもあったよね、という小ネタ。
ノイズのインプットにノイズを入れるとそこそこ面白い図形が得られます。左のノイズの派生系が右二つです。以上。
フィールドとしてはわからないですが図形としては悪くないかもです。
//