2021年7月18日日曜日

【Grasshopper_44】パスの仕組み、考え方を初学者向けに解説してみます

Grasshopperの操作方法を習得する上で最も躓きやすい個所がパスの仕組みの理解かなと思います。また、望むような形状ができない理由も、パスの設定が間違っているケースが多々あります。

このパスの仕組みは、いかにもプログラミング的な部分でもあり、理系の高校とか大学で数学の勉強をしていたり、プログラミングを経験した方ならば「あー、なるほどね」となるところが、文系出身の方だと頭の中に?マークが何個も並ぶようです。

ですが、決して難しいものでもなく、一度理解してしまえば応用力がかなり身につく部分でもあるので、どうすれば理解がしやすいか、試行錯誤も兼ねて解説してみようと思います。

1.PCのフォルダ構成に例える

・PCでフォルダを使ってデータを整理する状況をイメージしたものが上の図です。
・フォルダの中に、さらにフォルダを作り、その中に実際のファイルを格納するのが一般的かなと思います。

・PCのファイルは、キーボードを使って自由に名前をつけることができますが、プログラミングの世界ではファイルそのものに名前付けができないので、0からスタートする番号が自動で割り振られます。
・たとえば上の図のようなイメージになります。一種の識別番号みたいなものです。


・Grasshopperのファイル構造との比較です。PCのフォルダの階層に相当するのがパスと呼ばれ、上の図の黄色いパネルの右肩にある、{0}とか{1}で表す数値です。
必ず{}でくくり、階層が増えると数字の間に;を加えるのが書式となっています。
・フォルダの中身のデータに割り振られる番号に相当するのがインデックスと呼ばれるものです。パスと同様、0から順番に割り振られます。

以上の仕組みにより、パスの番号とインデックスの番号がわかれば、すべてのデータにアクセスできるということになります。

PCの場合だと、マウスをクリックするだけでお目当てのデータにたどり着きますが、Grasshopperではパスやインデックスの番号をノードエディタ上で指定したり、番号を加工することが必要になってくるため、そのあたりがややこしい部分です。

ちなみに、PCで資料を探すとき、フォルダの階層が深すぎてなかなか見つからず、クリックするのが面倒だった経験はありませんか?Grasshopperでも、パスの階層はなるべく浅くしたほうがトラブル時の対処がやりやすくなります。

2.パスの階層は混在させず、なるべく浅くするのが基本


上の図はMergeコンポーネントの出力結果に、三つの深さが異なるパスが混在している事例です。
同じくフォルダ構成の図にすると以下のような感じです。
このようになってしまうと、データが格納されているパスの深さが三種類に分かれてしまっており、この後の処理でおかしなことになる可能性が大きいです。

よって、パスはなるべく混在させず、かつなるべく浅くする(この事例でいくと、なるべく一番左のように{0}だけにまとまる)ことが大事です。

ちなみに、パスが混在してしまった場合ですが、その該当するコンポーネントよりも手前にあるコンポーネントの組み方がおかしい場合がほとんどなので、混在に気づいたら、その手前のコンポーネントの中身をパネルで表示して修正を加える必要があります。

そこで、パスの階層をなるべく簡単に、シンプルにまとめる方法を以下にまとめてみます。

3.simplifyを使う


上の図はsimpifyを使った事例です。

コンポーネントの出力の文字表記の上(上の事例では、MergeコンポーネントのR文字の上あたり)でマウスを右クリックするとこの機能を選択できます。この機能は、データが格納されていない、空白のパスを除去してくれる機能です。

この動作をフォルダ構成図で示すと以下のような感じです。

一番上の0フォルダにはデータそのものが無く無駄となっているため、これを除去すると階層が1段減ってシンプルになります。

階層が無駄に深いと計算をミスする可能性が高まるので、simplifyの設定はあちこちで多用したほうがいいです。

4.状況に応じてパスの深さを合わせる

点と点を使って線を引いたり、4点の座標を使ってサーフェスを張る、といった場合、それぞれの入力のコンポーネントは基本的にはパスの深さを合わせるのが基本です。

ここがおかしくなると、結果もおかしくなってしまう事が多いです。
以下は一例です。


