Surfaces from fields
A base surface over a grid of u and v, with a field deciding where each vertex goes and another deciding what colour it is.
The Surface node is a primitive with two openings in it. It starts from a base shape sampled over a UV domain, then hands each vertex to whatever is wired into position and color. Nothing about it is baked: the fields are evaluated where each vertex sits, so an animated field animates the surface and a resolution drag re-tessellates without a recompile.
This is the field to geometry direction made into one node. Plot is its sibling in the other direction, and the two share one projection authority, so a Spherical Surface and a Spherical Plot agree about where an angle points.
A parametric surface, as mesh or points, from a base preset over a UV domain. Wire a function into Position to deform it and into Color to paint it.
The base
base is Plane, Sphere, Torus, Tube or Disc. Sphere and Torus are the same shapes the primitives of those names give. Tube is an open lateral cylinder with no caps, and Disc is a flat sheet subdivided from its centre out to the rim.
Only Plane reads coordinate_system, which decides how the flat u and v domain is embedded: Cartesian leaves it a flat grid, Spherical and Cylindrical wrap it into a shell. The other four bases emit their own shape and the control is hidden on them.
u_resolution and v_resolution are the grid's columns and rows, 32 each to start. Both are live values rather than structural ones, so dragging either re-tessellates immediately.
Driving position
What a wired position field does depends on its valence, and this is the part worth reading twice.
A single-value field lifts the surface along the base's own normal, so a scalar field over a Plane is a height field and the same field over a Sphere makes it lumpy.
A colour field or an image lifts it by Rec.709 luminance. That makes any picture a bump map without a conversion node, and it means a saturated red and a dark blue can push to nearly the same height.
A vector field replaces the vertex outright rather than displacing it, which is how a surface becomes something with no relationship to the base it started from.
position also carries two presets, Wave and Ripple. Picking one is not a hidden mode: it drops a Pattern node into the graph, wired into the pin, and you edit it like any other node. Both spawn Pattern in its Wave mode and differ in the domain they read, Ripple being centred.
color is sampled at each vertex the same way. Left unwired, the surface takes its fill.
Mesh, points or field
output decides what leaves the node.
Mesh is a triangulated surface. Points skips triangulation and hands back the raw vertices, each carrying @P, @N, @Cd and @uv, which is the form to scatter, simulate or wrangle. Field is the analytic form, and it is not uniform across the bases:
Sphere and Torus become the same closed-form distance field their primitives give, so booleans and offsets work on them.
Plane, Tube and Disc, and any base at all once
positionis wired, become an analytic parametric surface instead. It re-tessellates at whatever resolution a consumer asks for, but it has no inside or outside, so a boolean against one declines rather than guessing.
A consumer that needs triangles gets them either way, spliced in without a node.
Under Field, a wired color is dropped. The analytic surface record carries position, normal, UV, tangent and distance, and has no colour channel, so the field is evaluated by nothing and no error is raised. Take Mesh or Points output when the colour matters.
| Parameter | Type | Default | What it does |
|---|---|---|---|
position | Field | "None" | Function driving vertex position f(u,v). A single-value field lifts the surface as a height; a colour or image field (e.g. Noise) lifts it by brightness — a bump map; a vector field replaces each vertex outright (the parametric math-animal). A time-reading field animates over the timeline. Picking Wave or Ripple drops the Pattern node that generates it into the graph, wired here — edit it like any other node. Unwired: the pure base preset. One of: None, Wave, Ripple. |
color | Field | — | Function driving per-vertex color f(u,v), sampled where each vertex sits. Unwired: uses Fill. |
fill | Color or Color Field or Color[] or Field or Material or Material[] or Frame Sequence | — | — |
base | String | "Plane" | Base shape. Plane: a flat (u,v) domain reinterpreted by Coordinate System. Sphere/Torus: identical to the respective primitive. Tube: an open lateral cylinder (u wraps the circumference, v runs the height; no caps). Disc: a filled flat circle in the XZ plane (u wraps the circumference, v runs from the center to the rim). One of: Plane, Sphere, Torus, Tube, Disc. |
u_resolution | Number | 32 | Subdivisions along u (grid columns). Runtime uniform — a drag re-tessellates without recompiling. |
v_resolution | Number | 32 | Subdivisions along v (grid rows). Runtime uniform — a drag re-tessellates without recompiling. |
coordinate_system | String | "Cartesian" | How the Plane (u,v) domain is embedded. Cartesian: flat grid. Spherical / Cylindrical: parametric shell. (Fixed presets emit their own shape and ignore this.). One of: Cartesian, Spherical, Cylindrical. |
output | String | "Mesh" | Output form. Mesh: a triangulated surface. Points: the raw vertex point cloud (skips triangulation), carrying @P/@N/@Cd/@uv per point. Field: an analytical Field::Record(geometry_surface) instead of a baked mesh — Sphere/Torus become a closed-form CSG-able SDF (identical to the primitive's), while Plane/Tube/Disc (or ANY base with a wired Position) become an analytic-parametric surface: lazily re-tessellatable at any resolution, but with no signed distance (an open/flat/freely-drawn surface has no inside/outside, so SDF booleans decline honestly). Mesh consumers get the tessellation spliced transparently. One of: Mesh, Points, Field. |
obj_position | Vec3 | (0, 0, 0) | Translation (X, Y, Z) |
obj_rotation | Vec3 | (0, 0, 0) | Rotation in degrees (X, Y, Z) |
obj_scale | Vec3 | (1, 1, 1) | Scale (X, Y, Z) |
obj_anchor | Vec3 | (0, 0, 0) | Pivot offset (X, Y, Z) — rotation/scale orbit this point |
opacity | Number | 1 | Layer opacity (0 = transparent, 1 = opaque). Editable, wirable, keyframable. |