Grasshopperでアルゴリズムを組む際、意図しない形でアルゴリズムが働くことがあります。そういった時、多くの場合はデータ構造が正しく作られていないことが原因となります。
このページは、[データの働き方 – 基礎]の続編になります。未読の方は、先にそちらの内容を確認いただけたらと思います。
以下、応用編の内容を、順を追って確認してみたいと思います。
[Rotate]を使い、Geometryに入力したデータをAngleで指定した値だけ、回転するアルゴリズムを作りたいと思います。
[Set Multiple Breps]でRhinoのポリサーフェスを5つまとめて読み込み、0度、30度、60度、90度の4つの角度まで回転します。ここでのコンポーネントの表記は、Display>Draw Full Names オプションを付けて表示しています。
参照:読み込みの方法
参照:ラジアンではなく角度で指定するDegreesオプションに関して
アルゴリズムが完成したので、回転の予測と結果を確認してみます。
原点を中心に回転しているようなのですが、最初に予測した[読み込んだデータをまとめて0度、30度、60度、90度の値に回転する(左)]というものとは違った結果(右)で処理されています。
この現象はバグが起こっている・処理がおかしいのではなく、[データの働き方 – 基礎]の内容で説明がつきます。
基礎のルールとは、
- データのインデックス(並び)順に、コンポーネントの処理が行われる
- データの数が異なり、足りなくなった時は、最後のデータで代わりに処理をされる
というものでした。
[Panel]を繋いで確認すると、5個のアイテムを読み込んでいるため、0から4までインデックスが振られています。また角度は0度、30度、60度、90度の4つなので、0から3までインデックスが振られています。
つまり基礎のルール通りに、0度-0番を、30度-1番を、60度-2番を、90度-3番と4番を回転するアルゴリズムになっているということになります。
この場合は、基礎に加えもう少し詳しいルールを踏まえることで、アルゴリズムを修正することが可能です。
そのルールとは何かというと、
- データが階層を持っている場合、階層同士が上から順にペアとして組み合わせられる。ペアとなった後の働きは、[基礎]で説明したものと同じ。
- ペアとなる階層が足りなくなった時、最後の階層がペアとして働く。
というものになります。
〇階層とは?
階層とは、データを管理するフォルダのようなものになります。[Panel]コンポーネントに接続することで、{0;0}のような形式で確認できます。またインデックスは、階層ごとに0から昇順で振られていきます。
インデックスを出席番号に例えると、階層は1年1組のようなクラスの名前と考えると理解しやすいかもしれません。
下記の足し算の例を確認してみたいと思います。
まず一番上の階層同士がペアとなります。データが一つずつなので、10+5が行われ15が出力されます。次に一つ下の階層同士がペアとなります。まず0番のインデックス同士の20+7が行われ27が出力。次に1番のインデックス同士を足そうとしますがデータの数が足りないため、最後のデータ7が代わりに足し算され30+7が行われ37が出力されます。
下は入力した文字を結合する[Concatenate]の例です。アルファベットに階層が2つ、数字に階層が1つあります。まず上の階層同士がペアとなり、A-1,A-2,A-3が出力されます。次の階層同士がペアとなりますが、数字には1つしか階層がないため最後の階層が代わりに働き、B-1,C-2,C-3が出力されます。
階層が増え、複雑になった時も理屈は変わりません。
階層同士が上から順にペアとなり、インデックス順に処理がされます。データが足りなくなったときは最後のインデックスのデータが代わりに処理されます。またペアとなる階層が足りなくなった時、最後の階層が代わりにペアとして処理されます。
では以上の応用のルールを踏まえて、最初のBrepを回転するアルゴリズムを確認してみます。
結論から言うと、Brepないし角度の入力にGraftオプションを付けることで、アイテムごとに階層を作ることができます。その状態で[Rotate]に繋ぐことで、最初に意図していた[読み込んだデータをまとめて0度、30度、60度、90度の値だけ回転する]アルゴリズムに修正できたかと思います。
参照:Graftの詳細
このように、アルゴリズムが自分が意図する形に合わせて、データ構造を修正することができます。
このページでお伝えした内容はGrasshopperでアルゴリズムを作成する際、おそらく一番問題や間違いが起こりやすい箇所かと思われます。
是非、内容を確認いただき、ご理解・ご活用頂けたらと思います。
補足1:理由はよくわからないけど、とりあえずGraftをつけてしまった場合、それ以降の箇所で問題が起こる可能性があります。また下の失敗例では2か所にGraftを付けたことで、最終的な作成されるジオメトリがGraftをつける前と同じになってしまいます。
Grasshopperに慣れてない方ほど、データを[Panel]で確認しない傾向にあるかと思われます。コンポーネントが意図しない動作をしたときは、コンポーネントに繋いだデータをすべて[Panel]につないで、中身を確認するのが、アルゴリズムを作成する上での近道となります。
補足2:また上記の様な現象は、複数のデータ同士を処理する際、よく見られます。
下図はX方向に配置した球を、Y方向にそれぞれ配置しようとしたアルゴリズムです。
理屈は同じなので割愛しますが、データにGraftを一か所つけることで修正可能です。
補足3:[基礎][応用]でお伝えした内容は、実際はデータがひとつずつ(正確には入力端子にItemが設定されている時)の処理内容となります。
より深くデータ構造を理解されたい方は、下記リンク内にMcNeel社(開発元)の公式資料を弊社で日本語訳したものがございます。併せて参考にしていただけたらと思います。
マニュアル・チュートリアル ダウンロード [Grasshopper: Essential Algorithms and Data Structures 日本語版]