🌀

【Blender】ゲームVFXメッシュらせんジェネレーターの作り方 ジオメトリノード編

2023/08/11に公開

◯概要

【もここのBlender VFXメッシュ自由研究】
今回はBlenderを使ったゲームVFX向けのプロシージャルな、らせんメッシュの作り方を備忘録も兼ねてまとめていこうと思います!(Geometry Nodesの練習も兼ねて)

↓以前ツイートした内容の解説記事ですb

https://twitter.com/AnimaMococo5656/status/1685379669091041280?s=20

(ほんとに自己流満載の手探り状態なので、間違っていたりもっと良さそうな方法がありましたら教えてもらえると嬉しいです^ ^)


★Blenderエフェクトメッシュ自由研究一覧はこちら↓
https://zenn.dev/animamococo5656/articles/a08612cce4e5a7

◯環境

Blender 3.4.1(メッシュ制作)
UE5.1.0(メッシュ確認)

◯今回らせんメッシュを作る作戦

・らせんのカーブに
・直線カーブを添わせて並べる(メッシュ化)
・入力値をパラメータ化
(Houdini使いの方にはおなじみのSweepでらせんを作る方法のイメージですね。)

+UV設定
+頂点カラー、アルファ設定
+ノーマル設定
など

メインの参考(ジオメトリノードでカーブを使った基本の組み方が参考になりました)
https://youtu.be/JuSLy2Cy8dM

◯らせんメッシュの作り方(ジオメトリノード)

(Blenderの基本的な使い方、ジオメトリノードの使い方などは今回はスキップしますm(__)m)

今回作るノードの全体像はこんな感じです。

▼1.適当なメッシュを作る

Geometry Nodesのワークスペースを開いて、
ジオメトリノードのベースにするメッシュを追加しておきます。
「Add > Mesh > Plane」

(が、この後の作業ではこの平面自体は実質使わないので、正直どのメッシュでもOKです)

▼2.わかりやすくリネームしておく

Planeからわかりやすいようにリネームしておきましょう。
(今まで作った連番に続けてSM_spiralBlender_005としました。)

▼3.新規GeometryNodeを作成(以降ジオメトリノードの作業です)

画面下の「+ New」ボタンを押すと新規ジオメトリノードが作られます。

「GN_Spiral.002」と任意の名前にリネームしておきました。
また、元から入っている「Group Input」が最初に追加したPlaneなんですが、使わないので削除でOKです。

▼4.らせんカーブを作成する

実際にノードを組んでいきます。
まず、「Spiral」ノードでらせんカーブを作成しましょう。

[パラメータ]Spiral ノード

Resolution:カーブの分割数
Rotations:カーブの巻数
Start Radius, End Radius:らせん上下の半径
Height:らせんの高さ
Reverse:らせんの向きを逆にする

▼5.直線カーブを作成する

「Curve Line」ノードで直線カーブを作成します。

ちなみに「Viewer」ノードを使うと、繋いだノードをプレビューできます!
(確認したらViewerノードは削除してしまってOKです。確認したいとき使うと便利です)

▼6.らせんカーブに直線カーブを添わせて並べる

「Curve to Mesh」ノードをらせんと、直線カーブの後につなぎます。
このとき、以下のポイントを覚えておきましょう。


これで、ひとまずらせんのメッシュ自体はできましたね。

らせんメッシュの形を調整してみる

Spiralノード(らせんカーブ)のパラメータをいじってみよう!
らせんメッシュの形が調整できることがわかると思います。

(いわゆるプロシージャルメッシュと言うやつです!調整が楽でとても便利ですね^ ^)

▼7.らせんメッシュを調整しやすく改造する

基本構造はできたのですが、ここでいくつか要望が…。

これらを対応していきます。

7-1.沿わせて並べた「元の直線の角度」を調整したい(断面形状)

「Set Position」「Vector Rotate」「Position」ノードを追加して↓画像の様につなぎます。

「Vector Rotate」ノードは、
 ・Type:Euler
 ・Rotation X:-90
に設定します。

「元の直線の角度」を変更したことで、断面の形状が変わってらせんに対して垂直な面になりました。

7-2.メッシュ幅をらせん位置に応じて調整したい

例えば「らせんの下の方の幅は細くしておきたい」という要望も結構あるかと思うのでそれも対応していきましょう!

「Set Curve Radius」「Multiply」「Float Curve」「Spline Parameter」ノードを追加して↓画像の様につなぎます。
Multiplyは、メッシュ幅の最大値です。

この中で大事そうなのが、以下2つのノードです。

ノードメモ「Spline Parameter」

Factor:カーブの先頭から終端までに割り当てられた0~1の値(たぶん)

↓イメージ

ノードメモ「Set Curve Radius」

カーブのコントロールポイントの半径です。というとよくわからないですが、
カーブのポイントごとに半径の値を持たせられるようです。

この半径をもとに、背骨に並べるカーブ(今回でいう直線)のスケールが変わります。

(Houdiniで言うところの、pscaleがイメージ近いなと思いました。)

カーブを調整していろいろ試してみてください!位置ごとのサイズ調整がしやすくなったかと思います。

7-3.メッシュらせん位置に応じてねじりたい

「らせんの上の方はもう少しメッシュをねじりたいな~」というようなときもあるので、こちらも対応してみました。

「Set Curve Tilt」「Multiply」「Float Curve」「Spline Parameter」を追加。
↓画像の様に繋ぎます。

