Blender 3.6 の使い方 (24) シミュレーションゾーンとSwayingMesh

前 (アセットライブラリ) www.mztn.org 次 (ボーンコレクション)


シミュレーションゾーンとSwayingMesh

シミュレーションノードを使った SwayingMesh の使い方の説明と、後半は Blender 3.6 で導入されたシミュレーションゾーンの解説です。

SimulationZone.png


ダウンロード

以下のリンクからダウンロードできます。 ライセンスはどれも 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) アセットライブラリ を参照してください。 SwayingMesh_install01.png


「ドキュメント\Blender\Assets」フォルダが存在しない場合は、先に作成しておいてください。

さて、「ドキュメント\Blender\Assets」フォルダの SwayingMesh_1.0.blend を Blender 3.6(以降) で開きます。 エディタの領域でアセットブラウザを指定するか、Shift+F1 を1回か2回押します。 「未割り当て」を選択すると以下のように SwayingMesh のアセットが表示されます。

SwayingMesh_install02.png


メニューの「カタログ」から「新規アセットカタログ」をクリックすると、左側に「カタログ*」ができます。

SwayingMesh_install03.png


「カタログ*」をダブルクリックして、例えば「Swaying Meshes」に変更します。

SwayingMesh_install04.png


「未割り当て」を選んで、[A]キーを押してアセットをすべて選択して、「Swaying Meshes」にドラッグして移動します。

SwayingMesh_install05.png


メニューの「カタログ」から「アセットカタログを保存」をクリックしてカタログを保存します。

SwayingMesh_install06.png


SwayingMesh_1.0.blend を保存します。

SwayingMesh_install07.png


「ドキュメント\Blender\Assets」フォルダは以下のようになります。 blender_assets_cats.txt がアセットカタログの実体です。

SwayingMesh_install01b.png


Blender を起動

一度「ドキュメント\Blender\Assets」フォルダにアセットを登録すると、Blender を起動してアセットブラウザを開くと編集中のファイルの内容に関わらず、いつでもアセットを使うことができます。

SwayingMesh_install08.png


アセットブラウザのカタログアイコンをドラッグアンドドロップするとシーンにアセットを追加できます。

SwayingMesh_install09.png


SwMesh のどれかをドラッグアンドドロップすると次のようにワイヤーフレームの四角柱がシーンに追加されます。

SwayingMesh_install10.png


3つの座標軸(X、Y、Z)と正負の方向違いで6種類の SwMesh オブジェクトがあります。

どれを使っても揺らすことができますが、移動方向などに合わせて揺らすには、なるべく枠を大きく回転させないでください。 オブジェクトの移動や初速の設定と揺れの向きが一致しなくなります。


簡単な使い方

SwayingMesh に含まれているアセットだけで、オブジェクトを揺らしてみます。 細長い物体が揺らしやすいので、アセットに含まれる座標軸の形のモデルを追加します。

SwayingMesh_sample_01.png


座標軸の色は Blender のギズモと同じで、明るい色が正の方向です。 ここでは赤い腕を揺らすため、「SwMeshX」をドラッグして追加します。 SwMesh の後ろの文字は軸を示し、「-」は負の方向に伸びるメッシュとなります。

SwayingMesh_sample_02.png


メッシュの位置をスケールを合わして、赤い腕の部分が完全に囲まれるように配置します。 囲まれない部分は変化しません。

SwayingMesh_sample_03.png


ここでは、オブジェクトとメッシュを親子関係にします。

メッシュを先に選択して、シフトを押しながらオブジェクトを選択します。 [Ctrl + P] を押して、オブジェクトをクリックします。

SwayingMesh_sample_04.png


メッシュの揺れに合わせてオブジェクトを揺らすには「メッシュ変形(Mesh Deform)」モディファイアを使います。 プロパティのモディファイアのタブから「モディファイアーを追加」をクリックします。

SwayingMesh_sample_05.png


モディファイアのリストから「メッシュ変形(Mesh Deform)」モディファイアを選択します。

SwayingMesh_sample_06.png


変形の元となるオブジェクトの名前(ここでは SwMeshX) を指定します。

