2019年4月7日日曜日

【Grasshopper_19】Grasshopperプラグイン「Anemone」を使ったループ処理の仕方


プログラミングでおなじみの、for文を使った繰り返し処理ですが、GrasshopperではHoopsnakeやAnemoneという外部プラグインを導入することで、同じ作業を構築することができます。


今回はAnemoneの使い方を練習するため、こちらの本のサンプル集に記載されている、Pythonスクリプトで木を作る内容と同じアルゴリズムを実装してみました。

Anemoneのデータは以下のリンクから取得できます。

Step.1 根元の幹の、始点と終点を作成

・今回のケースでは、スライダーを5個、事前に用意します。
 調整可能なパラメーターは、一本目の枝の長さ、枝を増やしていく際の長さの縮小割合、半径の縮小割合、枝をランダムに伸ばす方向に回転させる角度、最初の幹の半径です。
・2番目の点を、原点からZ方向に50mmの位置に設定します。1本目の幹の長さになります。

Step.2 1本目の幹のサーフェス

・Step.1で求めた2番目の点と原点の間に直線を引き、pipeコンポーネントでサーフェス化します。半径は5.0に設定。
・2本目の幹以降、2本ずつ枝を伸ばして行くので、乱数を2つ作成します。

Step.3 その他のつなぎ方

・残りは上の図のようにつなぐとうまく作動すると思います。
・幹を二本、それぞれ伸ばす方向(角度)は固定値とrandomコンポーネントで生成します。
・計算回数は、左上のRepeatスライダーで調整します。
・左上のBooleanトグルは、計算のON/OFF切り替え用です。

Loop Start~End間の考え方

言葉で書くと以下のようになります。
1.幹の始点(D0)から終点(D1)までのベクトルを求め、終点にPlane Normalコンポーネントを使って平面を作成します。

Loop Start直後のD0およびD1については、計算回数が増えるにつれ階層別に区分けする必要がありますので、Graft設定にします。

2.求めたベクトルを2回、回転させます。1回目の回転軸は、1.で求めた平面を分解したX軸、2回目の回転軸は1.で求めたベクトル自身です。1回目の回転角度は20°(固定値)、2回目の回転角度は乱数で求めた値を使用します。

乱数は二つあるので、ベクトルが二つ作成されます。

3.Line SDLコンポーネントを使い、幹の中心軸を作成します。始点はD1、方向は2.で求めたベクトル、長さは1.で求めた、始点~終点間距離に縮小率をかけ合わせた数値です。

4.3.で求めた中心軸の周りにPipeコマンドで面を張ります。半径は、D2に縮小率を引き算した数値です。

5.Loop Endコンポーネントへのつなぎ方は、求めた中心軸の始点と終点が次の計算回における始点と終点になるのでEnd Pointsコンポーネントで取り出した値をD0とD1につなぎます。半径も次の計算に使うので、D2につなぎます。

6.Pipeコンポーネントで求めたサーフェスは、Mergeコンポーネントの出力をD3につなぎます。

Step.4 計算終了後

・計算が終わったあと、Mergeコンポーネントからサーフェスを取り出します。

・Loop Start~Loop End間はデータが回を追うごとに更新され、以前の計算回のデータは破棄されます。最終的には幹のサーフェスデータについてはすべての計算回におけるサーフェスが必要になるので、Flattenで平坦化し、Mergeコンポーネントで順次、追加していくように設定します。

実際に使用した際の感想ですが、Graftの設定やMergeコンポーネントをうまく使わないと望む結果につながらず、バグFIXに時間がかかるかもしれません。Pythonで組んだ方がお手軽ですが、どうしてもビジュアルプログラミングにこだわる人向けかなと思います。

0 件のコメント:

コメントを投稿

【Grasshopper_98】SporphとSurface Morphingの特徴、違いなどについて

今年もまたGWに突入しましたね。コロナ明けに円安、インバウンド特需のおかげで東京から郊外に出かけると例年以上に混雑に巻き込まれそうなので、昨年と同様、連休中は家に籠ってブログを更新します。今回のテーマは、Surface MorphingとSporphの違いについてまとめてみました。