AnastasiaのProcedural Mandala Pattern VEX tutorial


今回はAnastasia が無料で公開している Procedural Mandala Pattern VEX tutorial というビデオチュートリアルの紹介です。

 

サンプルファイルは以下からダウンロードすることができます。
https://gum.co/CltRS

 

 

今回のビデオではセルオートマトンを基にしたアルゴリズムで曼荼羅の様なパターンを作成します。

 

アルゴリズム

セルオートマトンはセルがグリッド上に配置された物で、セルが幾つかの状態を表す事ができます(例えばON、OFF等)。そしてある一定の時間(ステップ)で、自分のセルと隣接するセルの状態に応じて、特定のルールを適用して次のステップでの自分のセルの状態を決めます。

例えば、ビデオでは最初にグリッドではなく1D(一次元)の配列で説明をしています。最初のステップ(S = 1)の時にセルの状態を初期化(0 か1 )して、予め決めたルールに従って次のステップ(S = 2)のセルの状態を決定します。ルールは、自分のセルと左右のセルの状態を定義したパターンで、このパターンによって次のステップで自分のセルの値が 0 か 1 のどちらになるかが決まります。

 

このセルは1Dなので、これらを積み重ねて各ステップの工程を2Dのパターンに表すこともできます。Wolfram MathWorldのページからこの2Dにしたイメージを確認することができます。簡単なルールですが興味深い模様ができあがるのが分かるかと思います。

 

次に、先程の1Dでのセルオートマトンを2Dグリッドで行います。ここで考えられるのが、どのセルをチェックするのかということで、隣り合っている4つのセル、、周りにある8つのセル、さらに外側のセルまでチェックして、一定のサイズの円の内部のセルをチェック・・・といろんな可能性が考えられるわけです。もしチェックするセルの数が増えてくると、それに応じてルールに使うパターンの定義の数も膨大になり、現実的ではありません。

 

そこでアナスタシアはセルオートマトンを基にした蓄積アルゴリズムを考えました。セルの中は浮動小数点が入ります。下図だと左右のセルに 1.0 の値が入っています。これに、チェックするセルを決める半径パラメーターを用いて、半径内の全てのセルをチェックしてセル内のデータを加算します。これを div と名付けたパラメーターで除算します。仮に div が 5 だとすると、セルの合計は 1 + 1 = 2 。 2 / 5 = 0.4 ということで自分のセルには 0.4 が格納されます。

 

そして次のステップでも同様の計算が行われ、結果を自分のセルのデータに追加(蓄積)します。これをずっと繰り返すと値は無限大に大きくなってしまいますが、最終的な結果をクランプして 0-1 内に収めます。しかし、このままだと最終的に全てのセルの値が 1 になってしまいます。

 

ここで値を蓄積させるかどうかのスレッショルド(セルの数)を表すパラメーター(neigh_c)を作ります。仮に、自分の周りにあるセルの値が 0 より大きい値が入っているセルが 4 つあるとします(下図の白い部分)。そして仮に neigh_c の値が 3 だとすると、自分の周りにある 0 より大きい値を持つセルの数が neigh_c の数よりも大きくなり、この場合は何の処理もしないようにします。すると全てのセルの値が 1 になるのを防ぐことができます。

 

 

後はこの処理を全てのセルに対して行い、そして何十回と繰り返していくことで曼荼羅模様が出来上がります。次回はVEXでの実装の部分を紹介します。

8月26日の弊社のイベントで堀川様もセルオートマトンを扱った紹介をするそうなので楽しみですね!