SwayingMesh_sample_07.png


最後に「バインド」を押します。

SwayingMesh_sample_08.png


タイムラインでアニメーションを実行して、オブジェクトを移動させると、動きに合わせてオブジェクトのうちメッシュに囲まれた部分が揺れ動きます。


多くのオブジェクトを揺らす(ブランコ)

ジオメトリノード (1)の「ばらまく」 の例と同じように草を生やして、それを揺らします。

「Instance on Points」のインスタンスにつなぐカーブにSwayingMeshを適用するとすべての草を揺らすことができます。

草原の blendファイル(SwayingMesh_sample_grass0.blend)はここからダウンロードできます。 このファイルにアセットからSwayingMeshを適用してみてください。

SwayingMesh_sample_grass1.png


追加されたメッシュの位置とスケールを合わせます。

SwayingMesh_sample_grass2.png


上から見てちょうど囲まれるような位置にメッシュを設置します。 原点中心にスケールされるので、原点を近くに配置します。

SwayingMesh_sample_grass3.png


上から見て完全に囲まれるようにメッシュを設置します。

SwayingMesh_sample_grass4.png


横からも「SZ」とキーを押して高さを合わせます。

SwayingMesh_sample_grass5.png


メッシュ変形(Mesh Deform)モディファイアを追加して、オブジェクトに(SwMeshZ)を指定して、「Bind」を押します。

SwayingMesh_sample_grass6.png


初速を設定して勝手に揺らす

初速を設定するとアニメーションを実行すると、勝手に揺れ始めます。

SwayingMesh_sample_grass7.png


spring_const の値を小さくすると揺れがゆっくりになります。

SwayingMesh_sample_grass8.png


初速を与えて、減衰を小さくすると、長い間勝手に揺られるアニメーションができます。


2つのブランコの揺れ方を変える

下向きの枠となる SwMesh-Z をブランコのオブジェクトに適用してみましょう。

ブランコのblendファイル(Swing_01.blend)はここからダウンロードできます。 このファイルにアセットからSwayingMeshを適用してみてください。

ブランコは全体で一つのオブジェクトになっていて、これの一部だけを揺らしてみます。

Swing_01.png


アセットブラウザから SwMesh-Z を2回ドラッグアンドドロップします。

Swing_02.png


ブランコを完全に囲むように位置とスケールを調節します。

Swing_03.png


ジオメトリノードエディタを開いて、右のプロパティの「SwayingMesh.002」をクリックして選択すると、 SwayingMesh.002 という名前のノードがエディタに表示されます。

Swing_04.png


ノードの複製

ヘッダー部分のジオメトリーノードの名前「SwayingMesh.002」の右側に表示されている「2」という数字は、 このノードが2か所で使われていることを示します。 SwayingMesh.002 のノードツリーの左下の初速を設定するVectorノードのYの数値を 5.0 に変更します。

タイムラインの実行ボタンを押すと追加した2つの枠だけが同じように揺れます。

Swing_05.png


「SwayingMesh.002」の右側に表示されている「2」という数字をクリックして、このノード専用(シングルユーザコピー)にします。

Swing_06.png


「2」という数字が消えて、ここでは名前が「SwayingMesh.001」に変更されました。

これは、使われていない別の名前をつけてノードが複製されたことを示します。

Swing_07.png


名前を「SwayingMesh.L」に変更して、初速を設定するVectorノードのYの数値を 10.0 に変更します。

Swing_08.png


また「UpdateVelocity」というグループノードの減衰を表す decay を 0.99 にしてほとんど減衰しないように設定します。

Swing_09.png


まだ、メッシュ変形(Mesh Deform)モディファイアを設定していなかったので、フレームを1に戻してから初速をゼロに戻して変形をリセットします。

Swing_10.png


ブランコのオブジェクトにメッシュ変形(Mesh Deform)モディファイアを2回適用します。

Swing_11.png


Mesh Deformモディファイアは左右のブランコにそれぞれ適用するので、オブジェクト名に「SwMesh-Z」を選択して「Bind」ボタンを押します。同様に「SwMesh-Z.001」を選択して、これも「Bind」ボタンを押します。