単純に上下の点と点を線でつなげる場合ですが、上の点のパスが{0;0}、下の点のパスが{0}から{9}まで分かれています。

上の図のような結果をあえて意図していた場合はこの組み方が正しいんですが、大抵の場合、両者のパスの深さは合わせるのが基本です。


上の図は、下側のパスと同じになるよう、上側の点のパスにGraftを設定し、1段深くした場合です。両者とも同じパスの深さになったため、それぞれのパスにある点どうしを線で結ぶという結果になります。

または、以下のように下側の点のパスを上側の点のパスの深さに合わせる方法もあります。

線を結ぶ場合はどちらの合わせ方でもOKですが、コンポーネントの種類によっては個別にパスを分けないとダメなものもありますので、そのあたりは実際に試しながら研究してみてください。

いずれにしても重要なのは、入力コンポーネントどうしのパスの深さを合わせるということです。

5.flattenとgraftを使ったパスの変更

次に、パスの深さを変えるための方法の紹介です。
最初はflattenです。これは、パスの深さを全部0にするものです。

上の図ではMergeコンポーネントにflattenを設定した事例です。どんなに階層が複雑でも、すべて{0}にまとめてくれます。


ちなみに、flatten適用前の、データの順番は、flattenを適用後も維持されます。
上の図の場合、1フォルダのデータが11、2フォルダのデータが12にインデックスが振りなおされて{0}にまとまる状態を示しています。

よって、データの順番が正しいことが事前にわかっている場合はflattenを使っても問題ないことが多いです。逆に、データの順番がおかしい時は、flattenを使ってもおかしいままとなります。

次に、graftです。

mergeコンポーネントの出力が{0}に対し、graftを設定することで{0;0;0}から{0;0;19}までパスが深くなり、さらにsimplifyで無駄なパスを省いて{0}から{19}にしたものです。

graftはパスの階層を1段深くするものなので、パスの階層合わせの時に、flattenとともに頻繁に使います。

6.path mapperの紹介

この機能は、graftとかflattenをもっと柔軟に設定しやすくしたものです。大抵の場合はgraftやflatten、simplifyの組み合わせで十分なんですが、ごくまれにそれだけでは実現できない場合があり、そんな時に重宝する機能です。


例えば上の図のように、パスが{0;0}から{0;19}まで分かれている状態を{1;1}から{1;20}に変更する場合を考えます。

計算上では、パスの左と右の数字にそれぞれ1を足せば、望み通りのパスになることがわかります。そんな時、path mapperコンポーネント上でダブルクリックし、以下のような立ち上がったウィンドウに簡単な数式を記入してOKボタンを押します。

パスの左側の数値の変数をA、右側の変数をBとして、各々に1を足すという設定です。

このように、簡単な数式を使って自在にパスの階層を操ることができるので、どうしても困ったときはこれで解決できます。

7.インデックスの指定の仕方


リストの末尾のインデックス番号を指定するとき、直接、番号を指定する方法もありますが、-1を指定することもできます。

リストの長さが変わっても、末尾を-1で指定することが可能なので頻繁に使います。また、末尾から2番目のインデックスは-2、3番目は-3というような感じです。

最後に、まとめです。
・結果がうまくいかないときはパスの階層を疑う。
・動作が怪しいと思ったコンポーネントはすべての個所で、出力のところにパネルをつなげて中身を確認する。
・入力コンポーネントが複数ある場合、階層を合わせるべきところはgraft、flatten、simplifyを組み合わせてパスを修正する。

以上、簡単なパスの仕組みの紹介でした。

まだまだ不十分な点があると思いますので、気が向いたら更新していきます。

0 件のコメント:

コメントを投稿

【Grasshopper_105】三角形の中に円を敷き詰める方法

今年もいよいよ残すところあと1カ月を切りました。今年最後の投稿となりますが、三角形の枠の中に円を敷き詰めるサンプルの作り方を書いてみたいと思います。三角形が正三角形に近いほどドットの間隔が一定になります。面積がバラバラだと密度の濃淡が出てしまうので調整が難しいかもしれません。