シミュレーションゾーンとSwayingMesh
シミュレーションノードを使った SwayingMesh の使い方の説明と、後半は Blender 3.6 で導入されたシミュレーションゾーンの解説です。
ダウンロード
以下のリンクからダウンロードできます。 ライセンスはどれも CC0 とします。ご自由にお使いください。
SwayingMesh とは
Blender 3.6 のシミュレーションゾーンの機能を使って、任意のオブジェクトを SwayingMesh が作成するメッシュで囲んで、Mesh Deform モディファイアを適用すると、オブジェクト (の一部) を揺らし続けることができます。アニメーションのキーを打つ必要はありません。 特に、SwayingMesh のメッシュをオブジェクトの子オブジェクトとすると、親オブジェクトの移動に合わせて自動的に揺らすことができます。
Blender の公式サイトのデモ にある Jiggly Pudding のモデルとマテリアルを使わさせてもらって、SwayingMesh を適用した動画です。オリジナルとは異なる仕組みで揺らしています。
再生するとプルプルと動きます。
アセットライブラリとして登録
SwayingMesh はアセットとして作成されているので、「ドキュメント\Blender\Assets」フォルダに SwayingMesh_1.0.blend を配置することで、Blender を使うときはいつでもアセットブラウザからドラッグアンドドロップするだけで使うことができます。
アセットの詳細は Blender 3.6 の使い方 (23) アセットライブラリ を参照してください。
「ドキュメント\Blender\Assets」フォルダが存在しない場合は、先に作成しておいてください。
さて、「ドキュメント\Blender\Assets」フォルダの SwayingMesh_1.0.blend を Blender 3.6(以降) で開きます。 エディタの領域でアセットブラウザを指定するか、Shift+F1 を1回か2回押します。 「未割り当て」を選択すると以下のように SwayingMesh のアセットが表示されます。
メニューの「カタログ」から「新規アセットカタログ」をクリックすると、左側に「カタログ*」ができます。
「カタログ*」をダブルクリックして、例えば「Swaying Meshes」に変更します。
「未割り当て」を選んで、[A]キーを押してアセットをすべて選択して、「Swaying Meshes」にドラッグして移動します。
メニューの「カタログ」から「アセットカタログを保存」をクリックしてカタログを保存します。
SwayingMesh_1.0.blend を保存します。
「ドキュメント\Blender\Assets」フォルダは以下のようになります。 blender_assets_cats.txt がアセットカタログの実体です。
Blender を起動
一度「ドキュメント\Blender\Assets」フォルダにアセットを登録すると、Blender を起動してアセットブラウザを開くと編集中のファイルの内容に関わらず、いつでもアセットを使うことができます。
アセットブラウザのカタログアイコンをドラッグアンドドロップするとシーンにアセットを追加できます。
SwMesh のどれかをドラッグアンドドロップすると次のようにワイヤーフレームの四角柱がシーンに追加されます。
3つの座標軸(X、Y、Z)と正負の方向違いで6種類の SwMesh オブジェクトがあります。
どれを使っても揺らすことができますが、移動方向などに合わせて揺らすには、なるべく枠を大きく回転させないでください。 オブジェクトの移動や初速の設定と揺れの向きが一致しなくなります。
簡単な使い方
SwayingMesh に含まれているアセットだけで、オブジェクトを揺らしてみます。 細長い物体が揺らしやすいので、アセットに含まれる座標軸の形のモデルを追加します。
座標軸の色は Blender のギズモと同じで、明るい色が正の方向です。 ここでは赤い腕を揺らすため、「SwMeshX」をドラッグして追加します。 SwMesh の後ろの文字は軸を示し、「-」は負の方向に伸びるメッシュとなります。
メッシュの位置をスケールを合わして、赤い腕の部分が完全に囲まれるように配置します。 囲まれない部分は変化しません。
ここでは、オブジェクトとメッシュを親子関係にします。
メッシュを先に選択して、シフトを押しながらオブジェクトを選択します。 [Ctrl + P] を押して、オブジェクトをクリックします。
メッシュの揺れに合わせてオブジェクトを揺らすには「メッシュ変形(Mesh Deform)」モディファイアを使います。 プロパティのモディファイアのタブから「モディファイアーを追加」をクリックします。
モディファイアのリストから「メッシュ変形(Mesh Deform)」モディファイアを選択します。
変形の元となるオブジェクトの名前(ここでは SwMeshX) を指定します。
最後に「バインド」を押します。
タイムラインでアニメーションを実行して、オブジェクトを移動させると、動きに合わせてオブジェクトのうちメッシュに囲まれた部分が揺れ動きます。
多くのオブジェクトを揺らす(ブランコ)
ジオメトリノード (1)の「ばらまく」 の例と同じように草を生やして、それを揺らします。
「Instance on Points」のインスタンスにつなぐカーブにSwayingMeshを適用するとすべての草を揺らすことができます。
草原の blendファイル(SwayingMesh_sample_grass0.blend)はここからダウンロードできます。 このファイルにアセットからSwayingMeshを適用してみてください。
追加されたメッシュの位置とスケールを合わせます。
上から見てちょうど囲まれるような位置にメッシュを設置します。 原点中心にスケールされるので、原点を近くに配置します。
上から見て完全に囲まれるようにメッシュを設置します。
横からも「SZ」とキーを押して高さを合わせます。
メッシュ変形(Mesh Deform)モディファイアを追加して、オブジェクトに(SwMeshZ)を指定して、「Bind」を押します。
初速を設定して勝手に揺らす
初速を設定するとアニメーションを実行すると、勝手に揺れ始めます。
spring_const の値を小さくすると揺れがゆっくりになります。
初速を与えて、減衰を小さくすると、長い間勝手に揺られるアニメーションができます。
2つのブランコの揺れ方を変える
下向きの枠となる SwMesh-Z をブランコのオブジェクトに適用してみましょう。
ブランコのblendファイル(Swing_01.blend)はここからダウンロードできます。 このファイルにアセットからSwayingMeshを適用してみてください。
ブランコは全体で一つのオブジェクトになっていて、これの一部だけを揺らしてみます。
アセットブラウザから SwMesh-Z を2回ドラッグアンドドロップします。
ブランコを完全に囲むように位置とスケールを調節します。
ジオメトリノードエディタを開いて、右のプロパティの「SwayingMesh.002」をクリックして選択すると、 SwayingMesh.002 という名前のノードがエディタに表示されます。
ノードの複製
ヘッダー部分のジオメトリーノードの名前「SwayingMesh.002」の右側に表示されている「2」という数字は、 このノードが2か所で使われていることを示します。 SwayingMesh.002 のノードツリーの左下の初速を設定するVectorノードのYの数値を 5.0 に変更します。
タイムラインの実行ボタンを押すと追加した2つの枠だけが同じように揺れます。
「SwayingMesh.002」の右側に表示されている「2」という数字をクリックして、このノード専用(シングルユーザコピー)にします。
「2」という数字が消えて、ここでは名前が「SwayingMesh.001」に変更されました。
これは、使われていない別の名前をつけてノードが複製されたことを示します。
名前を「SwayingMesh.L」に変更して、初速を設定するVectorノードのYの数値を 10.0 に変更します。
また「UpdateVelocity」というグループノードの減衰を表す decay を 0.99 にしてほとんど減衰しないように設定します。
まだ、メッシュ変形(Mesh Deform)モディファイアを設定していなかったので、フレームを1に戻してから初速をゼロに戻して変形をリセットします。
ブランコのオブジェクトにメッシュ変形(Mesh Deform)モディファイアを2回適用します。
Mesh Deformモディファイアは左右のブランコにそれぞれ適用するので、オブジェクト名に「SwMesh-Z」を選択して「Bind」ボタンを押します。同様に「SwMesh-Z.001」を選択して、これも「Bind」ボタンを押します。
「Unbind」ボタンが表示されている状態は「Bind」されているということです。
もう一度、初速を設定して、decay も適当に変化させます。 「spri」と表示されているのは「spring_const」でバネ定数です。 値が大きいほど固く速い振動になります。
アウトライナーのパネルを非表示に設定すると、SwayingMeshの枠は表示されませんが、変形はします。
レンダリングしたアニメーションの動画です。 2つのブランコの揺れ方がべつべつになることが確認できます。
揺れ方がブランコらしくありませんが、揺れ方を細かく調整する方法は後で説明します。
シミュレーションゾーン
Blender 3.6 からジオメトリノードに導入されたシミュレーションゾーンは、アニメーションで表示されるフレーム間で情報の受け渡しを可能とする機能です。 これまではジオメトリを複製するなどのハック的な方法を用いる必要がありましたが、シミュレーションノードのソケットや、アトリビュートを使って前のフレームの情報を取得することができます。
次の図の 「Simulation Input」と「Simulation Output」に囲まれて背景に薄い色がついた領域をシミュレーションゾーンと呼びます。「Simulation Input」より前の部分は、最初に1回だけ実行される初期化部分となります。 アニメーションでフレームを表示するたびにシミュレーションゾーンとそれ以降の部分が実行されます。
単振動のシミュレーション
次の図の 「Simulation Input」ノードの「accel(加速度)」と「velocity(速度)」ソケットは、前のフレームの「Simulation Output」ノードの出力を受け取ることができます。
このジオメトリノードのアニメーションを実行した動画です。 バネでつながれた球のように左右に揺れることが確認できます。
これではごちゃごちゃして分かりにくいので、主要な機能をノードグループにまとめます。
「Update」ノードグループはシミュレーションノードの入力から、加速度 (accel) と速度(velocity)を受け取って、位置の変化分(offset)と加速度によって変化した速度を出力します。
Set Position で位置を変更して、「Hook」ノードグループで新しい位置からフックの法則で加速度を求めてシミュレーションの出力に送ります。次のフレームのシミュレーション入力はこの値を受け取ります。
「Update」ノードグループの内容は、速度と加速度で移動量を求める式になっています。
「Hook」ノードグループの内容は、フックの法則の簡単な式です。
このように前のフレームの情報を次のフレームで使う事ができるという機能がシミュレーションゾーンです。
SwayingMesh のシミュレーションゾーン
SwayingMesh では振動させるため、フックの法則を使って、揺れの中心からの距離に応じた力(加速度)を次のフレームに伝え、 次のフレームでは、速度と加速度とタイムステップから位置の変化を算出しています。 位置が変わると力が変化して、加速度としてさらに次のフレームに伝えます。 上の単振動のシミュレーションゾーンとほぼ同じ構成です。
「Time Step」はシミュレーションゾーンでの計算上の時間間隔を表します。 Blender 4.0 のリピートゾーンを使うとシミュレーションの計算精度を上げる事ができますが、ここでは動きの速度が変わるだけです。
さて、ゼリーやプリンや生物のように柔らかいものの「揺れ」は、物体の位置によって揺れ始めと揺れ終わりに時間差が生じることで柔らかい感じが生まれます。遅れて揺れ始めるためには、1フレーム前の情報だけでは不足します。
ノードグループの構成
SwayingMesh では以下のようなジオメトリノードグループを使用しています。 ジオメトリノードモディファイアからは Extrude7 と SwayingMesh を指定します。
他のノードグループは SwayingMesh が内部で呼び出して使っています。どれも小さい簡単なノードグループです。
Node Group | 機能 |
---|---|
Extrude7 | 8頂点を辺でつなぐ、SwayingMeshとは独立したノード |
Hook | フックの法則、位置から加速度を算出 |
IndexScale_Ac | 根元からの位置で加速度を補正 |
IndexScale_Read | 根元からの位置で感度を補正(ReadBufで使用) |
IndexScale_Vel | 根元からの位置で速度を補正 |
MakeMesh | 辺でつながった8頂点からメッシュを作成 |
ReadBuf | 過去の速度をバッファから読み出す |
SelectAxis | 指定した軸(x:0、y:1、z:2)の要素にだけ値を設定する(MakeMeshで使用) |
SetAxis | 伸ばす方向の軸(x:0、y:1、z:2)と大きさを指定(MakeMeshで使用) |
SwayingMesh | 揺れるメッシュのメイン |
UpdateVelocity | 加速度と速度から位置を算出 |
WriteBuf | 速度をバッファに記録 |
ZeroXYZ | 指定した軸(x:0、y:1、z:2)が0となるベクトルを作成(Hook で使用) |
SwayingMesh
SwayingMesh のメインのノードは SwayingMesh です。
SwayingMesh の初期化部分とシミュレーションゾーンの前半です。
シミュレーションゾーンの後半とオブジェクトの表示用の出力部分です。
WriteBuf
WriteBuf が速度の履歴を記録して、ReadBuf が遅れて読み出すことで、柔らかい揺れを実現しています。 ジオメトリノードには配列のように複数の値を記録する機能はありません。SwayingMesh ではメッシュが内部的にグリッドプリミティブを生成して、そのグリッドの頂点の名前付き属性 (Bufferとした) をリングバッファとして使って、フレーム間の位置の変化を複数(SwayingMesh では8個、最大16個)記録しています。グリッドの大きさを大きくすれば数を増やすことはできます。
グリッドの属性への書き込みは WriteBuf が行います。 フレーム数を頂点数(vcount)で除算して得られる剰余と処理中の頂点のインデックスが一致した場合に直前のフレームとのオブジェクトの位置の差をバッファに書き込みます。
ReadBuf
リングバッファからの読出しは ReadBuf が行います。 表示する頂点のインデックスで自分の位置を判断して、対応するバッファの値を読み出します。 バッファから読みだした移動量に factor を乗算して揺れの大きさを変えられるようになっています。アニメーション実行中にオブジェクトの移動に合わせて揺らしたくない場合(初速のみで揺らす)は、 factor の値をゼロにしてください。
IndexScale_Read
処理中の頂点インデックスの値から、揺れるメッシュの根元から先端までの間の割合を求めるノードです。
IndexScale_Ac と IndexScale_Vel もほぼ同じですが、Floatカーブで初期化時に頂点の位置で独立して変化させる事ができるように別のノードグループとしています。
UpdateVelocity と Hook
揺らすための処理は、UpdateVelocity と Hook で上で説明した単振動と同じ計算を行います。
Make Mesh
シミュレーションゾーンの中では8個の頂点の位置を計算しているだけですが、このMakeMeshで8個の頂点からなる線を2回押し出しを行って立体にしています。 押し出す場合に面の裏表をFlip Faceで調整しています。
図の下半分の SetAxis とSelectAxis では、指定した軸(x:0、y:1、z:2)の要素に従った処理を行っています。
揺れ方の細かい設定
もっとも重要な設定は、下の図の左側の「Vector」ノードで、初速の設定です。 初速が全てゼロの場合は、SwMeshX や親オブジェクトを移動しない限り動きません。 初速を設定すると、最初に揺らす力が働いて、アニメーションの実行を始めると揺れ始めます。
次が 赤枠の3つで、decay は揺れの減衰の程度を表し、1.0では減衰なく揺れ続けます。 シミュレーション精度の問題で、1.0でも徐々に増幅される場合があるので、0.99 とかにしたほうがいいです。 この値が小さいほど速く停止します。
「spri」と表示されているのは「spring_const」でバネ定数です。 値が大きいほど固く速い振動になります。
「factor」はオブジェクトの移動に対して、揺れの大きさ(感度)を設定します。 値を大きくすると、少しの動きで大きく振動します。
初速を与えた場合に根元は揺れずに先端ほどよく揺れるようにしています。 Float Curve を変更すると根元のほうが揺れるような設定も可能です。
根元と先端でバネ定数を変化させる場合に Float Curve を変更します。 値が大きいほど固く速い振動になります。
Float Curve を変更する場合は、他にもそのノードを使っている場合はそこでも影響してしまいます。 ブランコの「ノードの複製」で説明したように「シングルユーザコピー」として、専用のコピーにしてから変更してください。
Blender 2.8 - 4.3 の使い方 [目次]
- (01) インストールと日本語化
- (02) 画面構成とモード
- (03) オブジェクトモード
- (04) 球と円柱でモデリング
- (05) スカルプトモード
- (06) 編集モード
- (07) リトポロジー
- (08) Python スクリプト
- (09) マテリアル (1)
- (10) マテリアル (2)
- (11) マテリアル (3)
- (12) アーマチュア(ボーン)
- (13) Rigifyによるリギング
- (14) パーティクルヘア
- (15) グリースペンシル
- (16) ジオメトリーノード (1)
- (17) ジオメトリーノード (2)
- (18) カメラ
- (19) ジオメトリーノード (3)
- (20) 新ヘアシステム Hair Curves
- (21) ヘアカーブの進化
- (22) Vector Displacement Mapブラシ
- (23) アセットライブラリ
- (24) シミュレーションゾーン
- (25) ボーンコレクションとRigify