Skip to content

Articles

How to snap objects to a 3D grid in Godot

Snap LEGO-style bricks, furniture, and structures to a 3D GridMap with Grid Placement: mounts, previews, rotation, and validation.

This recipe snaps 3D objects to a grid the way building bricks snap together: pick a piece, hover the grid, watch a live preview lock to cells and faces, rotate it into place, and confirm. Grid Placement 6.1 owns the whole loop (targeting, preview, validation, commit, save) so your game only supplies the placeable pieces and any house rules on top.

1. Pick GRID, not SMOOTH

Grid Placement 6.1 places 3D objects in two coordinate modes. GRID aligns to cells and structural mounts: floors, walls, fences, crates, and anything that must sit on the lattice. SMOOTH places at free world-space positions for clutter, rocks, and organic props where the grid should not decide.

Snapping to a 3D grid is GRID mode by definition. If your objects need brick alignment, do not start in SMOOTH and round positions by hand: you would rebuild occupancy, mount validity, and save identity that GRID already provides. The detailed tradeoff lives in Grid vs Smooth Placement.

2. Choose the mount for each piece

PlacementSnapProfile3D.SnapMode controls where a GRID entry attaches. Match each placeable to the mount that fits its shape:

Mode Meaning Typical use
CELL Occupies a GridMap cell or footprint floor, foundation, crate
EDGE Occupies a canonical edge between neighboring cells wall, fence panel, door frame
FACE Mounts to a supported provider face window, shutter, wall decoration
CORNER Occupies a canonical XZ grid intersection structural corner post
TOP Occupies the top of a host EDGE, or the cell-centered ridge roof plane, gable, ridge cap

EDGE and FACE occupancy is canonical from either neighboring cell, so the same physical edge cannot be double-booked from the other side. A FACE provider must explicitly expose mountable faces, and the consumer profile must accept that provider family. Author these relationships in the ScenePlacementEntry and its snap profile up front; placement then enforces them every time.

3. Run the placement loop

A normal GRID placement follows one path:

  1. Select a ScenePlacementEntry.
  2. Target a GridMap cell or mount (surface scanning resolves the hovered surface into a placement position; see 3D Surface Scanning).
  3. Show the placement preview with validation feedback.
  4. Rotate yaw when the entry allows it.
  5. Confirm placement.
  6. Record occupancy, mount data, transform, and stable placement identity.

Preview and commit use the same placement result. If the world changes before confirmation, the final validation result decides. Core validation (footprint occupancy, mount validity, snap and provider rules, ground, support, and slope policy) runs inside the plugin; the UI consumes the current placement result instead of duplicating any check. Game-side policy such as costs, unlocks, or protected zones layers on top through game-authored rules, as Placement Rules describes.

4. Save placements, not previews

Committed objects use PlaceableInstance for stable placement identity and base serialization data: node name, transform, originating entry, placement id, and GRID occupancy and mount data. Preserve all of it to rebuild the same object on load, and keep game-owned data alongside in your own save wrapper. Never save placement previews or temporary manipulation copies as committed objects. The full contract is in Save and Load.

Common mistakes

  • Rounding SMOOTH positions to fake snapping. Use GRID and get occupancy, mounts, and stable ids with it.
  • Rebuilding occupancy or slope checks in UI code. Read the placement result; the plugin already validated.
  • Saving preview nodes. Only committed PlaceableInstance records restore.
  • Skipping the snap profile and validating mounts by hand. Author the profile; placement enforces it.
  • Treating terrain painting as object placement. Terrain cells paint by catalog name (see 3D Terrain Painting); objects place by entry.

Try the demo

The Grid Placement demo runs this loop live: entry selection, surface targeting, ghost preview with validation feedback, rotation, commit, and save-safe restore. Try it in your browser on the Grid Placement itch.io page before wiring your own pieces.