Blender: 放物運動と寿命と

Geometry NodesのSimulation Zoneの使い方ようやく使い慣れてきました。今日は前回よりも簡単にパーティクルが重力を受けて放物運動をするだけのサンプル。寿命で消滅もします。

速度や寿命などはSimularion Zone(SimZone)に入れる前にStore Named Attributeでポイントに書き込んでおくだけ、あとはSimZone内で取り出してアップデートするなり、計算に使うなりします。

SimZone内で大事な事はポイントの位置を変更するなら、

オフセット(m)=速度(m/s)x時間(s)

速度をアップデートするなら、

次フレームの速度(m/s)=現在の速度(m/s)+重力(m/s2)x時間(s)

と単位に気を付けて加工していけば結線に迷わないと思います。単位というより「次元」ですね。

衝突とかはRayCastやSample系のノードで何とかする必要があるようです。Simulation ZoneのDelta Timeはシーンのフレームレートに依存しますが、サブステップが無いのは精度を上げられ辛くて困りますね。


Blender GeoNodes: Plexus

Animation Nodesでできてた事をGeometryNodesでシリーズ、2本目。今回はPlexusのアレ。

「Blender Tutorial: Connect The Dots with Geometry Nodes, The “Plexus” Effect」(Youtube)を理解しつつまんまコピーです。内容的には、

  1. 距離を計算するペアになる頂点インデックスペアを作成して保存、保存先はオリジナルの2乗個のポイントを持つ新しいジオメトリへ
  2. 距離を測って閾値より大きいインデクスペアを削除、ダブってるやつ、自分どうしのペアも削除。
  3. Instance on Pointsでセグメントカーブを複製
  4. セグメント終点をインデクスペアの終点座標へ移動

空間分割をせずに全ての距離の比較をしているのでちょっと重い。

Animation Nodesは「Find Close Point」ノードひとつでサックリ作れましたが、この先同等のノードが追加されてくのでしょうか。開発がノードの粒度についてどういうポリシーを持ってるかによりますね。


Blender: GeometryNodes 軌跡を描く

Simulation Zone内で頂点の押し出しをすれば軌跡を描ける事が分かったのでテスト。

ExtrudeMeshノードで押し出した結果のコンポーネントへ「Top」というアトリビュートが「True」になった状態が与えられるので次フレームでもその「Top==True」なコンポーネントに対して押し出しをするって具合です。

通常のパーティクルシステムで使うForceFieldから力を取得できるといいんですが残念ながら出来ず、ノイズで動かしても面白くないので万有引力の式を使ってシミュレーションしてみました。重力の相互作用はありませんが。

以下Blender3.6用ファイルです。パーティクルの重さをランダムで指定している所で最小値にマイナスを入れれば斥力も働きます。クーロン力(りょく)ですね、式は万有引力と等価です。

時間を1フレーム目に戻して再生してください、たぶん途中のフレームのまま保存しちゃったかも。


Geometry Nodes

重い腰を上げてGeometryNodesのお勉強。Animation Nodesと同じ開発者なんだから難しくはないだろうと思っていましたが、どうも設計が違うようで。

頂点をランダムにオフセットしたい場合は、普通はランダムな3Dベクトルを頂点数ぶん用意して足してやればいいはずですが。ランダムな3Dベクトルのリストを作成するノードがなかったりします。正解は「Set Position」ノードにジオメトリと「Random Value」ノードを突っ込むだけ…。文章で書くと何も間違いではないですが、いったい何を元に必要なだけのランダム値を作ったの?

左から右へ、上流から下流に向かってデータは流れている『だけ』ではないみたいですね。