Swing_12.png


「Unbind」ボタンが表示されている状態は「Bind」されているということです。

Swing_13.png


もう一度、初速を設定して、decay も適当に変化させます。 「spri」と表示されているのは「spring_const」でバネ定数です。 値が大きいほど固く速い振動になります。

Swing_14.png


アウトライナーのパネルを非表示に設定すると、SwayingMeshの枠は表示されませんが、変形はします。

Swing_15.png


レンダリングしたアニメーションの動画です。 2つのブランコの揺れ方がべつべつになることが確認できます。

揺れ方がブランコらしくありませんが、揺れ方を細かく調整する方法は後で説明します。




シミュレーションゾーン

Blender 3.6 からジオメトリノードに導入されたシミュレーションゾーンは、アニメーションで表示されるフレーム間で情報の受け渡しを可能とする機能です。 これまではジオメトリを複製するなどのハック的な方法を用いる必要がありましたが、シミュレーションノードのソケットや、アトリビュートを使って前のフレームの情報を取得することができます。

次の図の 「Simulation Input」と「Simulation Output」に囲まれて背景に薄い色がついた領域をシミュレーションゾーンと呼びます。「Simulation Input」より前の部分は、最初に1回だけ実行される初期化部分となります。 アニメーションでフレームを表示するたびにシミュレーションゾーンとそれ以降の部分が実行されます。

単振動のシミュレーション

次の図の 「Simulation Input」ノードの「accel(加速度)」と「velocity(速度)」ソケットは、前のフレームの「Simulation Output」ノードの出力を受け取ることができます。

SimpleHarmonic_01.png


このジオメトリノードのアニメーションを実行した動画です。 バネでつながれた球のように左右に揺れることが確認できます。


これではごちゃごちゃして分かりにくいので、主要な機能をノードグループにまとめます。

「Update」ノードグループはシミュレーションノードの入力から、加速度 (accel) と速度(velocity)を受け取って、位置の変化分(offset)と加速度によって変化した速度を出力します。

Set Position で位置を変更して、「Hook」ノードグループで新しい位置からフックの法則で加速度を求めてシミュレーションの出力に送ります。次のフレームのシミュレーション入力はこの値を受け取ります。

SimpleHarmonic_02.png


「Update」ノードグループの内容は、速度と加速度で移動量を求める式になっています。

SimpleHarmonic_03.png


「Hook」ノードグループの内容は、フックの法則の簡単な式です。

SimpleHarmonic_04.png


このように前のフレームの情報を次のフレームで使う事ができるという機能がシミュレーションゾーンです。

SwayingMesh のシミュレーションゾーン

SwayingMesh では振動させるため、フックの法則を使って、揺れの中心からの距離に応じた力(加速度)を次のフレームに伝え、 次のフレームでは、速度と加速度とタイムステップから位置の変化を算出しています。 位置が変わると力が変化して、加速度としてさらに次のフレームに伝えます。 上の単振動のシミュレーションゾーンとほぼ同じ構成です。

「Time Step」はシミュレーションゾーンでの計算上の時間間隔を表します。 Blender 4.0 のリピートゾーンを使うとシミュレーションの計算精度を上げる事ができますが、ここでは動きの速度が変わるだけです。

SwayingMesh_1.0_sim.png


さて、ゼリーやプリンや生物のように柔らかいものの「揺れ」は、物体の位置によって揺れ始めと揺れ終わりに時間差が生じることで柔らかい感じが生まれます。遅れて揺れ始めるためには、1フレーム前の情報だけでは不足します。


ノードグループの構成

SwayingMesh では以下のようなジオメトリノードグループを使用しています。 ジオメトリノードモディファイアからは Extrude7 と SwayingMesh を指定します。

他のノードグループは SwayingMesh が内部で呼び出して使っています。どれも小さい簡単なノードグループです。

Node Group機能
Extrude78頂点を辺でつなぐ、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 の初期化部分とシミュレーションゾーンの前半です。

SwayingMesh_1.0_node1.png


シミュレーションゾーンの後半とオブジェクトの表示用の出力部分です。

