vicc blog

株式会社ヴィックの技術ブログです。

Metahopperを利用したモデリングアルゴリズムを考えよう

こんにちは、新入社員の篠原です。

みなさんはMetahopperというGrasshopperプラグインはご存じですか?
Meta (高次の) + (Grass)hopperなので、Grasshopperを神の視点から操るためのツールです。そのため、今回は抽象的な思考が必要になるので、Grasshopperにある程度慣れ親しんだ方を対象としています。

AMDlabさんの以下のブログが導入として分かりやすいので、全く知らないという方はこちらをまず読んでいただくのがいいかと思います。

amdlaboratory.com

建設プロジェクトでは大量の形状情報を扱います。これらを仕分けたり取り扱いやすくするために、形状の幾何学的な情報に対して、属性情報と呼ばれる文字情報を込めることが多いです。
Rhinocerosでは、レイヤ名や表示色、属性ユーザーテキストなどが属性情報にあたり、これらを便利に扱うことができますが、Grasshopperではそうはいきません。

また、Rhinocerosでの属性ユーザーテキストの扱いについて以前ブログにまとめました。属性情報に不慣れな方はぜひご確認ください。

blog.vicc.jp

DataTreeを駆使することで情報をまとめようとすることは可能ですが、DataTreeは理解するのに難しい概念だとされているので、アルゴリズムの美しさを損ねてしまいかねないです。

そこで、Metahopperを使ったアプローチを別解として手札に持っておくと、こうした困難に対していつか役に立つことがあるかもしれません。今回は、建築モデリングの一部を具体例として取り出して説明します。

Metahopperの基本的な使い方

具体例を確認する前に、このプラグインの代表的な使い方をふたつ確認します。

Get Connected Objectsコンポーネントについて(Metahopper)

Metahopperを応用したアルゴリズムを作りこんでいくにあたり、痒い所に手が届くGet Connected Objectsコンポーネントが便利です。
このコンポーネントは、入力グリップに繋がっている、キャンバス上のオブジェクトそのものを返します。下図では、入力のPanelを取得しています。
Grasshopper.Kernel.Special.GH_PanelというのはPanelの正式名称です。

入力のPanelの中身は、Get Param DataコンポーネントやParam Infoコンポーネントなどで取得されます。

アルゴリズムの繋がりを辿る(Metahopper)

下図では、Concatenateコンポーネントを使った文字列の連結アルゴリズムに対して、Metahopperを応用しています。

Get Connected Objectsで取得しているのはConcatenateコンポーネントであり、その入力(Inputs)から左向きに繋がっているPanelの中身を、先ほどの手順と同様に取得できます。左向きに繋がっているものをSources、右向きに繋がっているものをRecipientsといいます。

具体例(アルゴリズム):建築外周でマリオン位置を決める

作りたいアルゴリズム

建築外装のためのマリオンの配置をします。配置したい形状は決まっていて、折れ曲がった箇所にはangledを、その他の箇所には等間隔にstraightを配置します。

作ったアルゴリズム

完成したデータはこのようになりました。
作成したRhinoファイルとGrasshopperファイルは以下のリンクカードからダウンロードしてください。

github.com

今回使ったコンポーネントは以下の通りです。

  • Get Connected Objects
  • Get Groups
  • Get Objects in Group
  • Object Info
  • Param Info
  • Get Param Data
  • Unwrap List

次に、アルゴリズムの説明をします。

手順1:配置する位置を決める

ここでは単に幾何学情報を整理しています。

angledについて、どの程度の角度なのかをここで計算します。

straightとangledそれぞれで、関係ある情報をGroupでまとめ、Get Connected Objectsコンポーネントに繋ぎます。
下図のように、Plane以外はどこにも繋ぎません。

手順2:位置の特徴から形状を指定する

Get Connected Objectsコンポーネントで取得したオブジェクトの位置(Pivot)で、そのオブジェクトが所属するGroupを取得します。

取得したGroupから、計算した角度をGet Param Dataコンポーネントで取得し、形状を指定します。

手順3:形状の幾何データを参照し、配置する

手順1の最後に繋いだGet Connected Objectsコンポーネントで取得したオブジェクトの中身をGet Param DataコンポーネントとUnwrap Listコンポーネントで取得します。

下図左下にあるように、このDataTreeと、手順2の最後で取得した形状指定情報のDataTreeの構造を、Longest Listコンポーネントなどで合わせます。

赤枠内Geometryパラメータでは下図のようにニックネームを決めます。
形状指定のデータで対応するGeometryパラメータを参照し、その中身をOrientコンポーネントで配置します。

手順4:集計する

手順3の最初で取得したPlaneの東西南北の位置を、所属する外周線の属性情報から取得します。

この位置の情報をもとに、手順2の最後で取得した形状指定情報を仕分け、内訳を数え上げます。

DataTreeを使ったアルゴリズムとの比較

比較のために、DataTreeでアルゴリズムを組み立てた例を作りました。ぜひダウンロードファイルで確認してください。

github.com

DataTreeを使ったアルゴリズム

 

Metahopperを使ったアルゴリズム

今回紹介したMetahopperの応用の特徴は、今回の例の場合で、「角度」のような情報を増やしていっても、Groupにまとめるだけで事足りるので、アルゴリズムのメンテナンスに便利です。

一方で、Metahopperを使わずともこのように十分解けるので、今回紹介した方法を手札の一つとして持っておくといいかと思います。

おわりに

今回は神の視点から考えるアルゴリズムについて確認しました。

左から右に巡回せずに情報を流すというのがGrasshopperの基本的な考え方であり、Metahopperの応用ではこのルールに抵触しうるため、欠陥をなくすためには慎重な作業が必要です。しかし、慎重な作業さえすれば、便利な考え方だとも思います。

ヴィックでは、さまざまなアプローチで問題解決に取り組んでいます。何か直面している問題があれば、ぜひ一度お問い合わせください。

vicc.jp