Studio Matrx Monthly · Volume 1 · Issue 3 · August 2026
Amogh N P
 In loving memory of Amogh N P — Architect · Designer · Visionary 
Curves & Surfaces in GrasshopperLesson 4.2
CPD for Architecture, Planning & Urban Design/Module 4 · Geometry & Transformations

Lesson 4.2 · Geometry & Transformations

Curves & Surfaces in Grasshopper

Making and reading geometry parametrically, from Interpolate to Loft

13 min Interactive lessonFree · open lessonByAmogh N P· Architect & interior designer
The hook

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.

REPARAMETERIZE: EVERY CURVE RUNS 0 TO 1t=0.0t=0.25t=0.5t=0.75t=1.0Evaluate Curve (t=0.5) -> point + tangent at mid-length
Zoom
A reparameterized curve runs cleanly from t=0 to t=1, so Evaluate Curve at t=0.5 returns the true mid-length point and its tangent. Divide places evenly spaced points along the same domain - the raw material for arrays and mullions.

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: EVERY CURVE RUNS 0 TO 1t=0.0t=0.25t=0.5t=0.75t=1.0Evaluate Curve (t=0.5) -> point + tangent at mid-length
Zoom
A reparameterized curve runs cleanly from t=0 to t=1, so Evaluate Curve at t=0.5 returns the true mid-length point and its tangent. Divide places evenly spaced points along the same domain - the raw material for arrays and mullions.

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.

A SURFACE IS A 2D UV SHEET IN 3D SPACEP(u,v)vuDivide Surface -> a UV grid of points + normals for panels
Zoom
A NURBS surface carries its own 2D UV grid stretched across it in 3D. Divide Surface samples that grid into a field of points, each with an outward normal and local frame - exactly the oriented anchors you place panels on.

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.

A SURFACE IS A 2D UV SHEET IN 3D SPACEP(u,v)vuDivide Surface -> a UV grid of points + normals for panels
Zoom
A NURBS surface carries its own 2D UV grid stretched across it in 3D. Divide Surface samples that grid into a field of points, each with an outward normal and local frame - exactly the oriented anchors you place panels on.

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.

A SURFACE IS A 2D UV SHEET IN 3D SPACEP(u,v)vuDivide Surface -> a UV grid of points + normals for panels
Zoom
A NURBS surface carries its own 2D UV grid stretched across it in 3D. Divide Surface samples that grid into a field of points, each with an outward normal and local frame - exactly the oriented anchors you place panels on.

Clean generating curves. Reparameterize all. Check which way U and V actually run.

Components & terms you'll meet in this lesson

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.

Hands-on workshop

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.

Given & goal
Goal: build and then sample a NURBS surface
Inputs: three or four section curves (drawn in Rhino or built from points)
Time: ~40 minutes
  1. 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.
  2. 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.
  3. 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'.
  4. 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.
  5. 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.

The worked example

Three altitudes on the same idea

Read the band that fits you — or all three.

For the architectDesign intent, geometry & delivery

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.

For the interior designerParametric interiors, pattern & furniture

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.

For the studentSkills, portfolio & jobs

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.

Misconception check

A curve parameter goes from 0 to 1, so t = 0.5 is always the middle.

Only after you reparameterize. By default a curve's domain is whatever interval was set when it was created - it might run 0 to 12.4, or 0 to 43.7, or even start at a non-zero number. In that native domain, t = 0.5 is a spot very close to the start, not the midpoint, which produces baffling results when you evaluate or divide. Reparameterizing remaps the domain to a clean 0-to-1, after which 0 is the start, 1 the end, and 0.5 genuinely the middle. It's a one-click habit (right-click the input, 'Reparameterize') that eliminates a whole class of 'why is my point in the wrong place' bugs. Surfaces have the same story in both U and V.
Try it

Do it yourself

Check your understanding, then verify on the canvas.

  1. 1What's the practical difference between Interpolate Curve and Nurbs Curve?
  2. 2Evaluate Curve returns a point and what vector - and what is that vector good for?
  3. 3Why does forgetting to reparameterize make t = 0.5 land in the wrong place?
  4. 4Name the component that skins a surface across a list of section curves - and one thing that makes it fail.
  5. 5What is UV space, and what does Divide Surface hand you that makes panelization possible?
Take this with you

The one line to carry out

Build geometry from data with Interpolate, Nurbs Curve, Loft and Sweep, then read it back with Evaluate and Divide - and reparameterize to a clean 0-to-1 domain so a surface's UV grid becomes a predictable field of oriented panel anchors.
Take it further
References & further reading

Peer-reviewed journals & authoritative standards

  1. 01Non-uniform rational B-spline (NURBS)Wikipedia, 2026.
  2. 02Mode Lab - The Grasshopper Primer (Third Edition)grasshopperprimer.com (free online edition), 2020.
  3. 03Rhino - Essential Mathematics for Computational Design (Rajaa Issa)Robert McNeel & Associates, 2019.
  4. 04Grasshopper - Algorithmic modeling for Rhino (official)Robert McNeel & Associates, 2026.
Related lessons
Recap
Curves are constructed (through points with Interpolate, or shaped by control points with Nurbs Curve) and then interrogated (Evaluate for a point-plus-tangent, Divide for evenly spaced points). Reparameterizing remaps the domain to 0-to-1 so parameters behave. Surfaces are lofted or swept from curves and carry a UV coordinate grid; Evaluate and Divide Surface sample that grid into points and normals - the basis of all panelization.
Carry forward →

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.

A

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 →