Foundations · 02
Level Beginner
Time 45 minutes
You need Rhino 7/8 with Grasshopper
What you will build
The twisting tower is the “hello world” of Grasshopper for good reason: in sixteen components it demonstrates the whole logic of parametric modelling — one piece of source geometry, a stream of numbers, a chain of transformations, a skin. Change any slider and the tower rebuilds itself instantly.
You will stack a rectangular floor plate into thirty storeys, rotate each storey a little more than the one below, loft the result into a twisting envelope, and bake it into Rhino as real geometry. More importantly, you will understand what every wire carries. The build is identical in Rhino 7 and Rhino 8 — nothing here is version-specific.
Reading the canvas before you start
A quick orientation, because we will talk about wires constantly. Every component has inputs on its left edge and outputs on its right; a wire always flows from an output to an input. With fancy wires on (Display menu, Draw Fancy Wires — enabled by default), the wire tells you what it carries: a single line means one item, a double line means a list, and a dashed double line means a data tree (we meet those in a later tutorial). Watching a wire change from single to double is the fastest way to see what your definition is really doing.
To place a component, double-click an empty patch of canvas and type its name, or find it on the tabbed toolbar. I give the name and tab location for everything we use.
Step 1: A centred footprint
The tower starts as a single rectangle. The Rectangle component (Curve tab, Primitive panel) draws one on a base plane — by default the World XY plane at the origin. One subtlety matters: its X Size and Y Size inputs accept a domain, a numeric interval. Feed a plain number such as 12 and Grasshopper reads it as the domain 0 to 12, putting a corner at the origin. Since we will twist the tower about the vertical axis through the origin, we want the rectangle centred there — otherwise every floor swings around its own corner.
- Double-click the canvas, type 2.0<6.0<15.0 and press Enter. This shortcut creates a Number Slider with minimum 2, value 6, maximum 15; the decimal points make it a floating-point slider. Rename it (double-click its label) to Half width.
- Place a Negative component (Maths tab, Operators panel) and wire the slider into its input. It flips the sign: 6 becomes −6.
- Place a Construct Domain component (Maths tab, Domain panel). Wire Negative’s output into A and the slider directly into B. Output I is now the interval −6 to 6.
- Place a Rectangle and wire Construct Domain’s I into both the X and Y inputs. One output can feed any number of inputs — your first taste of wire reuse.
Slider "Half width" (6.0) → Negative (x)
Negative (y) → Construct Domain (A)
Slider "Half width" (6.0) → Construct Domain (B)
Construct Domain (I) → Rectangle (X)
Construct Domain (I) → Rectangle (Y)
You should see a 12 × 12 square centred on the origin. Every wire so far carries a single item, so every wire draws as a single line. Drag the slider and the square resizes symmetrically — exactly what the Construct Domain detour bought us.
Step 2: One counter drives everything
A tower is repetition, and repetition in Grasshopper means a list of numbers. The Series component (Sets tab, Sequence panel) generates an arithmetic sequence from S (start), N (step) and C (count). Rather than one series of elevations and another of angles, we generate a single series of floor indices — 0, 1, 2, 3 … — and multiply it by different factors downstream. One counting stream, many uses.
- Type 1<30<60 on the canvas — whole numbers ask for an integer slider, which is what a floor count should be. Rename it Floors.
- Place a Series component. Leave S at 0 and N at 1, and wire Floors into C.
- Place a Panel (Params tab, Input panel) and wire the Series output S into it. You should read 0, 1, 2 … 29.
Look at the wire leaving Series: it is now a double line, because it carries thirty numbers. Hanging a Panel off any output you are unsure about is the single most useful debugging move in Grasshopper.
Step 3: Stacking the floors with Move
To stack the rectangle we need vertical vectors, one per floor, each longer than the last. Unit Z (Vector tab, Vector panel) produces a vector pointing straight up, and its F (factor) input scales its length. Feed it one number and you get one vector; feed it thirty numbers and you get thirty vectors. Components handle lists automatically — no loops to write.
- Create a slider by typing 2.5<3.5<5.0; rename it Floor height.
- Place a Multiplication component (Maths tab, Operators panel). Wire the Series output S into A and Floor height into B. The result is a list of elevations: 0, 3.5, 7, 10.5 …
- Place Unit Z and wire the Multiplication result R into F.
- Place a Move component (Transform tab, Euclidean panel). Wire the Rectangle output R into G (geometry) and Unit Z’s V into T (motion).
Series (S) → Multiplication (A)
Slider "Floor height" (3.5) → Multiplication (B)
Multiplication (R) → Unit Z (F)
Unit Z (V) → Move (T)
Rectangle (R) → Move (G)
Pause on what happened inside Move, because it is the heart of how Grasshopper thinks. Its G input received one rectangle; its T input received thirty vectors. When list lengths disagree, Grasshopper repeats the last item of the shorter list, so the single rectangle is reused for every vector and Move outputs thirty copies at thirty elevations. You never asked for copies — the data matching produced them. The viewport now shows a clean stack of squares, and the wire leaving Move’s G output is a double line.
Step 4: The twist
Now the signature move. Rotate (Transform tab, Euclidean panel) spins geometry in the plane fed into its P input — and its default, World XY, has its axis running straight up the centre of our stack. All we need is a list of graduated angles: floor 0 rotates 0°, floor 1 rotates 3°, floor 2 rotates 6°, and so on. Our index series multiplied by a twist increment gives exactly that.
One trap: Rotate expects its angle in radians. The clearest fix is the Radians component (Maths tab, Trig panel), which converts degrees to radians in plain sight. (You can also right-click an angle input and tick Degrees, but hidden switches make definitions harder for colleagues to read — prefer the explicit component while learning.)
- Create a slider by typing 0.0<3.0<12.0; rename it Twist per floor. This is degrees of rotation added per storey.
- Place a second Multiplication. Wire the same Series output S into A — the counting stream now does double duty — and Twist per floor into B.
- Place a Radians component and wire the Multiplication result R into its D input.
- Place Rotate. Wire Move’s G into Rotate’s G, and Radians’ R into Rotate’s A. Leave P untouched.
Series (S) → Multiplication #2 (A)
Slider "Twist per floor" (3.0) → Multiplication #2 (B)
Multiplication #2 (R) → Radians (D)
Radians (R) → Rotate (A)
Move (G) → Rotate (G)
This time the matching is one-to-one: thirty rectangles meet thirty angles, so each floor gets its own rotation, and the stack spirals. We moved first and rotated second, but here the order would not matter — a vertical translation and a rotation about the vertical axis are independent. That is a special case: in general, transformation order matters a great deal.
Step 5: Skinning with Loft
The Loft component (Surface tab, Freeform panel) stretches a surface through an ordered list of section curves — exactly what Rotate is handing us. Wire Rotate’s G into Loft’s C (curves) input and leave O (options) at its defaults. Because every section is a copy of the same closed rectangle, seams and curve directions already line up, and the loft closes into a clean twisted tube.
Rotate (G) → Loft (C)
The viewport looks busy because Grasshopper previews every component at once. Right-click Move and Rotate and untick Preview to hide the intermediate rectangles. Now play: wind and unwind Twist per floor, push Floors to 60, squeeze Half width down. Every change ripples through the whole wire chain in real time. You have not modelled a tower — you have modelled the rules for a family of towers.
Baking the result
Everything so far is preview only. It lives inside the definition; Rhino cannot select it, snap to it, render or export it, and if you close the definition it vanishes. To turn preview into real Rhino geometry, you bake it.
- Right-click the Loft component and choose Bake…
- In the dialogue, choose a target layer — a dedicated layer such as GH Bake keeps baked output from tangling with your working model.
- Click OK. The twisted envelope is now an ordinary polysurface in the Rhino document.
Two things to understand about baking. First, it is a one-way copy: the baked object is frozen, and moving a slider afterwards changes the preview but not the baked geometry. If you refine the design, bake again — and delete the stale version, or you will accumulate overlapping towers. Second, you can bake from any component. Right-click Rotate and bake it, and you get thirty floor-plate outlines as curves, ready for drawings.
Practice
- Taper the tower. Multiply the Series output by a small negative number and add it to Half width with an Addition component (Maths tab, Operators panel). Feed that per-floor width into Negative and Construct Domain in place of the slider: Rectangle now receives thirty domains, so thirty different-sized rectangles exist before Move even sees them.
- Break it on purpose. Wire the elevations (the first Multiplication’s output) into Rotate’s A instead of the Radians output, and explain to yourself exactly why the tower knots up. Reading a broken definition is a skill you will use weekly.
- Rebuild from memory. Open a blank canvas and reconstruct the definition without looking. If you can narrate what each wire carries — one rectangle, thirty numbers, thirty vectors, thirty angles — the lesson has stuck.
Next in the Foundations track we open up the thing this tutorial quietly relied on: how Grasshopper matches lists of different lengths, and how to take control of it. Members can find the completed definition, the tapered variant, and all course files in the Members Library.