vicc blog

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

anemoneで始める再帰処理

はじめまして。小野田と申します。

突然ですが、みなさんはRhino+Grasshopperを使っているとき、 同じ処理を繰り返したいな、と思ったことはありませんか? 例えばこの巻貝の断面のような図形。

Fibonacci Spiral

この渦巻きはフィボナッチ数列

1,1,2,3,5,8,13,21,34….

という具合に、2つ前と1つ前の項を足していくことでできる数列を 半径にした円弧を組み合わせて作られている、よく再起処理の例で挙げられる図形です。

このように、なにかひとつ前の処理の結果を用いて、同じ処理を繰り返し行いたいというとき、 Grasshopperではどうやればいいのかというのが、Grasshopperを始めてみた人が初めて(?)ぶつかる壁のひとつだったりします。

結論から言ってしまうと、上のような繰り返し処理はPython等で実装できます。 しかし、Grasshopperユーザーの中にはPythonやらC#やらがなんのことだかさっぱり・・・ Grasshopperだけで脳の容量一杯じゃ何とかしてくれ・・・という方もいるかと思います。

今回はそんな方でも安心の、Grasshopperで繰り返し処理が書けるプラグイン、anemomeの使い方を備忘録的にまとめてみました。

例題

ということで、早速使ってみましょう。 今回紹介するにあたって、こんな形を作ってみたいと思います。

完成イメージ

この樹木っぽい図形を作りはじめる前に、そのつくり方のイメージをなんとなく書いておきます。

  1. ある線の端点からある角度で枝分かれする
  2. 枝分かれした線の長さは、枝分かれする前の線の長さから一定値短くなる
  3. 枝分かれの回数がある数の倍数の時、枝分かれの本数が変わる
  4. 枝の長さが一定以下になったとき、処理を終了する

だいたいこんな感じで作ろうと思います。 この先説明が長いので、読むのが面倒だったり結果だけ知りたい方はStep4まで読み飛ばしてください。

では、まず繰り返しの中身を書いていきます。

まず枝分かれのもとになる1本目の枝を直線でつくり、その終点から枝分かれする2つ直線を作ります。 枝分かれした直線は枝分かれする前の直線の軸線から一定の角度(今回はおもむろに20°にしました)で折るようにし、枝をのばす方向はランダムにしてみましょう。また、枝分かれした直線の長さは枝分かれ前の直線の長さからちょっと短くします。

枝分かれの図解

図にするとこんな感じです。今回は、1本目の枝の長さをおもむろに1000mmとして、枝分かれした直線はそこからまたおもむろに100mm短くなるようにしてみました。 続いて、今回の肝になるanemoneを仕込んでいきます。

anemoneのコンポーネント、「Loop Start」と「Loop End」をStep1でつくった枝分かれする処理を挟み込むように繋げます。何が何だかよくわからないと思いますが、この2つのコンポーネントの使い方はざっくりこんな感じです。

  1. Loop Startの「>」とLoop Endの「<」を繋ぐ
  2. Loop StartのRepeatに繰り返したい回数(カウントは0からスタートなのでここに入れた数値+1回繰り返される)を入れる
  3. TriggerにButtonを繋ぐ(Trueにすると繰り返しがリセットされるので、処理を修正した内容を反映する時等に使います)
  4. Dataの数をLoop Start とLoop Endでそろえる

Data、D1、 D2…は繰り返しに使いたいデータを入れます。 繰り返しが1回目のときはLoop Startに入力したデータがLoop Startからそのまま吐き出され、2回目以降のときはLoop Endに入力したデータがLoop Startから出力されます。

それっぽいのができた!

うまく繋げられると、Loop Endの出力端子から枝分かれした直線が吐き出されていると思います。 もし繰り返し結果の全体が表示されていないようでしたら、Loop Endを右クリック→Record dataにチェックを入れてください。そうすることで、繰り返し結果が全て出力されるようになります。

一気に樹木っぽくなりましたね。 しかし、よく見ると枝の先端あたりで枝があらぬ方向にのびてしまっているのがわかります。 これは繰り返しの結果、枝の長さが0以下の値になってしまい、直線の方向が逆転してしまったことによるものです。

枝がなんか変・・・

これを解決するために、次は繰り返しの終了条件を追加していきましょう。

終了条件を設定するのは意外と簡単です。 Loop Endの入力端子に、Exitというものがあります。ここにTrueが入るとそこで繰り返しが終了するようになっています。 そこで、今回は枝分かれした直線の長さを測り、それが80mm未満のとき、Trueが入力されるようにしてみました。

終了したいときにTrueになるようにしてをExitに挿す!

これで、Repeatに入れる数値をどれだけ大きくしても、枝の長さが一定値以下になったら繰り返しが終了するようになりました。

枝分かれのエラーが解消された!

さて、大分らしい樹木になってきましたが、何だか枝ぶりが貧相なので、部分的に枝分かれの数を増やしてみようと思います。

実はLoop Startのcounterからは、繰り返しごとにそれが何回目の繰り返しかカウントが出力されています。(数値は0からスタート)

Loop StartのCounterを使いましょう

こいつを使って、カウントが3の倍数の時、Stream Filterを使って枝分かれの数を2→5つへ増やしてみましょう。

Stream Filterを使って、カウンターで枝分かれの数を変えます
立派な樹木を手に入れた!

これで、大分立派な樹木ができましたね。 拡大してみると、繰り返しが3の倍数のときちゃんと5つの枝分かれになっているのが分かります。(↓画像の青いとこ)

カウンターの数が0,3,6のところの枝分かれの数が増えた

以上で完成です。お疲れ様でした。

まとめ

長くなりましたが、anemoneを使った再帰処理のご紹介でした。

今回は再帰処理である種、王道な樹木のモデリングを行いましたが、 弊社が行っているような生産設計BIMでは、形状の最適化やデータの書き出し等でも再帰処理は大活躍しています。

例を挙げると、こちらの書籍で紹介されている形状の最適化は、大きなサーフェスを許容できる曲率になるまで部分ごとに小さなサーフェスに分割していくロジックを、anemoneで実装しています。

Parametric Design with Grasshopper 増補改訂版 建築/プロダクトのための、Grasshopperクックブック 石津優子 (著), 堀川淳一郎 (著)

複雑な形状の大きなサーフェスをつくるとき、実際にそれを鉄板なり木材なりで製作するときは様々な製作条件を満たすように面を分割したりすることが必要になってきます。 そのようなとき、機械の力を借りるために再帰処理は切っても切れない存在なのです。

こちらの書籍、その他の作例も色々載っててとても参考になりますので、興味のある方はぜひ読んでみてください。

pythonを使い慣れている方は、anemoneを使わずともpythonを使った方がより複雑で高度な繰り返しを実装できるかもしれません。

しかし、anemoneを使うことでGrasshopperで仮組した処理をダイレクトに再帰処理化できたり、Grasshopperを使える人なら誰でも使用できる、単純な処理であればさっと実装できる等、ビジュアルコーディングならではの利点もあるのではないでしょうか。

この記事を読んでいただいた方のひとつの引き出しとして、より効率的で楽しいものづくりの一助になればと思います。

今回のサンプルファイルはこちらにアップしております。 それではまた。