Lesson 4.2Lesson 4.2 · Geometry & Transformations
Curves & Surfaces in Grasshopper
Making and reading geometry parametrically, from Interpolate to Loft
Stop drawing curves by hand - build them from points, read them back at any position, and let surfaces hand you a grid you can panelize.
In Rhino you draw a curve; in Grasshopper you compute one - from a list of points, a set of control points, or by sweeping a profile along a path. And once a curve or surface exists as data, you can interrogate it: ask for the point 60% along, the tangent there, a hundred evenly spaced divisions, the outward normal at any spot.
That two-way relationship - construct geometry from parameters, then evaluate it back into points and vectors - is the engine of the whole toolkit. This lesson gives you the handful of components that do it, plus the one idea (the 0-to-1 domain) that quietly makes everything predictable.
Construct then evaluate. Reparameterize everything. UV grid = panel anchors.
Building curves: Interpolate, control points, and what NURBS really gives you
There are two everyday ways to build a curve from points, and the difference matters. Interpolate Curve (the Interpolate / IntCrv component) draws a smooth curve that passes through every point you give it - use it when the points are positions the curve must hit (a path traced on site, a section you measured). Nurbs Curve instead treats your points as control points: the curve is pulled toward them but generally does not touch them, like a magnetic cage shaping a smooth line. Control-point curves give you sleeker, more controllable fairness; interpolated curves give you precision through known points. Knowing which you want saves hours of confusion about 'why isn't my curve touching the points'.
Under both sits NURBS - Non-Uniform Rational B-Splines - the smooth, resolution-independent curve maths Rhino is built on. You don't need the equations, but three ideas help: degree (roughly, how smooth and how much each control point's influence spreads - degree 3 is the sane default), control points (the handles that shape it), and knots/domain (the internal parameterization, which we're about to tame). The payoff of NURBS is that a curve stays perfectly smooth and exact at any zoom, and can be evaluated analytically - which is exactly what the next components exploit. There's a fuller treatment in the Rhino & NURBS module; here we just use it, trusting that a degree-3 curve through or near a handful of points will be smooth, fair and ready to evaluate.
Reading a curve back: Evaluate, Divide, and why you Reparameterize
A curve you can't query is half useless. Evaluate Curve takes a curve and a parameter t and returns the point at that spot plus the tangent vector there - 'give me the position and heading 50% along'. Divide Curve chops a curve into a chosen number of equal-length segments and returns the division points, the tangents, and the parameters - this single component is behind an enormous amount of parametric work: fence posts, facade mullions, sampling a path for an array. Divide Distance and Divide Length are cousins for when you want a fixed spacing rather than a fixed count.
Now the idea that trips up everyone: a raw curve's parameter domain is not 0-to-1. It runs over some arbitrary interval baked in when the curve was made (say 0 to 43.7). So asking for t = 0.5 does not give you the middle - it gives you a spot right near the start. The fix is Reparameterize: right-click a curve input and choose 'Reparameterize', or use the component, and the domain is remapped to a clean 0 to 1. Now 0 is the start, 1 is the end, 0.5 is the middle, and any 0-to-1 value (from a slider, an attractor, a graph mapper) addresses the curve intuitively. Reparameterizing is a tiny habit that removes a whole category of bugs - build it in early.
Reparameterize! Then t=0 start, t=1 end, t=0.5 middle. Skip it and 0.5 lands near the start.
From curves to surfaces: Loft, Sweep, Extrude
Surfaces in Grasshopper are usually generated from curves, and four components cover most of it. Extrude pushes a curve (or surface) along a vector - a wall from a plan line, a mullion from a rectangle. Loft stretches a smooth surface across a list of section curves in order - the workhorse for hulls, roofs, and any form defined by a series of profiles; feed it three-plus sections and it skins them (watch the seam directions - flipped or mis-ordered sections give you a bow-tie, a classic first-loft mistake). Sweep1 runs a profile curve along a single rail; Sweep2 runs it between two rails, letting the profile scale to fit - perfect for a handrail, a cornice, a tapering canopy edge. Revolve spins a profile around an axis for anything rotationally symmetric.
The mental model is the same as with curves: these are construction components driven by parameters. Because the inputs are curves you built parametrically, the surface updates when they do - move a control point on a section curve and the loft re-skins live. And every surface these produce is, again, NURBS: smooth, exact, and - importantly for the next section - carrying its own internal 2D coordinate system you can sample.
UV space: the hidden grid that makes surfaces useful
Here is the concept that separates people who can panelize a facade from people who fight one. Every NURBS surface has a built-in 2D coordinate system stretched across it, called UV space. Think of the surface as a rubber sheet with a printed grid: u runs one way, v runs the other, and any point on the surface has a (u, v) address - regardless of how the surface bends in 3D. It's latitude and longitude for that specific surface.
This is what lets you sample a surface systematically. Evaluate Surface takes a (u, v) and returns the 3D point there, the normal vector (which way is 'out'), and the local frame - the plane you'd place a panel on. Divide Surface hands you a whole UV grid of points and normals in one shot: a 20-by-12 lattice of panel anchors, each with its outward direction, ready to array glazing or shading. Reparameterize the surface so UV runs 0-to-1 (same habit as curves) and a slider from 0 to 1 walks smoothly across it. Almost every parametric facade in Module 6 is, at heart, 'Divide Surface into a UV grid, then place an oriented panel on each cell's frame'. Understand UV now and that module is mostly bookkeeping. One honest caveat: UV spacing is even in parameter space, not always in real distance - on a stretched or trimmed surface the grid can look uneven, which is a known quirk you handle with equalized division or by rebuilding the surface.
UV = the surface's own lat/long. Divide Surface -> grid of points + normals = panel anchors.
Keeping it robust: seams, domains and clean generating curves
A parametric surface is only as trustworthy as the curves and habits behind it, so a few disciplines separate definitions that survive editing from ones that shatter. First, treat your generating curves as the design and keep them clean: consistent direction, sensible degree, no accidental kinks or duplicate control points. A messy section curve makes a messy loft, and no amount of downstream fiddling recovers it - fix the input, not the output. Second, reparameterize early and everywhere - curves and surfaces - so every domain speaks the same 0-to-1 language; mixing native and reparameterized domains in one definition is a reliable way to get points that land almost-but-not-quite where you expect.
Third, mind the seam and the UV directions. Every closed surface has a seam (where it wraps back on itself), and every surface has a U and a V that may not be the way you assume - a facade you expected to divide '20 wide by 8 tall' can come out '8 wide by 20 tall' because U and V are swapped. Display the surface's isocurves and a small UV indicator while you build so you see which way is which, and use Flip or Swap UV when needed rather than guessing. Fourth, remember that surfaces you sample feed straight into the next stages of the course: the points from Divide Surface become attractor targets in Module 5, panel anchors in Module 6, and mesh vertices when you hand off to analysis or fabrication in Module 9. Because of that, a well-parameterized, evenly divided surface pays dividends far downstream, while a sloppy one quietly corrupts everything built on it. Getting curves and surfaces right here is not busywork - it is the foundation the expressive modules stand on.
Clean generating curves. Reparameterize all. Check which way U and V actually run.
Interpolate vs Nurbs Curve
Curve-through-points vs curve-shaped-by-control-points
Interpolate passes through your points; Nurbs Curve is pulled toward them. Pick by whether the points must be touched.
Evaluate Curve / Divide Curve
Read a point+tangent at t / split into N points
The core 'interrogate a curve' pair. Divide also returns parameters and tangents for arraying.
Reparameterize
Remaps a curve or surface domain to 0-to-1
A right-click on the input. Makes t and UV intuitive; skip it and evaluation lands in the wrong place.
Loft / Sweep1 / Sweep2
Skins a surface across sections or along rails
Loft needs ordered, consistently-oriented sections or you get a bow-tie. Sweep2 lets the profile scale between two rails.
Evaluate / Divide Surface (UV)
Sample a surface's 2D UV grid for points + normals
The foundation of panelization. UV spacing is even in parameter space, not always in real distance.
Workshop - a lofted surface you can panelize
This exercise runs the full construct-then-evaluate loop: build sections into a surface, then read the surface back as a grid of oriented anchors. It's a miniature of every facade definition you'll build later.
Rhino + Grasshopper. No plug-ins needed, though LunchBox offers ready-made panel grids you can compare against later.
Goal: build and then sample a NURBS surface Inputs: three or four section curves (drawn in Rhino or built from points) Time: ~40 minutes
- 1Make three section curves - either draw them in Rhino and reference them, or build each with Interpolate through a few points. Keep them roughly parallel and similarly oriented.
- 2Loft them into a surface. If you get a twisted bow-tie, flip or re-order a section until the seams line up - note what fixed it.
- 3Reparameterize the surface (right-click the input). Drop an Evaluate Surface, feed u = 0.5, v = 0.5, and confirm the point lands at the visual centre and the normal points 'out'.
- 4Swap in Divide Surface with U and V counts on sliders. You now have a UV grid of points and normals - display them and watch the grid re-solve as you change the counts.
- 5On each grid frame, place a small rectangle or box (use the normal/frame as its plane). Congratulations - that's a panelized facade in embryo. Nudge a section curve and watch everything update.
You’ll walk away with
A live definition: sections -> Loft -> reparameterized surface -> Divide Surface -> a panel placed on every UV frame, with slider control over the grid density. Save it; you'll extend this exact pattern in the Facades module.
Three altitudes on the same idea
Read the band that fits you — or all three.
This is the bridge from concept curves to buildable surface. Section curves through a Loft is how a massing idea becomes a controllable roof or shell; Divide Surface is how that shell becomes a rationalized field of panels. Keep your generating curves clean and reparameterized and the whole downstream model - structure grid, glazing, shading - stays coordinated when the form moves.
Sweep and Loft are your bespoke-joinery engines. A cornice or handrail is Sweep1 along a rail; a curved reception desk or a flowing ceiling is a Loft through profiles you can nudge. Divide Curve gives even spacing for slats and lighting; UV sampling lets a pattern sit cleanly on a curved feature wall. You design the rule, then the fabrication geometry follows.
Evaluate, Divide and Reparameterize are the components you'll use in literally every project - learn them cold. A crisp portfolio piece is often just: build a surface with a Loft, Divide it into a UV grid, place something clever on each frame. Master the 0-to-1 domain early; nothing signals 'still a beginner' faster than a definition that breaks because someone forgot to reparameterize.
“A curve parameter goes from 0 to 1, so t = 0.5 is always the middle.”
Do it yourself
Check your understanding, then verify on the canvas.
- 1What's the practical difference between Interpolate Curve and Nurbs Curve?
- 2Evaluate Curve returns a point and what vector - and what is that vector good for?
- 3Why does forgetting to reparameterize make t = 0.5 land in the wrong place?
- 4Name the component that skins a surface across a list of section curves - and one thing that makes it fail.
- 5What is UV space, and what does Divide Surface hand you that makes panelization possible?
The one line to carry out
Peer-reviewed journals & authoritative standards
- 01Non-uniform rational B-spline (NURBS) — Wikipedia, 2026.
- 02Mode Lab - The Grasshopper Primer (Third Edition) — grasshopperprimer.com (free online edition), 2020.
- 03Rhino - Essential Mathematics for Computational Design (Rajaa Issa) — Robert McNeel & Associates, 2019.
- 04Grasshopper - Algorithmic modeling for Rhino (official) — Robert McNeel & Associates, 2026.
You can now make and read geometry. Next we move it: transformations and arrays - Move, Rotate, Orient and the linear, rectangular and polar patterns - including the crucial difference between transforming geometry and transforming the plane it rides on.
The author
Amogh N P
Architect, interior designer, and creative polymath. Studio Matrx began in his notebooks — his vision of design made honest, useful, and open to everyone. Its Academy is written and taught in his memory, and free, forever.
More about Amogh →