反応拡散系(7)
Gray-Scott モデルの方程式による反応拡散系について、基礎研究的なコードを組んできましたが、それらを踏まえてメディアアート的なものも作ってみたいと思います。
まずは、ユーザのマウス操作に対してインタラクティブな挙動をするものを組んでみました。
マウスドラックした部分とそうでない部分とで見栄えが変わります。↓
Gray-Scott モデルの反応拡散方程式 4 – wonderfl build flash online
反応拡散系の視覚化は、描画領域の全ピクセルに対して、原材料と中間生成物の濃度を設定し、それを Gray-Scott モデル方程式で計算する、というものです。
今回のコードでは、その方程式計算に使うパラメータが、マウスドラッグした部分(以下「線部分」)とそうでない部分(以下「地部分」)では異なるものを使っています。
以前見ましたが、以下のとおり Gray-Scott モデルの方程式では反応パラメータ F、k と拡散パラメータ Dv、Du の4つがあります。
これまた以前見ましたが、反応パラメータを変更すると線や縞、点など模様の形状が、拡散パラメータを変更すると模様の大きさが変わります。
vt = dvΔv - u^2v + F(1-v)
ut = duΔu + u^2v - (F+k)u
dv : V の拡散率
du : U の拡散率
F : 原材料 V の外部からの供給率&中間生成物 U の外部への流出率
k : 中間生成物 U の最終生成物 P への転換率(U の除去率)
パラメータを全部変えのるか、特定のものだけ変えるのか、いろいろな選択肢がありますが、今回は、見栄えの分かりやすさを過度に優先し、反応パラメータ F だけを変えるようにして、他のパラメータは固定しました。
線部分と地部分との判定はフォースマップで処理したんですが、めんどくさかったのは、フォースマップが1枚では済まなかったこと。
MOUSE_MOVE の瞬間ごとのマウスドラッグ状況を保存するフォースマップ(以下「瞬間マップ」)と、それら瞬間ごとの状況を累積するフォースマップ(以下「累積マップ」)と2種類が必要になりました。
ざっくり言うと、瞬間マップは「描くという行為」に、累積マップは「描いた結果」に関する処理で使います。
初期状態は無地です。原材料濃度を全ピクセル 1、中間生成物濃度を全ピクセル 0 にしており、反応拡散が起きないからです。
マウスドラッグにより線部分にあるピクセルに対応する中間生成物濃度が 0 以外の値に変更されます。それが反応拡散開始のトリガーですが、その濃度変更は、値の置換ではなく、元の値への加算で処理しています。
なぜ置換ではなく加算なのかと言うと、そうしないと ENTER_FRAME で計算されている中間生成物濃度の変化の連続性が阻害されるからです。
瞬間マップは、MOUSE_MOVE の瞬間ごとに、その瞬間に引かれた線部分の場所のピクセルだけに、中間濃度加算処理をおこなうためのものです。
これに累積マップを使ってしまうと、全 MOUSE_MOVE 時、線部分の全ピクセルで、中間生成物濃度加算が発生してしまいます。
つまり、過去に、ドラッグによる濃度変更をおこない、現在は ENTER_FRAME の反応拡散方程式計算によってドラッグ時とは異なる濃度に変化してしまっているピクセルに対しても、再度、過去に実行した中間生成物濃度加算が発生するわけで、これまた中間生成物濃度の変化の連続性が阻害されることになります。
では、累積マップは何をしているのかというと、ENTER_FRAME ごとの反応拡散方程式計算において、どのピクセルでは反応パラメータ F にどの値を使うのか、ということの判定に使っています。
瞬間マップは中間生成物の濃度に、累積マップは反応拡散パラメータに干渉しているわけですね。
Comments
Tell me what you're thinking...
and oh, if you want a pic to show with your comment, go get a gravatar!