今回は WFC(Wave Function Collapse)アルゴリズムを Grasshopper で使用できる Monoceros というプラグインを活用し、以下の Gif 画像の様に Number Slider を動かすと、円形に町が成長していくプログラムを組んでいこうと思います。事前に Monoceros のプラグインをこちら
からインストールしてから望んでいただければと思います。また、完成形のファイルは Github にプッシュしております、こちら
からダウンロードできますので、是非活用してください。こちらのチュートリアルは動画化しております、動画の方がよい方は以下のリンクからどうぞ!
概要
上画像がプログラムの全体像となっております。各ブロックごとに説明していこうと思います。
パーツの作成
- まず初め配置していくパーツを作成していきます。今回は上画像の様なオブジェクトを Rhinoceros 上で 13 パーツ作成しました。こちらのモデルは私の Github リポジトリからダウンロードできますので、是非ご活用ください。こちらからどうぞ!
- 作成する際、上画像の様に、1×1×1 の立方体に納まるように作成しています。この立方体1つが 1 つのモジュールとなってきます。この時、立方体同士が接しない位置に作成してください。
パーツを Grasshopper にセット
- 作成したパーツを Grasshopper にセットしていきます。Geometory コンポーネントにセットし、Mesh コンポーネントを使用しメッシュ化します。
- Entwine コンポーネントで作成したメッシュをブランチごとに格納します。出力端子はSimplifyしておきます。
- Entwine コンポーネントの出力端子をGeometory コンポーネントに接続しておきます。
モジュールの作成
- セットしたパーツをモジュール化していきます。まずはモジュール名のリストを作成していきます。
- 先ほど作成したGeometory コンポーネントの出力端子に、Tree Statics コンポーネントを接続しブランチのパスを取得します。List Length コンポーネントを接続し、ブランチのパスの数を取得することでパーツ数を取得します。今回は 13 が取得できるかと思います。
- Series コンポーネントにList Length コンポーネントで取得した値を Count に接続し、0 ~ 12 のリストを取得します。
- Concatenate コンポーネントで"module"という文字列と、0 ~ 12 のリストを結合します。「module0, module1・・・module12」という感じで、モジュール名のリストが作成されました。出力端子をGraftしておきます。
- Construct Module コンポーネントを使用し、モジュール化していきます。入力端子 MN に作成したモジュール名を、入力端子 G に前項で作成したパーツのリストを接続します。入力端子 Pt には、各モジュールの中心点を入力しますが、次の項で作成していこうと思います。入力端子 B は基準平面を、入力端子 D はモジュールのサイスを変更したいときに入力します。今回はデフォルト値のままで。
モジュールの中心点を作成
- モジュールの中心点を作成していきます。詳しい説明は省きますが、1×1×1 の立方体を作成し、その中心点を取得しています。パーツが収まっているGeometory コンポーネントのリストと、中心点のリストの順番を対応させるよう注意してください。
- Graft Tree コンポーネントに各パーツが格納される立方体の中心点のリストが各々ブランチに格納されています。Construct Module コンポーネントの入力端子 Pt に接続します。上画像の様に、モジュールが作成されたかと思います。
- Center Box コンポーネントにDeconstruct Brep コンポーネントを接続し、出力端子 Face にArea コンポーネントを接続することで、立方体の各面の中心を取得しています。これは後々使用しますが、詳しくは後の項で説明します。
空のモジュール作成
- 空のモジュールを作成しておきます。Construct Empty Module コンポーネントを用意することで作成されます。
- Merge コンポーネントで空のモジュールと先ほど作成したモジュールのリストを結合します。
- Flatten Tree コンポーネントでFlattenしておきます。
モジュールを配置する Slot の作成 ①
- モジュールを配置するための Slot を作成していきます。トーラス型に広がっていく街を作成していきたいので、立方体をトーラス型に配置していきます。
- Square コンポーネントでグリッドを作成し、出力端子 P からポイントを取得します。
- Circle コンポーネントで作成したグリッドに内接する円を作成します。Circle コンポーネントに接続されているConstruct Point コンポーネントではグリッドの中心点を作成しているので、Expressionにx/2が入力されています。
- Scale コンポーネントで作成した円を縮小します。
モジュールを配置する Slot の作成 ②
- Point in Curve コンポーネントで作成した 2 つの円、それぞれの内部に属する点を取得します。出力端子 R からは、0,1,2 が出力されますが、0 は円の外、1 は円上、2 は円内のポイントとなるので、Member index コンポーネントで出力値が 2 のインデックスを取得します。
- List Item コンポーネントで取得したインデックスのポイントを取得することで、円内に属するポイントを取得できます。List Item コンポーネントの出力端子は Flatten しておきます。
- 2 つの円内に属するポイントのリストが 2 つ(List Item コンポーネントが 2 つ)あるかと思います、大きい円内に属するポイントから、小さい円内にも属するポイントのインデックスを、Member Index コンポーネントで取得し、Cull Index コンポーネントで取得したインデックスをリストから引くことで、2 つの円の間に属するポイントを取得します。
モジュールを配置する Slot の作成 ③
- Liner Array コンポーネントで、先ほど取得したポイントのリストを Z 方向に複製します。
- Construct Slot with All Modules Allowed コンポーネントに接続します。上画像の様に接続した点を中心とした、トーラス上に立方体が配置された Slot が作成されます。
モジュール配置のルール作成 ①
- モジュール配置のルールを作成していきます。作成したモジュールのリストから、module9, 11, 12 を取得します。この 3 つのモジュールは、地面に接してほしいので、そのような条件を設定します。
- Construct Rules At Boundary コンポーネントに取得した 3 つのモジュールを接続します。各モジュールの面に 0 ~ 5 までの番号が振ってあるかと思います。このコンポーネントは指定したモジュールの指定した面が境界に接するように配置する、といった条件を設定します。今回は下面(5 の面)が境界に接してほしいので、入力端子 C に立方体の下面を表す 5 を入力します。
モジュール配置のルール作成 ②
- Z 方向のルールを 2 つ設定していきます。Typed Rule from Point コンポーネントで設定していきます。このコンポーネントは、モジュールの各面の中心に配置した点で、接続してほしい点をセットすることで、条件を作成していくコンポーネントです。
- 1 つ目は Z-coloumn というルール名で設定していきます。Point コンポーネントには module0, 1, 5, 6 の 5 の面、module8 の 2 と 5 の面、module9 の 2 の面のポイントをセットしています。
- 2 つ目は Z-dir-stair というルール名で設定していきます。Point コンポーネントには module2, 3, 4, 7 の 5 の面、module10 の 2 と 5 の面、module11 の 2 の面のポイントをセットしています。
モジュール配置のルール作成 ③
- 否定のルールも作成していきます。今回は、empty モジュールは、最下面に来ないようにするルールを設定していきます。
- とりあえずConstruct Rules At Boundary コンポーネントで empty モジュールの 5 の面が境界に接するという条件を作成します。後ほどこの条件を非許可していきます。
モジュール配置のルール作成 ④
- 作成したルールをまとめていきます。Merge コンポーネントで最後に作成した否定の条件以外をまとめてFlattenします。
- Indifferent Rules for unused Connector コンポーネントの入力端子 M にすべてのモジュールを接続し、R に先ほどMerge コンポーネントでまとめたルールを接続します。これで、何もルールが設定されていない面はどこにおいてもよい、というルールが作成されました。
- Merge コンポーネントでまとめます。
- Collect Rules コンポーネントを用意します。入力端子 M にすべてのモジュールを接続します。入力端子 RA には許可する条件、RD には非許可の条件を接続します。これでモジュールを配置するルールの設定が完了しました。
モジュールの配置
- Monoceros WFC Solver コンポーネントを使用し、作成したモジュールを Slot に配置していきます。入力端子 S に作成した Slot をFlattenして接続します。
- 入力端子 M にモジュールを接続します同様にFlattenしておきます。
- 入力端子 S には Seed 値を入力するので、Number Slider コンポーネントで整数を接続しておきます。
- 入力端子 R には先ほど作成したモジュールを配置する際のルールを接続します。
- 計算結果が問題なければ、Slot が緑色になります。
- Materialize Slots コンポーネントで計算結果を可視化します。
- Custom Preview コンポーネントとColour Swatch コンポーネントで色付けして完成です。
- Slot を作成した際に、作成したグリッドの数(Square コンポーネントに接続されているNumber Slider コンポーネント)の値を変化させることで、最初の Gif 画像の様な挙動をします。アニメーションにしたい方はNumber Slider コンポーネントの Animate 機能を使ってみてください。
完成
以上で完成になります。前回の記事でも、Monoceros を使用した別のチュートリアルを作成しています。ご興味ある方は以下のリンクからのぞいてみてください。
【参考】