(Multiplyにつながるノードは、「7-2」とおナッジなので説明は割愛。)
大事なのは↓のノード。

ノードメモ「Set Curve Tilt」

これがカーブをねじってくれるノードのようです。

(ちなみにこの機能のノードがどれかわからず、curve関連のノードを端から繋いでみてやっと見つけました…。(^ ^;))

カーブ、Multiplyの値を調整するとねじりが調整できます


ここまででらせんメッシュ自体の作成はひとまず終了です!

▼8.ジオメトリノードのパラメータ化

ジオメトリノードでは、自作のパラメータを作ることができます。
(Houdiniと同じように)

このジオメトリノードを使いまわそうとした場合に、らせんの巻数や分割数など調整できたほうが便利です。(※カーブをパラメータにするのは、できそうになかったです…。僕がわかっていないだけかもしれませんが…)

ーーー
<入力の削除>
・まず、「N」キーでサイドメニューバーを開きます。
「Input」という項目が、入力パラメータです。

・最初からある「Geometry」は、はじめに仮でおいたPlaneメッシュのことなので削除してしまってOKです。右の「-」ボタンから削除できます。

<パラメータの追加>
・「+」ボタンでパラメータを追加できます。

・今回はらせんの分割数(Resolution)用に、
以下のようなパラメータを追加します。
 →「Integer:整数」
 →名前
 →デフォルトと最大最小値を設定
・モディファイアプロパティでInputsの値を設定できます

・Group InputでInputsのパラメータを使用できます。
 今回はSpiralノードの「Resolution」に繋げばOKです!

・モディファイアプロパティの値を変えるとらせんの分割数が変わります。

ーー
同じように他のパラメータも設定していきます!

・モディファイアプロパティで設定でそれぞれBackSpaceをぽちぽちしてデフォルト値を入れておきましょう。

これでらせんはOK


他にもパラメータ化したいものは、パラメータにしておきましょう。
今回はらせんの最大幅、らせんの最大ねじり数をパラメータ化しておきました。

ひとまずこれでOKです!



ここから先は、Unity ShurikenやUE5 Niagaraなどゲームエンジンで使用するために、
・UV設定
・頂点カラー、アルファ設定
・FBX書き出し準備
をしていきます!

▼9.UV設定(Blender確認用にキープ)

UV設定は、『7-2』『7-3』で使った「Spline Parameter」Factorの応用で作ってみました。

↓イメージはこんな感じです。
並べる直線カーブは横(U)方向、らせんカーブは縦(V)方向に0~1で配分される想定です。

ーーー

「Store Named Attribute」「Combine XYZ」ノードを追加。

↓画像の様に繋ぎます。

大事なのは「Store Named Attribute」です。
任意の名前で任意の区分に、値をキープできます。
 → 今回は、Face Corner(HoudiniなどでいうVertex)に「UVMap」という名前でキープしておきました。

▼10.UV設定確認のためにマテリアル設定

テクスチャを貼っていないと意図した挙動になっているかわからないので、マテリアルを設定して、テクスチャを貼っておきます。
まだ作ってない場合は↓を作っておきましょう。
https://zenn.dev/animamococo5656/articles/63190887887aa7

これに関しては、作っておいた汎用マテリアルを設定していきます。

▼11.頂点カラー、アルファ設定

これも基本は、『7-2』『7-3』で使った「Spline Parameter」Factorの応用です。

「Store Named Attribute」「ColorRamp」ノードを追加して、色を設定しておきます。
「Store Named Attribute」はColor、Pointにして、「color」の名前でキープしましょう。

これで、無事アルファのフェードが適用されました^ ^
(「Shading」ワークスペース)

▼12.サイズ変更(UE5用)

最終的に完成したデータをFBXで書き出して、UE5に入れてみたのですが、ものすごく小さいかったです…。

↓左の球はHoudiniで作った直径1mの球で、右のらせんが今回作ったものです。小さすぎて見えません(^ ^;)

(これのうまい解決方法がよく分からなかったので、ご存じの方ぜひ教えていただきたいです…。)

ーーー
なので、Blender上で大きくして対応してみようと思います。
スケールには色々方法はありますが、今回は「N」キーでサイドバーを開いて「Item > Scale」を20
倍と設定しました。(UE5に入れたとき1mくらいになるように)

[Tips]もしシーンで離れたときに表示が消えてしまうときは?

◯FBX書き出し

書き出し設定をしてFBX書き出しします。
↓参考
https://zenn.dev/animamococo5656/articles/e2c4d32d6f7dfd
 ・1.編集メッシュを複製
 ・2.ジオメトリノード適用
 ・3.トランスフォームのフリーズ
 ・「▼4.UVアトリビュート適用」
をすべて行いましょう。

◯まとめ

無料で使えるBlenderがHoudiniの代用になるかなと思い、
ふと思い立って簡単にできるだろう(1時間くらいで)と思って試してみたのですが、情報がなかなか見つからず想像の100倍くらい苦戦してしまいました…(_ _;)
なんだかんだ2週間~1ヶ月くらいこねてたかもです。

特にUVや頂点カラーなどが謎すぎましたね、、、

ーーー
ひとまずまとめです。


だいぶ複雑に見えますね。
ただ、らせんメッシュは汎用メッシュの中でも比較的難易度が高いものかと思うので、
今回の方法を応用すればあとは全然量産できそうです!!

他の基本的なVFXメッシュの作り方も、近々Blenderジオメトリノードで作って備忘録にまとめておこうかなと思います!!!

Discussion