Sparx* Virtuousセッション目コピ②
SiggraphAsiaでのセッションが素晴らしかったので目コピしていく。

2025/1/09に公開されたSiggraphAsia2024でのSparx* Virtuousのセッションで非常に素晴らしいプロシージャル岩を作成しているセッションが公開された。
非常に出来が良かったので工程を理解するために文章に落としていく。
https://youtu.be/7TkOkEIwqYM?si=uCYWeeI-Kx6__3dW
本記事では 動画28:10~の「PROCEDUAL ROCK MODULES」以降の内容を扱っている。
記事内の画像は目コピしている最中の自分の作業シーンのもの。
※詳細な作成方法やhipが公開されているわけではなく、
公開されている範囲を目コピで作成しているので本記事の内容で動画と全く同じものを作成できる保証はできません。
前回の岩の元形状を作成していく続きから
https://www.procedural.jp/articles/e6db_ocyh
前回の記事は詳細が公開されている部分が多くほぼ再現できていると感じているが、今回の記事にあたる範囲では動画内で説明や公開されている部分が少なく、目コピ成分多めです。
ADD CRACKS (30:36~)
パックして構成する岩ごとのグループを二つに分ける
assmble、pointwrangle、splitを作成しpointwrangleでランダムなグループ分けを行い、分岐している。
point wrnagleでのグループ分けだが分岐の先にunpackがあることから、assembleでパックしてメッシュごとにランダムなグループ分けを行っているものと思われる。
(同じ工程でグループを2つに分けるやり方は今後も多用される。)

左側のエッジダメージグループ
unpackし、構成する岩ごとにedge damageを設定している。
ここで利用されているのが「awesome_edge_damage」という恐らく内製のノードであり、厳密な機能は公開されていない。
ただ、結果を見る限りbooleanモードでのedge damage がベースと思われるので今回の目コピ段階ではそれを利用している。
(もう一つループに含まれているassembleはループ後にunpackが接続されていたので再度packする処理だと思う(多分不要))

予想だがawasomeであるのはbooleanモードでの edge damageは横線のアーティファクトが出てしまいがちなので、これを抑えるためにremesh。
それと合わせて機能も増えているようなのでそれ以外のエフェクトを付与できるような機能ではないかな?と予想している。
右側のエッジダメージグループ
ここはわからない部分が多かった。というのもノード構成を見る限り、「awasome_edge_damage」の機能を利用しているように思えるからである。
例えばpoint vopは、Pに対してノイズを与えているわけでもなさそうだし、ループごとの乱数を生成して何かしら利用しているものだと思うがパラメータの詳細が判らないのと左側のグループと大きく変わらないのであるとすれば「awasome_edge_damage」の専用処理のためのループごとの乱数要素だと思う。

今回の目コピでは暫定的に左側と同じ処理をしている。
ここまでをOUT_LAYERINGというNullにつないで次の工程へ。
直線を無くす
存在していた直線形状をノイズで少しだけ曲げ、smoothされたメッシュをリダクションすることで厚みのあるゆがんだエッジを作っている。
- match size、remesh、moutain、transformbyattrib、polyreduceにつなげ、50x50x50にリサイズ、stashを有効
- remesh:Smoothingを0.55、TargetSizeを0.5
- moutain:数値は不明、控えめにノイズを入れていた。直線を無くすためということだったので暫定でAligatorNoiseを設定。
- transformbyattrib:50x50x50から戻す
- polyreduce:Continue Reducting Within Quality Toleranceを有効

ここまでをOUT_BREAK_STRAIGHT_LINEというNullにつなぎ次の工程に進む
亀裂作成工程の前処理
※この辺の工程は動画では説明が少ないので予想が多めです。
亀裂作成の前にcolorやdelete small partsを接続している。
色にかかわる処理は行っていなかったのであるとすれば内製ノード内関連なのでcolorの詳細は不明。
概ね亀裂バリエーションのグループ分けと思う。

Splitで分岐し、半分の岩を右の亀裂工程、もう半分が左側の亀裂工程につながる。
左側の亀裂グループ
左側のグループではRBD Material Fractureの機能で分割を作成している。
詳細な数値は公開されていなかったがmatchsizeで分割時点でのサイズを合わせ、分割数は最低限で分割面に多少のノイズが入っていた。

右側の亀裂グループ
こっちのグループは設定周りは動画中で確認できるものの、意図というか目的がいまいちつかめなかった…。
単位サイズに合わせた後、一度restでpointの位置を保存。
その後point vopでノイズをかけた後にclipで上下を削除、pointwrangleで
@P=@rest;
としてrest位置を復元すると切断面にノイズが入った上下を削減したメッシュができる。

polyfill、edge damage、remeshなどで形状にばらつきを加え、pointwrangleを作成し以下のVEXを設定
vector dir = normalize(@P-0);
float mask;
if(abs(dir.z)>ch("thres")){
mask = abs(dir.z);
}else{
mask=0;
}
@P.z += dir.z * mask * ch("mult");
このvexによりY方向につぶれるような動きになる。

これをもとの形状とmergeする。

この工程は意図がつかめなかったので自分でまねた構成するなら考え直したい。
左側、右側をmergeし、normalとgroup promoteを接続。
insideグループをprimitiveに変換し、OUT_CRACKというNullに接続して次の工程へ
亀裂のエッジを加工する
この後の工程は亀裂の周りのエッジを目立たせるためのもの。
※この工程も全体のグラフは次の画像のようになっているものの公開されていない部分が多い。

ので、以下のような不明な部分を除いたものに変更して工程を追っていく。
似たような形状にはできた。

poly reduceのContinueReducingWithinQualityToleranceを有効にすると厚みのあるエッジ形状を表現できるのが良かった。
ここまでをOUT_OFFSET_CRACKというnullにつなぎ、次の工程へ。
Better Bevel
エッジ部分に丸みをつける工程。
出力後のnull名称が「BetterBevel」だったのでいい感じに調整したベベルを行うという意図と思う。
clean、poly bevel、poly reduce、divide、normalを作成し、
- poly bevelのdistanceを0.3
- poly reduceのContinue Reducing Within Quality Toleranceを有効、Toleranceを1e-06、useOriginal Point Positionsを有効
に設定。

この工程の前後を並べて比較するとエッジ部分だけbevelし、丸みが付いているのが判る

BETTER_BEVELというnullにつなぎ、次の工程へ
クリーンアップ工程
メッシュごとにクリーンアップを動作させている工程。
何をしているか公開されていないのでグラフの状態だけメモして割愛。

OUT_FINALというNullに接続してベースとなるポリゴン形状の工程が終了。
有機的なプロシージャルモデリングのフローの参考となる工程紹介で非常に良かった。

fish_ball
プロシージャル魚類