-Geometry Node Simulation (開発ブランチ版)-

1. ジオメトリノードでシミュレーション
ジオメトリノードには色々機能がありますが、シミュレーションを行う機能は公式には 3.4 の時点でありません。
「公式には」というのは、一応ハックに近いようなやり方で、無理矢理行うことはできなくもない…ようなのですが、
まぁそういうやり方は、あまりお勧めは出来ません。

待望の公式なシミュレーション機能は、開発ブランチ版としてついに対応されました。
https://builder.blender.org/download/experimental/
公式に、とは言っても開発ブランチなので、この先どう転ぶのか、このまま実装されるのか大幅に変わるのか、立ち消えするかはまだ分かりません。
(多くの人の待望の機能なので、消えることは無いと思いますが)
開発ブランチ版でも、その強力なポテンシャルの一端に触れることができます。
Blender 3.5.0-geometry-nodes-simulation
の名前を見ることができます。
クリックして、ダウンロードすることができます。

これを書いた時点で、11/24日の日付になっており、頻繁に更新が行われるという事でもなさそうですが、
時々チェックすると良いかもしれません。
多分時間の問題で、公式に組み込まれてその後普通に使えるようになるかと思います。

簡単シミュレーション

シミュレーションと言っても状況や分野によっても言葉の定義が少しずつ異なりそうですが、
ここでは、「前のステップの計算結果を使って時間進化の計算をする」という事を意味しています。

早速開発版を使って、デフォルトキューブにジオメトリノードを組んでみます。
やや、追加メニューの項目に確かに Simulation の項目がありますよ。

Simulation Input と Simulation Output があります。
Input と Output を作成してジオメトリの流れをつないでみるとこのようになりました。

背景のテーマが暗いので、ちょっと見づらいですが、Input と Output の間が黒く囲まれています。
これは、シミュレーション処理を行う部分を視覚的に見やすくする仕組みでしょう。
この間に行いたいミュレーション処理のノード群を配置することになります。

次のような簡単な頂点の移動シミュレーションを作ってみます。

これで、毎フレーム全ての頂点が(0,0, 0.03)だけ上に移動します。

時間を進めると、キューブが徐々に上に動いていきます。
Simulation Output のジオメトリの情報が一旦保存されて、次のフレームの計算では Simulation Input のところで
オリジナルのジオメトリではなくて、保存されているジオメトリが使われているわけです。
毎フレーム0.03だけ上に移動した分がどんどん蓄積されているわけですね。


時間のスライダーで時間を進めたり戻したりすると挙動が分かります。
時間を前の時間に戻したときに初期状態に戻るようです。
こうした挙動は Run や Stop のチェックボックスで制御できるようになる…と思うのですが、
まだ開発中なので今後どうなるかは今一つ分かりません。

インスタンス配置

頂点を動かす系のシミュレーションは、モデルの変形をする以外には、
インスタンスを頂点の位置に配置して動く多数の物を表示するということが多いと思います。

Simulation Output の「後」に、インスタンスの配置のノードを組みます。

グリッド状にコーンを配置しました。

このグリッドを横切ってスザンヌを動かして、スザンヌの影響でグリッドの頂点が動くようにします。

スザンヌの位置と、頂点の位置を比較して、スザンヌの方向に頂点が移動するようにします。

単純なベクトルの引き算だと、遠い頂点は早く動いて、近い頂点はゆっくり動く…
結果として、単なる拡大縮小みたいな動きになります。
途中で Normalize (正規化 = 長さが1になる)の操作を挟んで、速度一定になるようにしました。


コーンがスザンヌを追いかけて移動していきます。
このように、外部のオブジェクトの影響を受けた時間進化の動きなどを簡単に(?)実現ができます。
簡単と行っても、凝りだすとそんなに簡単でもないのではありますが…

速度

さて、こういったシミュレーションを使えるようになれば、パーティクルや剛体じみた動きをしたくなるところですが、
そのためには位置情報だけでは情報が足りません。
「速度」の情報が無いと、慣性の法則を再現できないので、物理的にダイナミックな動きを作ることができないのです。
そうした、位置などデフォルトで用意された情報以外に任意に使えるのが Attribute(属性、アトリビュート)です。
幸い、シミュレーション中でも Attribute が使えるので、放物線で落下する頂点を表現してみます。

まずは、初期条件のための速度を設定してアトリビュートとして保持しておきます。
名前は Velocity としました。

法線方向に向けておいて、Z 方向にも速度を与えました。
まぁ、つまり打ち上げ花火がバーンと広がるような動きを想定しているわけですね。
シミュレーションの処理では、速度に従って頂点の位置を Offset して動かします。

さらに速度自体が重力によって徐々に下向きに加速していく効果を計算して、Velocity に保持しています。
これによって、Velocity のアトリビュートが上書きされて速度変化していくわけですね。
最後に、先ほどの様に Simulation Output の「後」で、頂点位置にインスタンスを配置しています。

放物線を描いて落下する頂点の運動を作ることができました。
このように、シミュレーション機能が使えるようになれば、一気にジオメトリノードで出来ることが拡張されます。

こいつは正式対応が楽しみですね。

この記事は、Blender Advent Calendar 2022の記事として公開しました。
まだまだ開いているので、どんどんブログなどに書いて公開してよろしくてよ?

(Blenderのユーザー自体は増えて盛り上がってるのですが、公開や交流の舞台が SNS 上や Discord等に移っているのかもしれませんね。
以前はブログ記事などAdvent Calendarに多く登録されていたのですが。
私の現在の日常的な発信先は、Twitterを使っています。)
inserted by FC2 system