SwayingMesh_1.0_node2.png


WriteBuf

WriteBuf が速度の履歴を記録して、ReadBuf が遅れて読み出すことで、柔らかい揺れを実現しています。 ジオメトリノードには配列のように複数の値を記録する機能はありません。SwayingMesh ではメッシュが内部的にグリッドプリミティブを生成して、そのグリッドの頂点の名前付き属性 (Bufferとした) をリングバッファとして使って、フレーム間の位置の変化を複数(SwayingMesh では8個、最大16個)記録しています。グリッドの大きさを大きくすれば数を増やすことはできます。

グリッドの属性への書き込みは WriteBuf が行います。 フレーム数を頂点数(vcount)で除算して得られる剰余と処理中の頂点のインデックスが一致した場合に直前のフレームとのオブジェクトの位置の差をバッファに書き込みます。

SwayingMesh_1.0_WriteBuf.png


ReadBuf

リングバッファからの読出しは ReadBuf が行います。 表示する頂点のインデックスで自分の位置を判断して、対応するバッファの値を読み出します。 バッファから読みだした移動量に factor を乗算して揺れの大きさを変えられるようになっています。アニメーション実行中にオブジェクトの移動に合わせて揺らしたくない場合(初速のみで揺らす)は、 factor の値をゼロにしてください。

SwayingMesh_1.0_ReadBuf.png


IndexScale_Read

処理中の頂点インデックスの値から、揺れるメッシュの根元から先端までの間の割合を求めるノードです。

SwayingMesh_1.0_IndexScale_Read.png


IndexScale_Ac と IndexScale_Vel もほぼ同じですが、Floatカーブで初期化時に頂点の位置で独立して変化させる事ができるように別のノードグループとしています。

SwayingMesh_1.0_IndexScale.png


UpdateVelocity と Hook

揺らすための処理は、UpdateVelocity と Hook で上で説明した単振動と同じ計算を行います。

SwayingMesh_1.0_Update_Hook.png


Make Mesh

シミュレーションゾーンの中では8個の頂点の位置を計算しているだけですが、このMakeMeshで8個の頂点からなる線を2回押し出しを行って立体にしています。 押し出す場合に面の裏表をFlip Faceで調整しています。

図の下半分の SetAxis とSelectAxis では、指定した軸(x:0、y:1、z:2)の要素に従った処理を行っています。

SwayingMesh_1.0_MakeMesh.png


揺れ方の細かい設定

もっとも重要な設定は、下の図の左側の「Vector」ノードで、初速の設定です。 初速が全てゼロの場合は、SwMeshX や親オブジェクトを移動しない限り動きません。 初速を設定すると、最初に揺らす力が働いて、アニメーションの実行を始めると揺れ始めます。

SwayingMesh_sample_00_node01.png


次が 赤枠の3つで、decay は揺れの減衰の程度を表し、1.0では減衰なく揺れ続けます。 シミュレーション精度の問題で、1.0でも徐々に増幅される場合があるので、0.99 とかにしたほうがいいです。 この値が小さいほど速く停止します。

「spri」と表示されているのは「spring_const」でバネ定数です。 値が大きいほど固く速い振動になります。

「factor」はオブジェクトの移動に対して、揺れの大きさ(感度)を設定します。 値を大きくすると、少しの動きで大きく振動します。

SwayingMesh_sample_00_node02.png


初速を与えた場合に根元は揺れずに先端ほどよく揺れるようにしています。 Float Curve を変更すると根元のほうが揺れるような設定も可能です。

SwayingMesh_sample_00_node03.png


根元と先端でバネ定数を変化させる場合に Float Curve を変更します。 値が大きいほど固く速い振動になります。

SwayingMesh_sample_00_node04.png


Float Curve を変更する場合は、他にもそのノードを使っている場合はそこでも影響してしまいます。 ブランコの「ノードの複製」で説明したように「シングルユーザコピー」として、専用のコピーにしてから変更してください。

ページ先頭へ


Blender 2.8 - 4.1 の使い方 [目次]

copyright (C) 2019-2024 Jun Mizutani