Skip to content

改訂前の参考解説

このページは改訂前の教材です。現在の授業の回番号・内容は、後期の授業計画で確認してください。

第01回 GPU粒子の配置と群れの変形

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にします。

位置の計算は、次の関係になります。この式は、ノードが計算する内容を表しています。

text
広がりを調整した位置 = home × Spread

Spreadを1から0.5へ変えると、各粒子の原点からの距離は半分になります。粒子数は変わりませんが、三次元の分布の体積は8分の1になるため、空間内の密度は8倍になります。

Spreadを0.5へ変更した後、1へ戻してください。元のhomeを保存していれば、粒子は元の配置へ戻ります。

現在のpositionへ毎回0.5を掛ける構成では、粒子は更新のたびに原点へ近づきます。この回では、変形の基準として変わらないhomeを使うことが重要です。

同じ方向に球殻状の目標位置を作る ​

次に、各粒子が原点から一定の距離に並ぶ配置を作ります。中心から同じ距離にある点の集まりは、球の表面に相当します。

次の計算をOperatorで組み立ててください。

  1. Lengthへhomeを接続し、原点からの距離を求めてください。
  2. Maximumでその距離と0.0001を比較し、大きい方を選んでください。
  3. Divideでhomeをその値で割ってください。
  4. Divideの出力へRadiusをMultiplyで掛けてください。

通常、方向だけを取り出す処理にはNormalizeを使います。ここでは、原点と完全に一致する粒子でも0で割らないように、除数の下限を明示しています。homeが(0, 0, 0)の粒子は、この式では原点に残ります。

text
方向 = 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へつなぎます。

text
現在の位置 = Lerp(広がりを調整した位置, 球殻状の目標位置, Blend)

Lerpは、二つの値の間を指定した割合で補間します。Blendが0なら元の配置、1なら球殻状の配置、0.5なら各粒子の出発点と目標位置の中間になります。

Spread = 1、Radius = 4に固定し、Blendを0から1へ少しずつ変更してください。一つの値を操作していても、各粒子は自分のhomeを使うため、それぞれ異なる経路で移動します。

チェックリスト
  • 速度による自動位置更新を無効にし、式の結果をSet Positionで書き込んでいます。
  • Spreadを戻すと元の配置へ戻ることを確認できます。
  • 原点から一定の距離に目標位置を作る計算を説明できます。
  • Blendだけを操作して二つの配置の間を連続的に変形できます。