はじめに: 悩ましいギャップ
Rhino/Grasshopperユーザーの皆さん、こんにちは!
今回は、複数のBrep(ブロック)を並べる際に、ブロック間の間隔を徐々に広げていく、という少し特殊な配置について考えてみましょう。
ソース情報では、ユーザーが「Pull Point」を試しても間隔が一定のままで、教授が作ったアルゴリズムも単一のブロックには機能するものの、複数のブロックには対応できない、という悩みを抱えていました。
最終目標は、たった一つのSliderで全体の距離感を調整できるようにすることです。
この問題、一見すると難しそうですが、Grasshopperの基本的なリスト操作と数値生成を理解すれば、スマートに解決できますよ。
問題解決の鍵: 累積移動
なぜ「Pull Point」や単一ブロック用のアルゴリズムではうまくいかないのでしょうか?
それは、それぞれのブロックが「前のブロックからの相対的な距離」だけでなく、「原点からの累積的な移動量」に基づいて配置される必要があるからです。
例えば、最初のブロックは動かさず、2番目のブロックはX方向に`d`だけ移動、3番目のブロックはX方向に`d + 2d`(つまり合計`3d`)だけ移動、4番目のブロックは`d + 2d + 3d`(合計`6d`)だけ移動、といった具合に、移動量が前のブロックのギャップと自身のギャップの合計になるように計算する必要があります。
この「累積」という考え方が、今回のロジックの核心です。Grasshopperでは、この累積計算を非常に簡単に行うことができるコンポーネントがあります。
Grasshopperでの実践ステップ
それでは、具体的なGrasshopperの定義を見ていきましょう。
1. Brepの準備: まず、配置したい複数のBrepをGeometryコンポーネントに読み込みます。この時、Brepがリストとして入力されていることを確認してください。
2. 増分距離の生成:
* 間隔の基本となる増分量を制御するSliderを用意します(例: 0.1から10.0)。
* この増分量を使って、各ブロック間のギャップ値を生成します。例えば、1番目のギャップは`slider_value * 1`、2番目のギャップは`slider_value * 2`、3番目のギャップは`slider_value * 3`...としたい場合、Seriesコンポーネントを使います。`Start`は0(最初のブロックは移動しないため)、`Step`にはSliderの値を接続し、`Count`にはList Lengthで取得したBrepの数を接続します。
* これにより、[0, slider_value, 2*slider_value, 3*slider_value, ...]のようなリストができます。
3. 累積移動量の計算:
* 次に、生成したギャップ値のリストを「累積」させます。ここで登場するのがMass Additionコンポーネントです。このコンポーネントの`Partial Results`出力を使うと、入力リストの累積和がリストとして得られます。
* 例えば、[0, 1, 2, 3]という入力に対して、`Partial Results`は[0, 1, 1+2, 1+2+3]、つまり[0, 1, 3, 6]を返します。これが各Brepの最終的な移動距離となります。
4. Brepの移動:
* 累積移動量のリストを、移動ベクトルに変換します。例えばX軸方向に移動させるなら、Unit XコンポーネントとAmplitudeコンポーネントを組み合わせ、Mass Additionの`Partial Results`をAmplitudeに接続します。
* 最後に、元のBrepリストと生成した移動ベクトルリストをMoveコンポーネントに接続します。これで、各Brepがそれぞれの累積移動量だけ移動し、段階的に間隔が広がる配置が完成します。
さらなる応用と調整
この基本的なロジックを応用すれば、さらに複雑なパターンも可能です。
例えば、ギャップの増分パターンを線形ではなく、加速させたり減速させたりしたい場合は、Seriesで生成した値の代わりに、Graph Mapperを使って曲線を適用することで、より有機的な間隔の変化を実現できます。
また、Unit XをUnit YやUnit Zに変更すれば、移動方向を簡単に変えられますし、複数の移動方向を組み合わせることも可能です。
このロジックを理解することで、単一のSliderで全体のレイアウトを柔軟に制御できるようになり、デザインの可能性が大きく広がります。ぜひ色々なパターンで試してみてくださいね。
