今回は WFC(Wave Function Collapse)アルゴリズムを Grasshopper で使用できる Monoceros というプラグインを活用していこうと思います。Wave Function Collapse algorithm と検索すると、無限に生成される街など、面白い作品がたくさん出てくると思いますので、興味ある方は是非調べてみてください。そのアルゴリズムを使用し、上の様なパイプのモジュールを特定のルールに基づいて配置していきます。今回はパイプの断面同士が常に接続され、下の Gif 画像の様に常に閉じたパイプが生成されるようなルールを設定していきます。事前に Monoceros のプラグインを
からインストールしてから望んでいただければと思います。完成版のプログラムは Github にプッシュしてあります、こちらから
ダウンロードできます。こちらのチュートリアルは動画化しております、動画の方がよい方は以下のリンクからどうぞ!
概要
上画像がプログラムの全体像となっております。
パーツの作成
- まず初め配置していくパーツを作成していきます。今回は上画像の様なパイプを Rhinoceros 上で 22 パーツ作成しました。パイプのモデルは私の Github からダウンロードできます。作成が手間なので、こちらから(https://github.com/shuya-tamaru/monoceros_practice)ダウンロードして是非利用してください。
- 作成する際、上画像の様に、1×1×1 の立方体に納まるように作成しています。この立方体1つが 1 つのモジュールとなってきます。また、各パイプの断面の中心は、立方体の各面の中心と一致するように配置しております。
パーツを Grasshopper にセット
- 作成したパーツを Grasshopper にセットしていきます。Geometory コンポーネントにセットし、Mesh コンポーネントを使用しメッシュ化します。
- Entwine コンポーネントで作成したメッシュをブランチごとに格納します。出力端子は Simplify しておきます。
- Entwine コンポーネントの出力端子を Geometory コンポーネントに接続しておきます。
モジュールの作成
- セットしたパーツをモジュール化していきます。まずはモジュール名のリストを作成していきます。
- 先ほど作成した Geometory コンポーネントの出力端子に、Group コンポーネントを接続し Flatten します。List Length コンポーネントを接続することで、パーツ数を取得します。今回は 22 が取得できるかと思います。
- Series コンポーネントに List Length コンポーネントで取得した値を Count に接続し、0 ~ 21 のリストを取得します。
- Concatenate コンポーネントで"module"という文字列と、0 ~ 21 のリストを結合します。「module0, module1・・・module21」という感じで、モジュール名のリストが作成されました。出力端子を Graft, Simplify しておきます。
- Construct Module コンポーネントを使用し、モジュール化していきます。入力端子 MN に作成したモジュール名を、入力端子 G に前項で作成したパーツのリストを接続します。入力端子 Pt には、各モジュールの中心点を入力しますが、次の項で作成していこうと思います。入力端子 B は基準平面を、入力端子 D はモジュールのサイスを変更したいときに入力します。今回はデフォルト値のままで。
モジュールの中心点を作成
- モジュールの中心点を作成していきます。詳しい説明は省きますが、1×1×1 の立方体を作成し、その中心点を取得しています。色々間にややこしい処理を加えているのは、パーツが収まっている Geometory コンポーネントのリストと、中心点のリストの順番を対応させるためです。
- Entwine コンポーネントの次の Area コンポーネントで中心点を取得し、一度 Flatten Tree コンポーネントで Flatten してから Graft しています。中心点のリストが個別のブランチに格納されています。Construct Module コンポーネントの入力端子 Pt に接続します。上画像の様に、モジュールが作成されたかと思います。
- Center Box コンポーネントに Deconstruct Brep コンポーネントを接続し、出力端子 Face に Area コンポーネントを接続することで、立方体の各面の中心を取得しています。これは後々使用しますが、詳しくは後の項で説明します。
空のモジュール作成
- 空のモジュールを作成しておきます。Construct Empty Module コンポーネントを用意することで作成されます。
- Merge コンポーネントで空のモジュールと先ほど作成したモジュールのリストを結合します。
- Flatten Tree コンポーネントで Flatten しておきます。
モジュールを配置する Slot の作成
- モジュールを配置するための Slot を作成していきます。今回は 7×7×7 のグリッドを作成し Construct Slot with All Modules Allowed コンポーネントに接続します。上画像の様な立体グリッドが作成されると思います。この時、作成したモジュールと被らない位置に Slot を作成します。
モジュールの配置
- Monoceros WFC Solver コンポーネントを使用し、作成したモジュールを Slot に配置していきます。入力端子 S に先ほど作成した Slot を Flatten して接続します。
- 入力端子 M にモジュールを接続します同様に Flatten しておきます。
- 入力端子 S には Seed 値を入力するので、Number Slider コンポーネントで整数を接続しておきます。
- 入力端子 R にはモジュールを配置する際のルールを接続するので、ルールを作成していきたいと思います。
- Indifferent Rules for unused Connectors コンポーネントを用意し、作成したモジュールを接続します。このコンポーネントはどこにどのモジュールをおいてもいい、というルールとなってます。とりあえずこのルールを接続し動作確認してみます。計算結果が問題なければ、Slot が緑色になります。
- Materialize Slot コンポーネントで可視化します。入力端子 M にモジュールを、入力端子 S に Monoceros WFC Solver コンポーネントの出力端子 S を接続します。
- 上画像の様にモジュールがランダムに配置されていれば OK です。Seed 値を変更しパターンを変えてみてください。
モジュール配置のルール作成
- モジュール配置のルールを作成していきます。ルールというのは、立方体のどの面とどの面が隣り合ってよい、もしくは悪いというのを設定していきます。
- 「モジュールの中心点を作成」の項目で、各立方体の中心点を取得したかと思います。これらを Bake し、Rhinoceros 上で扱えるようにします。
- 今回は Type Rule from Point コンポーネントを使用してルールを設定していきます。このコンポーネントは、立方体各面の中心点を指定することで、指定した点同士は隣り合うことができる、というルールを作成するコンポーネントです。入力端子 M にモジュールを接続します。
- まずは垂直方向のパイプの接続について設定していきます。 入力端子 T にルール名を入力します。今回は Vertical-joint01 としています。
- Point コンポーネントを用意し、パオプ断面が垂直に向いている面の中止点をセットします。例えば、module0 の ②・⑤ の面や module4 の ②・⑤、module15 の ⑤ 面などです。これらの面は上下方向に隣り合うことを許容します。
- 2 つ目のルールを作成します。ルール名を Horizontal-joint01 としました。モジュールの面 ①・④ がパイプの断面となっている面の中心点をセットします。
- 同様に3つ目のルールを作成します。Horizontal-joint02 というルール名とし、モジュールの面 ⓪・③ がパイプ断面になっている面の中心点をセットします。
- Merge コンポーネントで作成した3つのルールを結合して、出力端子を Flatten します。前項で作成した Indifferent Rules for unused Connectors コンポーネントの入力端子 R に接続します。こうすることで、隣にどの面が来てもいいですよというルールについて、ルールがが設定された面に関しては間引かれます。
- Merge コンポーネントで Indifferent Rules for unused Connectors コンポーネントの出力端子と3つのルールを結合して Flatten し Solver に接続します。
- 正しく設定されていれば最初の Gif 画像の様に、Seed 値を変更しての常にパイプが閉じた状態で配置されるかと思います。
完成
以上で完成になります。Seed 値を変更してパイプが常に閉じていれば成功です。こちらのリンク(
を使って作成された作品を見ることができます。工夫すれば色々できそうなので、是非深堀してみてください。
【参考】