【Unity】VFX Graphでローレンツアトラクタを描画する

Cluster,Inc. Advent Calendar 2018、8日目の記事です。

qiita.com

概要

VFX Graphでローレンツアトラクタを描画してみました。 ローレンツアトラクタは、下の画像のように、円が2個くっついたような挙動をする方程式です。

f:id:notargs:20181204113728g:plain

式を読む

ローレンツアトラクタは下記の式で表されます。(Wikipediaより引用)


\begin{aligned}
{\frac  {dx}{dt}}=-px+py \\
{\frac  {dy}{dt}}=-xz+rx-y \\
{\frac  {dz}{dt}}=xy-bz
\end{aligned}

これはxyzそれぞれにおける特定の位置(p)での速度を表す式で、xの速度なら-px+pyで計算できることがわかります。

prbは適当な値で、当初の論文ではp=10r=28b=8/3を与えていたようです。

実装していく

p、r、bの実装

p=10r=28b=8/3をそのまま実装します。 ここについては見たままなのでスルーで。

f:id:notargs:20181204135727p:plain

dx、dy、dzの実装

Get Attribute: position(Current)ノードで現在のpxpypzの値が取れるので、各数式をノードで実装していきます。 prbと比べると少し複雑ですが、よく見比べてみると数式をそのまま書き起こしただけということがわかると思います。

{\frac  {dx}{dt}}=-px+py

f:id:notargs:20181204141710p:plain

{\frac  {dy}{dt}}=-xz+rx-y

f:id:notargs:20181204141715p:plain

{\frac  {dz}{dt}}=xy-bz

f:id:notargs:20181204141738p:plain

速度に代入する

AppendVectorノードでdx/dtdy/dtdz/dtからベクトルを作り、Multiplyで速度を調整して、Updateノード内のSetVelocityにそのまま代入します。

f:id:notargs:20181204143431p:plain

初期位置を調整する

原点からSpawnさせてもあまりいい動きをしてくれないため、InitializeにPosition(Sphere)ブロックをくっつけて位置を調整します。 f:id:notargs:20181204142726p:plain f:id:notargs:20181204143014p:plain

適当に飾り付け

あとは時間に応じて大きさを変えたり、パーティクルの数を増やしてみたり、ランダムな色に光らせてみたり、出力をLine Outputにしてみたり、飾り付けをすれば完成です!

f:id:notargs:20181204113728g:plain

全体のノードはこんな感じになりました。

f:id:notargs:20181204143254p:plain