地味にたまに必須になる機能の備忘録

この記事はアドベントカレンダーの記事の枠を使った備忘録です。
以下の６つの方法を紹介してますがラストの二つは完全におまけで水増し分です。

* 数字の大きい方へベクターを向ける polyframe/attrib gradient

* ベクターを回り込ませる (v - N * dot(N, v))

* 固有のアトリビュート数 nuniqueval

* 平面のvdb化vdb convert/unsigned distance field 

* ジオメトリの変形についてくるscatter attribute interpolate

* ノイズのポジションにノイズ



hiplcはこちらからどうぞ。

https://www.dropbox.com/scl/fi/4wtjzqxagahwbdkq2v24b/qiita2023_m__a__.hiplc?rlkey=k3we6cc0oug2t220hwidthb7n&dl=0





# 数字の大きい方へベクターを向ける polyframe/attrib gradient


色でベクターを制御する方法。最初の画像は腹部を中心にジオメトリに沿ってグラデがつくられてますがこれを使って２画像目のようなベクターを生成します。明るい部分から暗い部分に向かっている感じです。

<img width=320 alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316376/8a5b0f87-f26d-e995-71e0-06b6b69984ef.png">
<img width=320 alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316376/9d08c280-e5d4-1413-323f-1d3c52362d67.png">


方法
黒から白に代わるグラデーションをつくってpolyframeをつなげる
polyframe/styleをattrib gradientにしてここにCdを入れる。これによってpolyframe/tangent nameのアトリビュートが黒から白に向かうベクターになります。

ここではグループで指定した位置からdistance along geometryで距離を生成してこれをカラーにしたものをattrib gradient使ってます。このアトリビュートはフロートではなくベクターである必要がありますがRチャンネル以外は使ってません。
似たようなノードにfind shortest pathというのがありますがあれに必要な知識は汎用性がゼロでおぼえても忘れますし、使えそうな状況で事あるたびに使おうとして一度もいい感じになったことがないので個人的には一切使わないです。

用法
微妙に入り組んだオブジェクトに沿ってなんかある程度は正確なベクターが欲しいときに使います。
逆に単純なオブジェクトならこういう面倒なことはやらないで単なる放射状のベクターとかでいいと思います。白と黒でベクターとか制御しづらいですし。


# ベクターを回り込ませる (v - N * dot(N, v))

ジオメトリのノーマルと方向のベクターを使ってジオメトリを沿ったベクターを作ります。
たとえば１枚目の画像（ノーマル）と２枚目（方向）をつかって３枚目みたいにします。

<img width=320 alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316376/eaa1e766-ba8c-5f11-9e56-b535f16cc046.png">
<img width=320 alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316376/731c256c-a443-70d3-d446-da4c1111668d.png">
<img width=400 alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316376/fa3822ef-25d2-da58-c863-bf7154c88c0b.png">




式は以下の通り。

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]とかなら１００個で確定ですがいらない破片を削ったりすると数えるのが超だるくなりますそういう時にこのコマンドを使うと個数がわかります。

用法
wedgeとかで正確な個数を使いたいときに使います。



# 平面のvdb化 vdb convert/unsigned distance field 

板に厚みを持たせる方法。
１枚目のような厚みのないポリゴンを２、３枚目のように厚みを持ったポリゴンあるいはvdbにします。

<img width=160 alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316376/14970a31-12ee-0aaa-04ca-f17d33bb3a20.png">
<img width=240 alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316376/fac9d66b-b1c2-5e0a-6242-2c62f425b38d.png">
<img width=240 alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316376/d7022958-2bc3-2503-1a88-a62fccdb1cfc.png">

ノードの繋ぎ方はこんな感じ。
<img width=640 alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316376/3e7a0ebc-57bd-aeae-13ef-067b573f295d.png">



方法
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

動くジオメトリにスキャッターを撒きたいときに使います。この方法でスキャッターすると粒が暴れずアニメーションについてきます。

<img width=320 alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316376/affdd539-2271-4e91-8078-f3140b07572f.png">
<img width=320 alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316376/4a856ea7-ec40-c068-369e-9da5d9a2bc07.png">


方法：
時間を止めたジオメトリにscatterをつなげてoutput attribタブの上から二つのチェックを入れ、そと元オブジェクトをattribute interpolateにつなげるとできます。

個人的にこの機能は使わないです。人のファイルを見てるときにこの機能を使ってるのを見つけて、そういえばそういうのもあったよね、くらいの感じです。使わない理由はこのやり方に汎用性がなく、ここでおぼえたことは他では使えないので忘れやすいからです。
代わりにpoint deformを使ってます。どちらを使うかは趣味の問題です。
さらに詳しい説明は別の人がやってたと思うので探せば出てくるんじゃないでしょうか。

用法、、、の説明はいらないかと。


# ノイズのポジションにノイズ
![スクリーンショット 2023-12-13 153112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316376/17684676-c805-6e8a-1b2b-04f981684f36.png)

そういえばそんなのもあったよね、という小ネタ。

ノイズのインプットにノイズを入れるとそこそこ面白い図形が得られます。左のノイズの派生系が右二つです。以上。

フィールドとしてはわからないですが図形としては悪くないかもです。


//