Design an array of geometry at various scales with curve attractors in grasshopper

Project Overview

A few months ago I was asked to create a custom wall graphic for a project and it provided the perfect opportunity to use grasshopper at work. We design spaces for this company all over the country and they always have a custom design that expresses their key values at the reception of their office space. The design always includes the same value in text and an associated logo; so, by creating a grasshopper script we will be able to design a multitude of unique options for all of the offices around the country.

One of my favorite things to experiment with in grasshopper is attractors because the concept can be applied to many different applications to provide a unique look. For confidentiality reasons, I will be using a different logo and text.

We will be creating a grid of geometry that scales based on a curve attractor in order to get a set of geometry that responds to a central set of text.

I will be using the LunchBox for grasshopper plug-in to create the grid structure which can be downloaded from either of the websites below. Grasshopper has some built-in functionality to create grid arrays but I personally prefer the lunchbox component for this.

LunchBox For Grasshopper – Proving GroundLunchbox for Grasshopper – food4Rhino

Once you have lunchbox installed, open up Rhino and Grasshopper and let’s get started.

Create the wall boundary and grid for the array of the logo

The first thing we want to do is to define the boundary for the graphic and create a grid that will host all of the individual shapes. Because I am designing the graphic for a defined wall size and shape, I will draw this boundary in Rhino and set the curve in grasshopper. I am using a 9′-0″ x 13′-0″ rectangle.  In grasshopper, I will then create a surface from my boundary curve and apply a grid to it using the lunchbox diagonal grid component. By hovering over any of the input/output variables on a component, you can figure out what type of information the variable is asking for. We will use number sliders to define how many rows and columns (U &V divisions) that we want in our pattern. Once we have our grid we will use a point component to get a list of all of our points.

Note that any surface can be used at this stage, even 3-dimensional surfaces created in Rhino.

Remove points along the edge of the boundary curve

After creating the grid of points, you will notice that some of the points fall onto the boundary of the curve. We are creating a graphic that will be printed on a material (film in this case), so we do not want any geometry on the boundary because it will be cropped when printing. To remedy this we will create a boundary cull which will delete/ignore any of the points that intersect the boundary curve.

The boundary cull does the following:

  1. Test if the points are outside the curve (0), intersecting the curve (1) or inside the curve (2) with the points in curve (incurve) component.
  2. Integer divide the incurve results so we are left with only 0’s & 1’s. 0 will represent false, 1 will represent true. Note: you must use integer divide rather than divide so that we get a 0 instead of a 0.5 when dividing the incurve results by 2.
  3. Use a cull pattern component which will assign a point to the 1 (true) values and not to the 0 (false values). This, in essence, removes/ignores any point that is intersecting our boundary curve.

Draw the logo geometry in Rhino and move a scaled copy to each point

When first getting started with Grasshopper, an important thing to remember is that you don’t have to create everything in Grasshopper. For our logo, we most likely want something that is not a basic shape and is much easier to freehand draw in Rhino. This shape would take much more time to create in grasshopper and there is no reason to do so. I have drawn the bowtie shape below with a polyline but you can use any shape you’d like. When using a polyline it is easier to find the center of the geometry; however, if you need a curve or set of curves for your geometry it requires a few more steps. For this, you need to create a bounding box around your geometries and find the center point of that box for use in the next section.

Once the shape is drawn we will create a scaled copy of the geometry at each point in our grid by moving it along a vector from the center point to our list of culled points from the previous section. In the next section, we manipulate how the geometry scales to get the various sizes.

Create a curve attractor to manipulate the scaling of the geometry

Now that we have the geometry arrayed onto the grid we can use a curve attractor to manipulate how the geometry is scaled when we move it. The basic idea is that we draw a curve across the surface and the geometry will scale to be bigger or smaller depending on how close it is to the curve. We will be using domains and the ReMap component below which can get a little tricky. A domain is a range of numbers from the low point to the high point.

To create the curve attractor:

  1. Draw a curve in Rhino that intersects the surface and use the curve closest point (Crv CP) component to associate the curve with our grid of points.
  2. Use the bounds component to capture the domain of the distances of the points from the curve. In other words, we capture a list of how far each point is from the curve and use the closest and farthest distance to create the domain.
  3. Construct a new domain that states the range of how big to small we want the geometry to scale to. For example, we want the smallest geometry to be .125″ (1/8″) and the largest to be .5″ (1/2″) so we construct a domain with a start of .125″ and an end of .5″.  We can flip these numbers to change how the geometry reacts to the curve. If the small value is plugged into the A variable of the domain component then the geometry will be smallest at the points that are closest to the curve. If we switch and plug in the smallest value into the B variable, the geometry will be largest at the points closest to the curve.
  4. Remap the distances gathered from the Crv CP component to the new domain constructed in the last step. We want to create a new list of scaling factors based on how far each point is from the curve. We use the ReMap component to do this by taking the smallest distance of a point from the curve and assigning it the smallest scale factor from the newly constructed domain. Additionally, we do the same thing with the farthest point from the curve and assign it to the largest scaling factor from the new domain. All of the other point distances scale relationally between those two extremes. The output of the ReMap component is this newly constructed list of scaling factors that are directly related to how far each point is from the curve. We then take this list and plug it into the scale component.

