以前のブログにも掲載した作り方を少し改良するだけですが、復習も兼ねて、最初から簡単に作り方を紹介したいと思います。
六角形の粗密な形状を作る際には物理演算としてよく使われる、Kangarooが必要となります。GrasshopperではKangaroo1とKangaroo2の2種類が存在しますが、ここではKangaroo1の方を使っています。
Step.1 六角形を配置する範囲を決める
・Rhino上でパターンを配置する四角形の曲線をXY平面上に適当な大きさで作り、Grasshopperに取り込む。Step.2 六角形を敷き詰める
・Hexagonalコンポーネントを使い六角形を適当な大きさ、適当な数で作成する。・同時に、Step.1で作成した四角形との共有部分をRegion Intersectionコンポーネントを使って取り出し、Brep Edgeコンポーネントにつないでばらばらの直線に分解する。
Step.3 アンカーポイントと目標長さを求める
・少しややこしい部分ですが、上の図のように組んでいきます。・上段の紫色のエリア内は、アンカーポイントを作る部分です。変形させたとき、全く動かさない(がっちり固定する)部分となります。Step.2でばらばらに分解した直線の端点をすべてremoveDuplicatePtsコンポーネントにつないでダブりを除去し、同時にBoundingBoxで囲った最大外形のエッジを少し内側にOffsetさせた曲線を使って内側/外側の判定を行い、外側のみを取り出すと上の図のように外周部分の点群が作成できます。
※removeDuplicatePtsコンポーネントはKangarooに含まれている機能です。
・下段の紫のエリアでは、変形させた後のばらばらに分解した直線の、変形後の長さの目標値を決める部分です。ひとまずRhinoceros上で点を6個(粗にする点3個所と密にする点3個所)を作ってGrasshopperに取り込みます。ばらばらにした直線のすべての中点との距離を求め、割り算と掛け算、足し算等を使って変形後の長さになるよう補正します(この部分は調整が難しいです)。
Step.4 バネ特性を決める
・バネの物理特性の設定と単一方向荷重の設定です。・Kangarooは基本的にフックの法則と呼ばれる物理法則にしたがって計算されます。高校の物理の授業で最初に習うアレです。直線をバネに見立てて、荷重がかかるとバネ定数とかの特性に合わせて伸び縮みする計算をします。弾性力とかダンパーの設定など数値を変えると挙動が変わりますが、ここではあくまでもデザイン的な使い方の紹介に留めますので、物理演算の詳細を知りたい方はGoogle検索等で調べてみてください。
・単一方向荷重は、簡単にいうと重力の設定です。これによりZ方向にも荷重がかかりますが、今回のケースはXY平面上の2D的な変形となりますのでこれは省略しても結果は変わらず、おまけ程度でつないでます。
Step.5 物理演算させる
・本番の計算部分です。これまでに設定した数値等をKangarooPhysicsコンポーネントにつなぎます。計算は時間で区切って計算させるため、Timerコンポーネントを用意して、KangarooPhysicsコンポーネントの下側に刺さるようにして繋ぎます。時間設定はひとまず最小の1msです。実際の計算のON/OFFはBooleanToggleで行います。アンカーポイントとバネの設定は、Flattenにして階層を平坦にしています。・六角形及び外周の四角形、五角形は各パスで階層が分かれていますので、計算結果をそのままJoin Curvesコンポーネントにつなぐと閉曲線となります。
ここまでが以前のブログで取り上げた部分となります。以降は階層分けのやり方になります。
Step.6 実際に使う六角形を取り出す
・これまでの変形させた六角形から一旦離れ、Step.2で作成した六角形のうち、使う部分を取り出します。枠を少し内側にオフセットさせた曲線を使って、六角形の中心点が内側にあるか外側にあるかをPoint In Curvesコンポーネントを使って判別し、Cull Patternコンポーネントにつないで取り出します。・ここで肝になる部分は、List LengthコンポーネントとSeriesコンポーネントを組み合わせて六角形のインテックス番号の数列を作り、Cull Patternコンポーネントにつないで同じように選別している部分です。
Step.7 Y軸方向に沿って並び変える
・Step.6で取り出した、変形前の六角形をまずはY軸方向で順番に並び変えます。中心点をDeconstruct Pointにつないで座標を分解し、Y値をSort ListコンポーネントにつなぐとY値の順番に並び替えることができます。・小数点込みの数値ですと順番がずれる可能性があるため、Text Splitコンポーネントにつないで整数部分のみ取り出して使っています。
・Step.6と同じく、インデックス番号も同じ順番に並び替えます。
Step.8 Y軸方向に沿って階層に分ける
・次は階層に分けていきます。・Step.7でY軸方向に順番に並び変えた六角形を、同じく中心点を求め、Text SplitコンポーネントにつないでY値の整数部分のみを取り出しますが、Create Setコンポーネント及びEqualityコンポーネント、Cull PatternコンポーネントにつないでY値ごとに階層を分けることができます。
・インデックス番号も同じく分離します。
Step.9 パスを互い違いに分離する
・Y値ごとに階層分けした六角形を、互い違いに分離します。Tree Staticコンポーネントにつないで取り出した階層のパスを、Cull PatternコンポーネントにつないでパスをTrueの部分だけ取り出し、Split TreeコンポーネントのMに指すことで両者を分離できます。インデックス番号も同じ処理を加えます。Step.10 分離したパスを階層合わせしてから統合する
・互い違いに分離したパスをくっつける部分です。2つに分離したパスの階層番号をParam Viewerにつないで確認すると、片方が{1}、{3}、{5}・・・となっていて、もう片方が{0}、{2}、{4}・・・となっています。よって、{1}から始まる階層から1を引き算するともう片方の階層番号に一致することがわかります。・そこで、Path MapperコンポーネントにつないでSourceを{A}、Targetを{A-1}にすることでパスを変更することができ、MergeコンポーネントにつないでY軸方向ごとにまとめることができます。念のため、X軸方向にも順番をそろえてから、Step.5で作った変形後の六角形をインデックス番号を使ってList Itemコンポーネントにつなぐと、階層ごとに分かれた状態となります。
0 件のコメント:
コメントを投稿