GH Basics GH Tutorial Grasshopper Objects

【Grasshopper Tutorial】 Growing Town using Monoceros

今回はWFC(Wave Function Collapse)アルゴリズムをGrasshopperで使用できるMonocerosというプラグインを活用し、以下のGif画像の様にNumber Sliderを動かすと、円形に町が成長していくプログラムを組んでいこうと思います。事前にMonocerosのプラグインをこちらからインストールしてから望んでいただければと思います。また、完成形のファイルはGithubにプッシュしております、こちらからダウンロードできますので、是非活用してください。こちらのチュートリアルは動画化しております、動画の方がよい方は以下のリンクからどうぞ!

概要

上画像がプログラムの全体像となっております。各ブロックごとに説明していこうと思います。

パーツの作成

  1. まず初め配置していくパーツを作成していきます。今回は上画像の様なオブジェクトをRhinoceros上で13パーツ作成しました。こちらのモデルは私のGithubリポジトリからダウンロードできますので、是非ご活用ください。こちらからどうぞ!
  1. 作成する際、上画像の様に、1×1×1の立方体に納まるように作成しています。この立方体1つが1つのモジュールとなってきます。この時、立方体同士が接しない位置に作成してください。

パーツをGrasshopperにセット

  1. 作成したパーツをGrasshopperにセットしていきます。Geometoryコンポーネントにセットし、Meshコンポーネントを使用しメッシュ化します。
  2. Entwineコンポーネントで作成したメッシュをブランチごとに格納します。出力端子はSimplifyしておきます。
  3. Entwineコンポーネントの出力端子をGeometoryコンポーネントに接続しておきます。

モジュールの作成

  1. セットしたパーツをモジュール化していきます。まずはモジュール名のリストを作成していきます。
  2. 先ほど作成したGeometoryコンポーネントの出力端子に、Tree Staticsコンポーネントを接続しブランチのパスを取得します。List Lengthコンポーネントを接続し、ブランチのパスの数を取得することでパーツ数を取得します。今回は13が取得できるかと思います。
  3. SeriesコンポーネントList Lengthコンポーネントで取得した値をCountに接続し、0~12のリストを取得します。
  4. Concatenateコンポーネントで"module"という文字列と、0~12のリストを結合します。「module0, module1・・・module12」という感じで、モジュール名のリストが作成されました。出力端子をGraftしておきます。
  5. Construct Moduleコンポーネントを使用し、モジュール化していきます。入力端子MNに作成したモジュール名を、入力端子Gに前項で作成したパーツのリストを接続します。入力端子Ptには、各モジュールの中心点を入力しますが、次の項で作成していこうと思います。入力端子Bは基準平面を、入力端子Dはモジュールのサイスを変更したいときに入力します。今回はデフォルト値のままで。

モジュールの中心点を作成

  1. モジュールの中心点を作成していきます。詳しい説明は省きますが、1×1×1の立方体を作成し、その中心点を取得しています。パーツが収まっているGeometoryコンポーネントのリストと、中心点のリストの順番を対応させるよう注意してください。
  2. Graft Treeコンポーネントに各パーツが格納される立方体の中心点のリストが各々ブランチに格納されています。Construct Moduleコンポーネントの入力端子Ptに接続します。上画像の様に、モジュールが作成されたかと思います。
  3. Center BoxコンポーネントDeconstruct Brepコンポーネントを接続し、出力端子FaceにAreaコンポーネントを接続することで、立方体の各面の中心を取得しています。これは後々使用しますが、詳しくは後の項で説明します。

空のモジュール作成

  1. 空のモジュールを作成しておきます。Construct Empty Moduleコンポーネントを用意することで作成されます。
  2. Mergeコンポーネントで空のモジュールと先ほど作成したモジュールのリストを結合します。
  3. Flatten TreeコンポーネントFlattenしておきます。

モジュールを配置するSlotの作成①

  1. モジュールを配置するためのSlotを作成していきます。トーラス型に広がっていく街を作成していきたいので、立方体をトーラス型に配置していきます。
  2. Squareコンポーネントでグリッドを作成し、出力端子Pからポイントを取得します。
  3. Circleコンポーネントで作成したグリッドに内接する円を作成します。Circleコンポーネントに接続されているConstruct Pointコンポーネントではグリッドの中心点を作成しているので、Expressionx/2が入力されています。
  4. Scaleコンポーネントで作成した円を縮小します。