Add text in the middle of the geometry

The last item is to incorporate the key values into the design. The idea is to have text in the middle of the pattern that the geometry radiates outwards from. To do this we will repeat the same points in curve series from the boundary cull section; however, we will invert the pattern so we remove any points within the middle area of a circle where we want to have the text. Once we have our new list of points we will replace that list with any variable that was hosting our previous points list.

To get the radiating effect, we will change the curve attractor to the new circle in the middle of the graphic so the geometry is larger at the circle and gets smaller as it moves towards the edge of the wall.

Finally, we add our text in Grasshopper and the pattern is ready to bake and export to Cad, illustrator or any other file type needed.

Final Image

Tips on Getting Started with Grasshopper for Rhino

Tips grasshoper rhino

Grasshopper can be a very intimidating software to learn. The tool requires you to look at architecture as geometry and physics rather than as strictly form. This can be challenging because it requires a different mindset; however, if you can get past this hurdle, the tool can be extremely powerful. With Grasshopper, we can iterate infinite possibilities of our designs and strategies in a non-destructive way.

When I was first getting started with grasshopper I recognized all of this possibility but had no idea where to start and was turned off by the complexity every time I opened up the program and tried to learn. Eventually, I gave myself a project to do and committed to somehow bringing grasshopper into the process. Over time, I became more comfortable with the program but I definitely learned some lessons along the way.

There are a ton of resources online, use them.

The only way you’re going to learn is by doing so I recommend either finding a project to do like a design competition or craft object; or, by finding some tutorials online to run through for practice. In addition to the official tutorials, Youtube is a great resource for videos but there are also lots of great learning websites with more robust plans. Below are a few that I have tried and liked.

When starting do not try to create everything in grasshopper

Use rhino with grasshopper to simplify the process when just beginning to learn. Some actions are more difficult and less efficient to do in grasshopper.

  • example : creating a unique curve shape to use in a pattern. Sometimes with complex curves, it is easier to create them in rhino and then manipulate them in grasshopper. This can also be said for curves that will create a lofted surface. The benefit of this is that you can freely edit the shape of the curves in Rhino without having to come up with a mathematical solution for reshaping the curves.

Say what you’re trying to do out loud if you get lost

With Grasshopper, you need to really understand what you’re components are doing because you are working on a more granular scale than with other modeling software. For this reason, it is easy to get lost along the way and by saying out loud exactly what you are trying to accomplish step by step it will be easier to locate the correct component. If you’re not much for talking to yourself then making a list or mind map will suffice.

  • example: you want to array a curve (shaped line) along a surface at various points. When modeling you can simply draw the curves (lines) on the surface wherever you’d like and be done with it. This is easy but limiting. Say you don’t know how many instances of the curve you want on the surface, or you’re not sure what the curve shape is yet. This is where grasshopper comes in; however, to do so you have to understand all the steps to
    1. draw the curve
    2. create a grid on the surface
    3. move the curve to the surface grid points using a translation vector
    4. orient the curve to lie flat on the surface using planes or other methods

Catalog your scripts into an organized library so they can be reused when needed

Often we are using the same definitions to do many different projects. When first learning grasshopper you will most likely be doing small tutorials that teach you how to accomplish a specific goal. When doing so it is good practice to save the definition into a folder with an associated image so that you can come back to it later and recognize what the definition is doing for when you want to reuse it in another project. In doing this you will soon have a library of basic definitions that you can reuse over and over again to make future projects much quicker.

Surround yourself with inspiration and motivation to make you think about practicing as often as possible

A few ways to do this are:

  • Find online resources that you like and bookmark the page so you see it in your bookmarks bar regularly
  • add the site as an additional homepage to open everytime you open up the internet. Next time you aimlessly open the browser the blog will be present and you’ll be more inclined to check up on what the latest is if you’re looking for somewhere to start.
  • subscribe to the channel on youtube
  • my favorite, change the background on your desktop to something related to the goal so everytime you sit down at the computer you think about working on something or getting to a certain point.