HOME

Maneki Pipeline

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

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

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

習作です。

○ 前回の記事:プロシージャルなクモの巣の生成①
https://www.procedural.jp/articles/n2sxu4cmn/

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

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

○ Entagma | Houdini: Tearing A Spider Web Using Vellum Grains
https://youtu.be/lej5uheoMdQ?si=j8NN6rfboWZcg0N0

環境

HoudiniFX 20.5.613
UnrealEngine 5.5.4

メッシュ外側の糸

第2入力から外側にコリジョンメッシュを設定した場合、そこにも蜘蛛の巣が掛かるようにする。

第2入力として周りの蜘蛛糸を張りたいメッシュを入力し、

外側へもメッシュを張りたい場合のために第2入力のコリジョンを準備する

mask from geometryノードを作成し、第1入力を蜘蛛糸を追加したい周りのメッシュ、第2入力をソースとなるメッシュを入力につないだSphereを接続する。
これで元メッシュに近い球場の範囲に指定のアトリビュートを設定することができる。
SphereのScaleを調整すれば範囲の大きさも調整できる。

mask from geometryノードで範囲内にmaskアトリビュートを作成する

前回の蜘蛛糸の接続点のソースとして利用していたcurvatureから作成したmaskにmargeしてこれを蜘蛛糸の始点にできるようにする。
Switchで周囲のCollider用メッシュの有無も切り替えられるようにした。

switchでコライダーの切り替えを可能にしておく

テクスチャで表現するためのポリゴン面を作成

蜘蛛糸の内側に張られた面を構成していく
前回作成した蜘蛛糸のメッシュ化する一つ前からfuseに入力する。
OutputPositionsは「LeastPointNumber」などの既存point位置に接着する設定を使用し、SnapDistanceを少し大きめの値にする。

フェース化前の蜘蛛糸をfuse

joinを接続して「Wrap Last To First」、「Only Connected」を有効化し、polyfillで面を作成する。
FillModeはが後のLabsAutoUVで比較的エラーが少なそうだった「Single Polygon」で作成
Only Connectedが有効なのですでに接続された頂点のみでループができるので、fuseで接続されてループになったpolylineの内側に対してフェースが作成される

joinでループしたpolyLineにしてpolyfillでメッシュを作成

edge cuspでプリミティブごとに分割し、delete small partsで小さい面を削除
delete small partsはpolylineも消せる。

delete small partsで小さいフェースとpolylineを削除(画像はexplodeでプレビュー)

再度fuseしてメッシュごとにfor eachでUVを作成

UVを作成

両面を持つメッシュにするためにreverseしたメッシュをmargeしてメッシュの作成完了

蜘蛛糸を面で表現するためのメッシュ作成が完了

テクスチャを作成

ベイク用の蜘蛛の巣メッシュを作成する

Entagmaの蜘蛛の巣のシミュレーションを参考に蜘蛛の巣テクスチャ用のメッシュを作成していく

lineを作成し、

lineを作成

copy and transformで円形を作る。
この時、後にCOPでテクスチャ化したいので形状が大体、XZ平面の - 1~1範囲に収まるくらいの大きさにする。

CopyAndTransformで円形にする

Spiralを作成し、lineの範囲より少し小さめにする。
各々をpointでグループ化しておいてmargeする

少しだけ小さめに作成したSpiralとmarge

resampleとfuseを使って、lineとspiralの交差点が結合するくらいのサイズで結合する。
(画像だとresampleが Maximum Segment Lengthで細分化し、Lengthが0.01、FuseのSnapDistanceも0.01にしている。)

fuseでmargeした2種類のpolylineをくっつける

groupノードでSpiral部分全体が入る程度のBoundingSphere範囲に含まれる点をグループ化する。
(Spiralの外の部分をVellum用にPinConstraintするため)

シミュレーションで固定する部分を作るためにpointをグループ化

Cloth TypeでVellumをセットアップ
Pin To Animationで先ほどグループ化したSpiralより外側のpointをPinPointsに設定し、RestLengthを1より少なめにする。
これでシミュレーション時に線が縮むような動きをする。

VellumConstraintを作成

Gravityを0にしてシミュレーションし、糸が張ったような形状にする。
timeshiftを使って手頃な形状なタイミングで固定

糸が張るようなシミュレーションができれば成功

labs dissolve flat edgesを接続して直線に近いpolylineのpointを削除
(※なお、今回の工程では削減の必要性は無かったですが)

labs dissolve flat edgesで直線に近い部分のpointを削減

polywireでメッシュ化

蜘蛛糸のメッシュを作成

ゴミや水滴を表現するためにpolywireからscatterでpointを生成。
attribute randomize でpscaleを設定してSphereをコピー。

ゴミや水滴のような表現のためにScatterでSphereをランダムに配置

密度など調整し、polywireとコピーしたSphereをマージしてCOPへ

メッシュができたのでCOPへ

COPでマスク化

Copに入り、SOP Importで先ほど作成したメッシュをCOPに入力

SOP Importで先ほど作成したメッシュをCOPに入力

軸方向や形状の範囲を設定できるようにRasterizeSetupを接続
(範囲に合わせた変形をしてくれるのですごい形になる)

rasterize setupを接続

RasterizeGeometryを接続し、位置をRGBに変換

RasterizeGeometryを接続するとアトリビュートを画像化できる

ChannelSplitでBlueチャンネルをNullに接続し、Nullの表示を保存する。
これを蜘蛛の巣の面用のマスクとして利用したい。

BlueチャンネルをNullに接続し、画像として保存

CopPreviewノードでOpacityに接続するとHoudiniのシーンビュー上で簡易なプレビューもできる

COP Previewで透明度のプレビューもできる

メッシュ出力

UnrealEngine用のFBXに加工する。
UEにFBX経由で入力するメッシュは三角化が必要なのでDivideで三角形メッシュに分割し、

出力前に念のため三角化

AttribDeleteで不要なアトリビュートを削除し、マテリアルスロットの準備を行う。
元メッシュ用、糸のポリゴン用、面のポリゴン用それぞれのPrincipleShaderを作成して割り当てる。
FBX経由でUnrealEngineに入力した場合、これで各々のメッシュが異なるマテリアルスロットをもった状態で入力されてくれる。

フェースにMaterialノードで割り当てを行っておくとUnrealにFBXをImportした際にマテリアルスロットを作成してくれる

サイズなどを合わせて出力し、UnrealEngineへ

UE用マテリアル

今回はマテリアルは最低限のプレビュー用のものだけ準備をした。
面による糸の糸についたゴミや水滴などはマスクを増やして色付けなどするともっと見た目は良くなるかも。
糸のポリゴン用のマテリアル。 単色のみ

糸用のマテリアル

面による糸のマテリアル。
COPで作成したテクスチャでMaskedによるOpacityで切り抜いている

面による糸のマテリアル

ソースメッシュ用のマテリアルはベースカラーのみ
(余談:MeshyAIで作成したメッシュなのですが、3か月ほど前に生成したものでBaseColorのみのモデルでテストしています。最近だとPBR用テクスチャも生成できるようです)

ソースにしたモデル用のマテリアル(BaseColorのみ)


画像が多くなってしまいました。
次回以降、似たような記事の場合はもう少し分割してみます。


当記事はまだHoudini20.5です。

fish_ball

プロシージャル魚類