GH Basics GH Tutorial Grasshopper Objects

【Grasshopper Tutorial】 Pipe Connection using Monoceros

今回はWFC(Wave Function Collapse)アルゴリズムをGrasshopperで使用できるMonocerosというプラグインを活用していこうと思います。Wave Function Collapse algorithm と検索すると、無限に生成される街など、面白い作品がたくさん出てくると思いますので、興味ある方は是非調べてみてください。そのアルゴリズムを使用し、上の様なパイプのモジュールを特定のルールに基づいて配置していきます。今回はパイプの断面同士が常に接続され、下のGif画像の様に常に閉じたパイプが生成されるようなルールを設定していきます。事前にMonocerosのプラグインをこちらからインストールしてから望んでいただければと思います。完成版のプログラムはGithubにプッシュしてあります、こちらからダウンロードできます。こちらのチュートリアルは動画化しております、動画の方がよい方は以下のリンクからどうぞ!

概要

上画像がプログラムの全体像となっております。

パーツの作成

  1. まず初め配置していくパーツを作成していきます。今回は上画像の様なパイプをRhinoceros上で22パーツ作成しました。パイプのモデルは私のGithubからダウンロードできます。作成が手間なので、こちらからダウンロードして是非利用してください。
  1. 作成する際、上画像の様に、1×1×1の立方体に納まるように作成しています。この立方体1つが1つのモジュールとなってきます。また、各パイプの断面の中心は、立方体の各面の中心と一致するように配置しております。

パーツをGrasshopperにセット

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

モジュールの作成

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

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

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

空のモジュール作成

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

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

  1. モジュールを配置するためのSlotを作成していきます。今回は7×7×7のグリッドを作成しConstruct Slot with All Modules Allowedコンポーネントに接続します。上画像の様な立体グリッドが作成されると思います。この時、作成したモジュールと被らない位置にSlotを作成します。

モジュールの配置

  1. Monoceros WFC Solverコンポーネントを使用し、作成したモジュールをSlotに配置していきます。入力端子Sに先ほど作成したSlotをFlattenして接続します。
  2. 入力端子Mにモジュールを接続します同様にFlattenしておきます。
  3. 入力端子SにはSeed値を入力するので、Number Sliderコンポーネントで整数を接続しておきます。
  4. 入力端子Rにはモジュールを配置する際のルールを接続するので、ルールを作成していきたいと思います。
  5. Indifferent Rules for unused Connectorsコンポーネントを用意し、作成したモジュールを接続します。このコンポーネントはどこにどのモジュールをおいてもいい、というルールとなってます。とりあえずこのルールを接続し動作確認してみます。計算結果が問題なければ、Slotが緑色になります。
  6. Materialize Slotコンポーネントで可視化します。入力端子Mにモジュールを、入力端子SにMonoceros WFC Solverコンポーネントの出力端子Sを接続します。
  7. 上画像の様にモジュールがランダムに配置されていればOKです。Seed値を変更しパターンを変えてみてください。

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

  1. モジュール配置のルールを作成していきます。ルールというのは、立方体のどの面とどの面が隣り合ってよい、もしくは悪いというのを設定していきます。
  2. 「モジュールの中心点を作成」の項目で、各立方体の中心点を取得したかと思います。これらをBakeし、Rhinoceros上で扱えるようにします。
  3. 今回はType Rule from Pointコンポーネントを使用してルールを設定していきます。このコンポーネントは、立方体各面の中心点を指定することで、指定した点同士は隣り合うことができる、というルールを作成するコンポーネントです。入力端子Mにモジュールを接続します。
  4. まずは垂直方向のパイプの接続について設定していきます。 入力端子Tにルール名を入力します。今回はVertical-joint01としています。
  5. Pointコンポーネントを用意し、パオプ断面が垂直に向いている面の中止点をセットします。例えば、module0の②・⑤の面やmodule4の②・⑤、module15の⑤面などです。これらの面は上下方向に隣り合うことを許容します。
  6. 2つ目のルールを作成します。ルール名をHorizontal-joint01としました。モジュールの面①・④がパイプの断面となっている面の中心点をセットします。
  7. 同様に3つ目のルールを作成します。Horizontal-joint02というルール名とし、モジュールの面⓪・③がパイプ断面になっている面の中心点をセットします。
  8. Mergeコンポーネントで作成した3つのルールを結合して、出力端子をFlattenします。前項で作成したIndifferent Rules for unused Connectorsコンポーネントの入力端子Rに接続します。こうすることで、隣にどの面が来てもいいですよというルールについて、ルールがが設定された面に関しては間引かれます。
  9. MergeコンポーネントIndifferent Rules for unused Connectorsコンポーネントの出力端子と3つのルールを結合してFlattenしSolverに接続します。
  10. 正しく設定されていれば最初のGif画像の様に、Seed値を変更しての常にパイプが閉じた状態で配置されるかと思います。

完成

以上で完成になります。Seed値を変更してパイプが常に閉じていれば成功です。こちらのリンクから、Monocerosを使って作成された作品を見ることができます。工夫すれば色々できそうなので、是非深堀してみてください。

【参考】

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