HOME

Maneki Pipeline

ゲーム開発のためのプロシージャル

プロシージャルなクモの巣の生成①

いくつかのチュートリアルを参考にしたプロシージャルな蜘蛛の巣生成の習作

習作です。

馬車で生成
ヤシで生成

本記事の内容は以下のチュートリアル群を参考に作成しました。

Project GROT | Procedural Flesh (再生リスト)
https://www.youtube.com/watch?v=Y5j_CBGdIHg&list=PLXNFA1EysfYnYXTCFn58Hu_fxRXxQiC0t

環境

HoudiniFX 20.5.613
UnrealEngine 5.5.4

所感

元のメッシュ、蜘蛛糸のメッシュ、maskedで抜かれたマテリアルのメッシュの3要素で構成。
サムネイルの草であれば糸が15000ポリゴン、maskedで抜いているメッシュが3000ポリゴン程度の合計18000ポリゴン程度増えています。
ポリゴン数などのリソース量に対してかなり控えめな見た目なので、仮に実用を目指すなら見た目まだまだは詰めるべきでしょう。

糸のメッシュ(合計15000ポリゴン程度)と内側の面のメッシュ(合計3000ポリゴン程度)で構成

maskedで抜いているので透明度で抜いている部分はシェーダー複雑度は高くないものの、糸をメッシュで作成しているのでメッシュ量的には多め。
メッシュサイズは気軽に使えるものでは無いものの、見た目を調整すれば意味のあるビジュアルであれば使い道はあるかも。

糸部分で目立たないものを削除したり、そもそも面部分のメッシュだけでよいビジュアルが作れるならばより現実的か。
(参考にしたProjectGrotもポリゴン数はあまり意識しないメッシュ生成だったので、そういうプロジェクトであればアリかなーという印象。)

複雑度は高くないがポリゴン数は多い

メッシュ内側の糸

長くなったので本記事では糸部分の生成までを記載しています。

ベースとなるpointの作成

mesureからcurvatureを取得しmaskに変換し、これを糸の接続点のソースとして利用する。

curvatureからmaskアトリビュートを作成

LabsPhisicalAmbientOcculusionとのブレンドやattrib remapなどでmaskの値を調整

PhisicalAmbientOcculusionなどを利用してmaskの値を調整する

scatterを接続し「Density Attribute」にmaskを設定するとmaskが高い場所に偏ったpointを生成できる。

Scatterの生成基準にmaskアトリビュートを指定

maskの値はscatter作成後のpointに引き継がれるので、maskが微小な範囲で作成された、生成にあまり使いたくない場所のpointをvexで削除

pointに引き継がれたmaskedの値でpointを削除する

メインとなるpolylineの作成

enumrateで「GroupType」を「point」、「Attribute」を「name」、「Type」を「String」に設定して頂点番号をstring形式のpointアトリビュートとして保存。
文字列形式の独立したアトリビュートを持っているとConnectAdjacentPiecesノードでpoint間で近いその文字列アトリビュートの値が異なるpoint同士を接続できる。

enumrateで頂点番号をアトリビュート化

resampleでpoint数を増やし、ソースとしたメッシュを第2接続につないだgroupノードでメッシュ内に存在するpointをグループ化。
resampleノード時に後で使うので「CurveUAttribute」も有効にしておく

resampleノードでソースメッシュ内にめり込んでいるpointをgroup化する

group expandの「FloodFillToConnectedGeometry」オプションでpolyline全体にグループを拡張子、メッシュ内に交差してしまっているpolylineを削除する

group expandでめり込んだpointを含むpolyline全体を削除グループに設定して削除する

Primitive単位でrandomデリートで糸の量をコントロールできるようにする。
これでベースの糸が完成

DeleteのRandomであとから適当に間引きできるようにする

サブとなるpolylineの作成

メインとして準備したpolylineをfuseで接続して分岐した糸の始点にする。
OutPositionsを「LatestPointNumber」に変更すると元の糸でpointがあった位置のみにfuseで結合されたpointを生成する。

fuseでpointを削減する。LatestPointNumberにすると間の位置にpointが生成されない

ベースとなるpolyline同様、connect adjust piecesで polylineを生成し、

ベース同様にpolylineを生成。enumrateはアトリビュートが引き継がれているので使っていない

ベース同様、メッシュと交差しているpolylineをgroupノードとgroup expandで削除する。

ベースとなるpolyline同様、ソースメッシュ内側に存在するpointを持つpolylineを削除する

これでメインとなるpolylineからの枝分かれを表現するためのpolylineができた。
この後メインのpolylineとサブのpolylineをマージするが、その前にdeform用のアトリビュートを作成する。

デフォーム用のアトリビュートを作成

メインとなるpolylineに戻り、resampleで作成したcurveuアトリビュートを反転し、強度を変更できるようにする。

resampleしたときに作成したcurveuを調整する

サブとなるpolywireはAttributeTransferでmainの位置に合わせた値を転送する。
この後の工程でcurveuででフォームの影響度を制御するが、この時の変形がメインとなるpolylineと同じ寮になるようにするために行っている。

AttributeTransferでメインとなるpolywireで持つcurveuの値をコピーする

メインのpolylineとサブのpolylineをfuseで接続点をマージする。

fuseで位置の一致するpointを結合

デフォーム

curveuを利用してカーブの中央に近いほどY軸下側にたわむような変形を作成する

curveuに合わせてP.yを下にずらす

余談:Grotで共有してくれている、Solverで作成する糸が絡まるようなデフォームも試してみましたが今回は使いませんでした。
   こちらもpolylineに対する面白い変形なので興味があれば見てみるとよいと思います。

使わなかった変形

こちらの動画でその変形が紹介されています。

Project GROT Procedural Flesh | 02 | Edge Bundling
https://www.youtube.com/watch?v=i6A1TJoBPPY&list=PLXNFA1EysfYnYXTCFn58Hu_fxRXxQiC0t&index=3

メッシュ化

VEXでpscaleを設定し、curveuの値に応じて太さを調整できるようにする

curveuに合わせてpscaleを設定

Sweapでメッシュ化する。

Sweapで最終的なメッシュを作成

これでメインとなる糸部分のメッシュ
長くなってしまったので今回はここまで


プロシージャルモデリングをしているといつも悩ましい、「ポリゴン数は多くても許されるのか問題」。
100%遭遇すると言っても過言では無いですね…

とはいえ、ポリゴン数過多をプロシージャルに作る分にはスケーリングはしやすい(多くする、少なくする両面において)ので個人的には好きです。

fish_ball

プロシージャル魚類