3 / 4 二つの配置の補間
このステップでは、保存した位置から二つの配置を求め、粒子群を元の配置と球殻状の配置の間で変形させます。
位置を式から直接求める
この回のUpdateは、速度を積み重ねて粒子を動かすのではなく、保存したhomeから現在位置を求めます。
Update ParticleのUpdate Positionを無効にしてください。この設定は、速度に基づく自動の位置更新を止めます。配置したSet PositionのBlockは、引き続き位置を書き換えられます。
続いて、Get Custom Attributeでhomeを読み、LocationをCurrent、型を保存時と同じ三成分の型にしてください。
元の配置の広がりを調整する
homeとSpreadをMultiplyへ接続し、その出力をUpdateのSet Positionへつないでください。Set Positionは、CompositionをSet、RandomをOffにします。
位置の計算は、次の関係になります。この式は、ノードが計算する内容を表しています。
広がりを調整した位置 = home × SpreadSpreadを1から0.5へ変えると、各粒子の原点からの距離は半分になります。粒子数は変わりませんが、三次元の分布の体積は8分の1になるため、空間内の密度は8倍になります。
Spreadを0.5へ変更した後、1へ戻してください。元のhomeを保存していれば、粒子は元の配置へ戻ります。
現在のpositionへ毎回0.5を掛ける構成では、粒子は更新のたびに原点へ近づきます。この回では、変形の基準として変わらないhomeを使うことが重要です。
同じ方向に球殻状の目標位置を作る
次に、各粒子が原点から一定の距離に並ぶ配置を作ります。中心から同じ距離にある点の集まりは、球の表面に相当します。
次の計算をOperatorで組み立ててください。
- Lengthへ
homeを接続し、原点からの距離を求めてください。 - Maximumでその距離と
0.0001を比較し、大きい方を選んでください。 - Divideで
homeをその値で割ってください。 - Divideの出力へ
RadiusをMultiplyで掛けてください。
通常、方向だけを取り出す処理にはNormalizeを使います。ここでは、原点と完全に一致する粒子でも0で割らないように、除数の下限を明示しています。homeが(0, 0, 0)の粒子は、この式では原点に残ります。
方向 = home ÷ Maximum(Length(home), 0.0001)
球殻状の目標位置 = 方向 × Radius例えばhomeが(2, 0, 0)で、Radiusが4なら、目標位置は(4, 0, 0)になります。同じ計算をhome = (0, 1, 0)でも確かめてください。
箱形の分布を中心から投影するため、球面上の密度は完全には均一になりません。この例では、二つの配置の関係を理解することを優先します。球面上へ均等に配置する乱数の作り方は、発展として扱えます。
二つの位置をLerpでつなぐ
LerpのAへ広がりを調整した位置、Bへ球殻状の目標位置、TへBlendを接続してください。その出力をUpdateのSet Positionへつなぎます。
現在の位置 = Lerp(広がりを調整した位置, 球殻状の目標位置, Blend)Lerpは、二つの値の間を指定した割合で補間します。Blendが0なら元の配置、1なら球殻状の配置、0.5なら各粒子の出発点と目標位置の中間になります。
Spread = 1、Radius = 4に固定し、Blendを0から1へ少しずつ変更してください。一つの値を操作していても、各粒子は自分のhomeを使うため、それぞれ異なる経路で移動します。
- 速度による自動位置更新を無効にし、式の結果をSet Positionで書き込んでいます。
-
Spreadを戻すと元の配置へ戻ることを確認できます。 - 原点から一定の距離に目標位置を作る計算を説明できます。
-
Blendだけを操作して二つの配置の間を連続的に変形できます。