モジュールを配置するSlotの作成②

  1. Point in Curveコンポーネントで作成した2つの円、それぞれの内部に属する点を取得します。出力端子Rからは、0,1,2が出力されますが、0は円の外、1は円上、2は円内のポイントとなるので、Member indexコンポーネントで出力値が2のインデックスを取得します。
  2. List Itemコンポーネントで取得したインデックスのポイントを取得することで、円内に属するポイントを取得できます。List Itemコンポーネントの出力端子はFlattenしておきます。
  3. 2つの円内に属するポイントのリストが2つ(List Itemコンポーネントが2つ)あるかと思います、大きい円内に属するポイントから、小さい円内にも属するポイントのインデックスを、Member Indexコンポーネントで取得し、Cull Indexコンポーネントで取得したインデックスをリストから引くことで、2つの円の間に属するポイントを取得します。

モジュールを配置するSlotの作成③

  1. Liner Arrayコンポーネントで、先ほど取得したポイントのリストをZ方向に複製します。
  2. Construct Slot with All Modules Allowedコンポーネントに接続します。上画像の様に接続した点を中心とした、トーラス上に立方体が配置されたSlotが作成されます。

モジュール配置のルール作成 ①

  1. モジュール配置のルールを作成していきます。作成したモジュールのリストから、module9, 11, 12を取得します。この3つのモジュールは、地面に接してほしいので、そのような条件を設定します。
  2. Construct Rules At Boundaryコンポーネントに取得した3つのモジュールを接続します。各モジュールの面に0~5までの番号が振ってあるかと思います。このコンポーネントは指定したモジュールの指定した面が境界に接するように配置する、といった条件を設定します。今回は下面(5の面)が境界に接してほしいので、入力端子Cに立方体の下面を表す5を入力します。

モジュール配置のルール作成 ②

  1. Z方向のルールを2つ設定していきます。Typed Rule from Pointコンポーネントで設定していきます。このコンポーネントは、モジュールの各面の中心に配置した点で、接続してほしい点をセットすることで、条件を作成していくコンポーネントです。
  2. 1つ目はZ-coloumnというルール名で設定していきます。Pointコンポーネントにはmodule0, 1, 5, 6の5の面、module8の2と5の面、module9の2の面のポイントをセットしています。
  3. 2つ目はZ-dir-stairというルール名で設定していきます。Pointコンポーネントにはmodule2, 3, 4, 7の5の面、module10の2と5の面、module11の2の面のポイントをセットしています。

モジュール配置のルール作成 ③

  1. 否定のルールも作成していきます。今回は、emptyモジュールは、最下面に来ないようにするルールを設定していきます。
  2. とりあえずConstruct Rules At Boundaryコンポーネントでemptyモジュールの5の面が境界に接するという条件を作成します。後ほどこの条件を非許可していきます。

モジュール配置のルール作成 ④

  1. 作成したルールをまとめていきます。Mergeコンポーネントで最後に作成した否定の条件以外をまとめてFlattenします。
  2. Indifferent Rules for unused Connectorコンポーネントの入力端子Mにすべてのモジュールを接続し、Rに先ほどMergeコンポーネントでまとめたルールを接続します。これで、何もルールが設定されていない面はどこにおいてもよい、というルールが作成されました。
  3. Mergeコンポーネントでまとめます。
  4. Collect Rulesコンポーネントを用意します。入力端子Mにすべてのモジュールを接続します。入力端子RAには許可する条件、RDには非許可の条件を接続します。これでモジュールを配置するルールの設定が完了しました。

モジュールの配置

  1. Monoceros WFC Solverコンポーネントを使用し、作成したモジュールをSlotに配置していきます。入力端子Sに作成したSlotをFlattenして接続します。
  2. 入力端子Mにモジュールを接続します同様にFlattenしておきます。
  3. 入力端子SにはSeed値を入力するので、Number Sliderコンポーネントで整数を接続しておきます。
  4. 入力端子Rには先ほど作成したモジュールを配置する際のルールを接続します。
  5. 計算結果が問題なければ、Slotが緑色になります。
  6. Materialize Slotsコンポーネントで計算結果を可視化します。
  7. Custom PreviewコンポーネントColour Swatchコンポーネントで色付けして完成です。
  8. Slotを作成した際に、作成したグリッドの数(Squareコンポーネントに接続されているNumber Sliderコンポーネント)の値を変化させることで、最初のGif画像の様な挙動をします。アニメーションにしたい方はNumber SliderコンポーネントのAnimate機能を使ってみてください。

完成

以上で完成になります。前回の記事でも、Monocerosを使用した別のチュートリアルを作成しています。ご興味ある方は以下のリンクからのぞいてみてください。

【参考】

-GH Basics, GH Tutorial, Grasshopper, Objects
-, , , ,