Pattern 3D is one node that produces any of more than 150 periodic, stochastic and textured solids: gyroids and other minimal surfaces, strut lattices, foams, weaves, knurls, valves. Bound it with an Intersection and it becomes a lightweight core; feed the same families to the Infill and Surface Pattern steps and they become a skinned lattice or a grip texture on an existing part. This article covers the node, the families, the two field-only steps, and what prints.

One node, a box of pattern

Pattern 3D lives under Solids. It fills a box of width, height and depth with the chosen patternType, and its other options decide what the pattern is made of:

Table: Pattern 3D options that shape the result.

Option Meaning Practical note
scale Unit-cell scale factor; higher is coarser The TPMS example uses 0.5 in a 20 mm box; the demo uses 0.6 in a 40 mm puck
sheetMode sheet builds a double-walled shell on the iso-surface; solid fills one side of it Sheet for lattices and heat exchangers, solid for a split-space part
thickness Wall thickness of the sheet Two extrusion widths minimum for FDM
solidSheetOperation In solid mode, add or subtract the thickened sheet Makes a solid with a thickened skin on the surface
invert Swap material and void inside the bounds The complementary lattice
seed Random seed for stochastic families Voronoi, noise, foams
unboundedSdf Continue the field beyond the box Only meaningful under a bounding parent
precision, decimation, sdfEngine Its own meshing controls The node meshes itself; see the bounding section

The node also accepts weighted point fields as children, which supply the sites for Voronoi-style modes, so a foam can follow points you scatter rather than a random seed. A pattern variable bound to patternType gives a configurator a picker with previews, which is what the demo exposes.

The families

Gyroid pattern preview Octet truss pattern preview Voronoi foam pattern preview Diamond knurl pattern preview

Table: Pattern families and representative types. The picker shows every type with a preview.

Family Examples Typical use
Triply periodic minimal surfaces gyroid, schwarz_p, schwarz_d, neovius, iwp, fks, lidinoid, double_gyroid Lightweight cores, heat exchangers, self-supporting infill
Strut lattices octet, isogrid, kagome, bcc_z, fcc_z, diamond_lattice, woodpile, gyroid_struts Stiffness-to-weight, open cells that drain
Mechanical metamaterials auxetic, auxetic_star, hexachiral, rotating_squares, pentamode, lattice_hinge, spiral_flexure Compliant and negative-Poisson parts
Foams and stochastic voronoi, voronoi_struts, spinodal, plateau_foam, closed_cell_foam, noise, organic, brain_coral, turing Organic looks, energy absorption
Textiles woven, chainmail, knitted, basket_weave, twill, satin, braid, rattan Decorative panels and flexible sheets
Functional forms tesla_valve, static_mixer, bellows, helical_spring, screw_thread, herringbone, offset_strip_fin, qrd, fresnel, retroreflector Fluidic and optical inserts
Surface textures straight_knurl, diamond_knurl, dimples, shark_skin, leather, hammered, sandpaper, stipple, wood_grain, diamond_plate Grip and finish; see Surface Pattern below
Fractal and mathematical menger, mandelbulb, mandelbox, apollonian, sierpinski_octahedron, catenoid, helicoid, costa, quasicrystal Showpieces and teaching models
Origami and corrugation miura, waterbomb, yoshizawa_corrugation, corrugated, egg_crate Stiffened panels

The gyroid is the one to start with, and Gyroids: The TPMS Surfaces covers why it prints so well. The mathematics that turns any of these into a solid is in Signed Distance Fields.

Bounding a lattice, and the GPU caveat

A lattice is rarely wanted as a box. The companion puck bounds it with an Intersection and wraps it in a skin.

Diagram: The puck tree. A union joins a mesh-mode intersection of the Pattern 3D node with a bounding cylinder, and a difference of two cylinders that forms the optional skin.

flowchart TD
  U["Latticed_Puck (union)"] --> I["Lattice_Core (intersection, mesh mode)"]
  U --> S["Skin (difference, enabled = showSkin)"]
  I --> L["Lattice (Pattern 3D, meshes itself at meshPrecision)"]
  I --> B["Core_Bounds (cylinder, radius = coreRadius)"]
  S --> O["Skin_Outer (cylinder)"]
  S --> N["Skin_Inner (cylinder, radius - skinThickness)"]

The Pattern 3D node meshes itself with its own precision, and the Intersection is an ordinary mesh Boolean that trims that mesh to the cylinder. The TPMS example project is built the same way. The skin is a separate ring so the lattice reaches the wall and fuses with it, and coreRadius shrinks the core by the skin thickness only when the skin is on.

Scale, thickness, precision: three different numbers

scale sets how big a cell is, thickness sets how much material each wall carries, and precision sets how finely the result is sampled. They interact in cost and in printability.

Table: Measured on the 40 mm demo puck, gyroid, sheet mode, thickness 0.8.

scale precision Triangles Solve time
0.6 0.75 291,974 1.4 s
0.6 0.6 436,234 2.1 s
0.6 0.35 1,228,926 5.7 s

At a scale of 6 the puck came out solid, because the unit cell was larger than the part and the whole puck sat inside one material region. Scale is a factor, not a millimetre value; find the right one by looking. Precision should stay coarse until the geometry is approved, because a lattice's surface area is enormous and every halving of precision roughly quadruples the triangles. decimation at 0.6 trims the result further without moving the walls.

For FDM, thickness should be at least two extrusion widths, and the cell should be large enough that the slicer draws each wall as a wall rather than a filled gap: cells of 4 mm and up at a 0.4 mm nozzle. Sheet-mode TPMS surfaces are self-supporting because the surface never exceeds a moderate overhang; strut lattices need their struts above the printer's overhang limit or a process that does not care.

Infill and Surface Pattern: the field-only steps

Two post-processing steps apply the same families to an existing solid, and both run only on the SDF solver, so the node that owns them must be evaluated as a field.

Infill keeps an outer skin of shellThickness and fills the interior with a lattice: patternType, sheetMode, patternThickness, and an optional smoothUnion with a smoothness radius that fillets lattice to skin. It is the one-step version of the puck above, on any shape.

Surface Pattern embosses or debosses a family into a surface: depth, patternThickness, mode, and a smoothBlend with blendRadius. The texture families, knurls, dimples and shark skin, are what it is for; a gyroid also works as a decorative relief.

Both steps share the modulation controls: densityMode, thicknessMode and morph can be driven by a radial field, an image, or a point field, so a lattice can thicken toward a load path or morph from gyroid to diamond across a part. The Geometry Nodes article covers the field nodes those controls read.

Pattern 3D lattice demo
Project

Pattern 3D lattice demo

@p12/pattern-3d-lattice-demo
Pattern 3D lattice demo
Pattern 3D lattice demo

Pick a pattern from the picker, then trade cellScale against wallThickness. Switch sheetMode to solid to fill one side of the surface. meshPrecision is the cost dial; the default is deliberately coarse.

@p12/pattern-3d-lattice-demo
Pick a pattern from the picker, then trade cellScale against wallThickness. Switch sheetMode to solid to fill one side of the surface. meshPrecision is the cost dial; the default is deliberately coarse.

Where to go next

The skin around a lattice is the wall-thickness problem of Shell, Hollowing, and Wall Thickness. A lattice that has to leave the browser as a file is the heaviest case in Export for the Slicer. And a pattern applied as texture to a sellable part is one of the option surcharges discussed in Pricing Customized 3D Prints.