---
name: scenario-zbrush-sculpting
description: "Use when an agent sculpts organic forms in ZBrush 2026 (sculpt a head, bust or creature in ZBrush from a sphere, ZSpheres or primitives); when blocking primary and secondary forms, choosing DynaMesh, Sculptris Pro or subdivision levels, or setting ClayBuildup, Dam_Standard, Move or TrimDynamic; when using masks, polygroups, Morph Targets or layers; or when scripted strokes miss, do nothing, come out too strong or leave marks, or a re-DynaMesh does nothing or loses polygroups."
license: MIT
---

# ZBrush sculpting (core forms, scripted strokes)

Expert sculpting goes big to small with gates: light meshes raised in resolution only when the forms ask, clay built across the form in thin low-intensity layers, sharpness last and never on weak shapes. An agent has no pen: it uses exact operations first (primitives, ZSpheres, DynaMesh, masks plus Deformation sliders), then strokes planned from model-space forms, aimed through the view, measured in volume and reviewed after every pass ([`scripts/zb_sculpt.py`](scripts/zb_sculpt.py)). If a sibling skill named here is missing from your available skills, ask the user to install it (`npx skills add scenario-labs/skills --skill <name>`); unattended, proceed from tool schemas and flag the gap.

**REQUIRED BACKGROUND:** scenario-zbrush-expert (bridge, stroke engine, review loop, 2026 traps).

## Stance (the expert delta)

- **Pressure is the hidden setting.** Henning Sanden blocks at ClayBuildup Z 20 with "maybe 30%" of his pen pressure (0PaYUUvgwYM 00:04:58); a scripted stroke has constant pressure. Start clay at Z 6, refine at 2 to 1, calibrate once per session (`zs.run_calibration`), and dial a whole pass after review: a partial Morph value softens it, a negative one exaggerates it (Drust, B_wKwXwjcZs 00:05:20); layer intensity does the same on levels.
- **Clay across the form, lines along it.** Henning: across puts a peak in the center that fades to the edges; along is "drawing the shape" (0PaYUUvgwYM 00:02:13, 00:30:39). Pablo Munoz Gomez builds long masses along first, then smaller strokes across, never a muscle in one stroke (tbQqC6tyDBQ 00:06:32). Each form is a center line plus a width.
- **Standard sets edges, clay builds, ClayBuildup erases.** Standard pushes what is there, so it gives specificity (Henning 0PaYUUvgwYM 00:27:26); ClayBuildup replaces what is under it, never after detail (TpS0QdlfHWU 00:07:44). Pablo sets a hard edge with Standard at raised Z, then blends it with clay (tbQqC6tyDBQ 00:10:27).
- **Refine instead of smoothing, except on low-res blockouts.** Henning removes marks with passes of falling intensity and smooths once at "good enough" (TpS0QdlfHWU 00:22:26, 00:22:58); Pablo smooths freely during blockout (tbQqC6tyDBQ 00:02:29). Low-res S1: a Polish slider; skin from S2 on: the descent.
- **DynaMesh while the forms move, levels once they settle.** A high DynaMesh early is a "lumpy mess" (Pablo tbQqC6tyDBQ 00:04:38) and resolution is relative to object size (FrqUnna1jns 00:13:40). Never Divide a DynaMesh: its triangles and star poles become lumps no smoothing fixes (rArw79xEpvE 00:09:44). ZRemesher a copy, Divide, project.
- **Level discipline.** Big moves at SDiv 1 (at the top a push "looks very wonky"); secondary forms blocked at SDiv 2 or 3, then refined upward level by level; never all the work at the top (Pablo rArw79xEpvE 00:12:28, 00:14:16; tbQqC6tyDBQ 00:12:26). Details never change the silhouette (tbQqC6tyDBQ 00:13:27).
- **Strokeless first.** Pablo builds a whole blockout "without even actually using any of the brushes" (gitoJ7B8FmY 00:05:26). For an agent these are exact: primitives placed by number, ZSpheres by code, masks plus Deformation sliders, Mirror then Mirror And Weld.
- **Mid frequency is where a sculpt is won.** FlippedNormals call it the backbone of detailing; pores added early put you "two levels behind" (G2o6fdoACIQ 00:05:46, 00:08:17). Details "won't fix a weak sculpt" (Pablo tbQqC6tyDBQ 00:12:50).

## Establish first

| Input                                   | What it changes                                                                                                                                                              | Default when the brief is silent |
| --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- |
| Subject                                 | base route and point ladder (`STAGES[...]["points"]`): head, creature                                                                                                        | head bust from a sphere          |
| Purpose                                 | concept: stop at S3 or S4, even quads suffice (tbQqC6tyDBQ 00:11:43); film or game: retopology before micro detail (Zp07GW3rND0 00:08:22); print: scenario-zbrush-pose-print | concept                          |
| Style                                   | realistic: scenario-zbrush-character-creature; stylized: scenario-zbrush-stylized                                                                                            | neutral forms                    |
| Forms list                              | `zs.Form` center lines plus widths, from the brief and the domain skill's proportions                                                                                        | none: ask the domain skill       |
| Head width in model units (`ref_width`) | every brush size                                                                                                                                                             | model width in the front view    |
| Views                                   | front is measured [obj]; others need the live_04 convention                                                                                                                  | front                            |

## Workflow

Every pass: `Scene.capture`, plan (`clay_pass`, `move_pass`, `crease_pass`), `preview_plan` (look at it), `run_plan`, `pass_report`, `zb_review.review`, then name the ONE weakest item and fix it. Save a versioned ZTL at every gate.

0. **Session.** `zb_launch.start()`, neutral state (P1), calibration (P2). Every pass turns perspective (`Draw:Perspective`) and LazyMouse off: its radius swallows the start of a synthesized path (Pavlovich AdkZe1yKFTU 00:03:31). GATE: document zoom 1, calibration present or the v02 prior noted.
1. **S0 base.** One of: a sphere DynaMesh at 128 (about 43k points); a ZSphere armature (`zsphere_code`) with an Adaptive Skin at Density 1 or 2 and DynaMesh Resolution 0 (Pablo), then DynaMesh 64; primitives appended and placed with Geometry Position and Size (P3). GATE: the silhouette reads front and side; points within S0.
2. **S1 primary blockout.**
   - Move then re-DynaMesh (`move_pass`, `remesh_due`, then `remesh_code`, P16: Draw mode, mask cleared, polypaint off so polygroups survive, proof that it remeshed).
   - Clay across the forms (`clay_pass`, preset `clay_block`); sockets as carve forms (`sign=-1`); TrimDynamic planes (`preset="trim"`). Symmetry on: plans cover the +X half.

   GATE: `stage_gate("S1")` passes; the sheet shows right proportions, every element present (G2o6fdoACIQ 00:02:50), big simple masses.

3. **S2 primary refinement.**
   - Resolution up: head by the square law (`next_dynamesh_resolution`) toward 400k to 800k points; creature: MergeDown the pieces (in place; MergeVisible makes a new Tool; its confirmation may block the bridge [verify], so ZTL first), DynaMesh 256.
   - Descent passes Z 6, 3, 2, 1, zooming in on each region (`descent`, P7); TrimDynamic on junk bumps.
   - Eyes (P17): eyeball spheres placed by number, each turned 3 to 7 degrees outward (Costa j5XLtLMN0P8 00:29:10); lids cut with Dam_Standard, then moved out so they wrap the ball (Henning TpS0QdlfHWU 00:18:33). Henning shapes them with perspective on (00:17:28): strokes stay orthographic, the read is `persp_snapshot_code`.
   - Checkpoint risky passes and dial them (P8) before any re-DynaMesh, ZRemesher or Divide: a point-count change destroys the Morph Target, and `dial_code(..., expect_points=)` refuses.

   GATE: clean shapes under Red Wax, no stretched faces, stroke marks falling.

4. **Leave DynaMesh** when the forms are settled and S3 needs levels, retopology is coming, or later big changes must survive detail. Henning's DynaMesh-only ladder to 648 suits a concept still: state which route and why. Levels (P11): versioned ZTL, Duplicate, ZRemesher the copy, Divide until `projection_ready`, then the toolkit's `zb_ops.project_all(checkpoint=...)`, which carries the safe order (versioned save, StoreMT and a New Layer at the top level, PA Blur lowered, a gate, `morph_repair`); never re-implement it.

   GATE: target points at least the sketch's, volume within 1 % [added], the sheet unchanged, eyes and mouth checked level by level (repair: scenario-zbrush-retopology-export).

5. **S3 secondary.**
   - On levels (P15): `level_for("secondary")` (SDiv 2 or 3), then `"refine"` one level up at a time; big fixes return to `level_for("big")` = SDiv 1; the top level only for tertiary and layers.
   - Symmetry off for the asymmetry pass; `pattern="two_direction"` on long masses; preset `clay_secondary`.

   GATE: `mirror_asymmetry` above zero, the mid band above S2, the sculpt reads at thumbnail size without detail.

6. **S4 contrast.** Dam_Standard along the creases (`crease_pass`), deeper than feels right (0PaYUUvgwYM 00:19:49); Standard at raised Z on lids, lips and brow edges (`preset="standard"`), blended with clay; `fill_between` two cuts. GATE: shape IoU against S3 of at least 0.98 [added]; crease depth varies along the line.
7. **Hand off** S5 and S6 to the domain skill with the P14 package.

## Numbers

| Value              | Number                                                                                                                                       | Relative to                                                                                                                      | Source                                     |
| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
| Scripted Z, clay   | block 6, refine 2, finish 2; descent 6, 3, 2, 1                                                                                              | expert Z times 0.3 pressure                                                                                                      | Henning 00:04:58; digest derivation        |
| Brush diameter     | clay block 15 to 35 %, secondary 10 to 15 %, refine 3 to 8 %, Dam 3 to 7 %, Standard 1 to 2 %, Move design 60 to 90 %, Move local 10 to 15 % | head width in view (Draw Size is canvas pixels: `zb_sculpt` converts through ppu); clay kept within 0.5 to 1.0 of the form width | FlippedNormals frames; digest T1           |
| ClayBuildup        | FreeHand, Focal -56, Alpha 06 or Off; Imbed 20, Roll Dist about 6                                                                            |                                                                                                                                  | Henning; Morten; Pablo frame 00:05:55      |
| Dam_Standard       | Dots, Focal -14, Zsub, Z 15 (33 for big cuts)                                                                                                | "ten below where it starts"                                                                                                      | 0PaYUUvgwYM 00:18:42; TpS0QdlfHWU          |
| Move / TrimDynamic | Focal 0, Z 51 / Focal -56, Z 43 lowered, Zsub                                                                                                |                                                                                                                                  | TpS0QdlfHWU frames                         |
| Head point ladder  | 43k sphere, 96k to 99k S1, 400k to 826k S2, 1.6M to 2.46M S3 and S4                                                                          | points                                                                                                                           | FlippedNormals frames                      |
| Creature ladder    | skin 6k, pieces 28k to 43k (DynaMesh 64 to 128), merged 256 = 367k, SDiv 5 = 3.8M                                                            | points                                                                                                                           | Pablo tbQqC6tyDBQ frames                   |
| DynaMesh           | points grow with resolution squared; limits: details safe in a 1024 cube, cap 2048 (about 24M polys)                                         | bbox longest side; per SubTool                                                                                                   | TpS0QdlfHWU ladder; DynaMesh doc           |
| Divide, ZRemesher  | x4 per level; target in thousands, 5 gave 4,963                                                                                              |                                                                                                                                  | Pablo rArw79xEpvE 00:03:16                 |
| SDiv per operation | big moves 1; secondary 2 or 3; tertiary and layers top                                                                                       | levels of the stack                                                                                                              | Pablo rArw79xEpvE 00:12:28, 00:14:16       |
| Projection         | target points at or above the sketch's (745k vs 400k); FlippedNormals about 3M                                                               |                                                                                                                                  | VRisbJQAaZw 00:17:24; Zp07GW3rND0 00:01:02 |
| Eye angle          | 3 to 7 degrees outward each, about 5                                                                                                         | straight ahead                                                                                                                   | Costa j5XLtLMN0P8 00:29:10                 |
| Pass gates         | dead strokes up to 10 %; re-DynaMesh at 1.5 x edge cv; Polish drift 2 %                                                                      |                                                                                                                                  | [added]                                    |

## Quality gates

- **Measured:** `pass_report` after every pass (dead strokes, volume sign, view drift, pivot shift, settings not found); `remesh_code(...)["ok"]`; points against `STAGES` and the SDiv for the operation; `stage_gate` (budget, big Move above SDiv 1, shape IoU, asymmetry, bands); `zb_audit.verdict(..., "sculpt")`; `remesh_due`, Polish drift, `projection_ready`.
- **Seen:** the review sheet in MatCap Gray (front, right, back, three-quarter, top); Flat Color silhouettes and the sheet at thumbnail size; a grazing view, Red Wax for marks, a Standard material under a moving light (MatCaps bake their light) or BPR for form reading; the perspective look render for eyes; the stage checklist in [`references/critique.md`](references/critique.md). Never call a stage done without looking at its sheet.

## Common mistakes

| Mistake                                                 | What it looks like                                  | Fix                                                                |
| ------------------------------------------------------- | --------------------------------------------------- | ------------------------------------------------------------------ |
| Expert Z as a script Z (ClayBuildup 20)                 | harsh ridges, one-stroke muscles                    | Z 6, calibrate, dial the pass                                      |
| Clay dragged along the form                             | drawn grooves, no volume                            | `clay_pass` hatches across                                         |
| Stroke starting off the model                           | strokes change nothing, the view may turn           | plans clip to the canvas mask; re-capture                          |
| LazyMouse left on                                       | stroke starts missing, short strokes dead           | `pass_spec` default `lazymouse=False`                              |
| Smoothing marks away on skin                            | "semi smooth with details", volume loss             | descent passes; Polish only low-res or at a lower SDiv             |
| ClayBuildup over finished detail                        | lines and pores erased                              | Standard for edges; clay before detail                             |
| Dividing a DynaMesh                                     | lumps, star poles                                   | ZRemesher, Divide, `project_all`                                   |
| Big Move at the top level                               | wonky lumps                                         | `level_for("big")`, then back up                                   |
| Re-DynaMesh with a mask on or in Move mode              | nothing remeshes (the gesture only clears the mask) | `remesh_code`                                                      |
| DynaMesh with polypaint on                              | polygroups gone after the remesh                    | `keep="groups"` (Colorize off), or `"polypaint"`: never both       |
| Morph dial after a remesh or Divide                     | the target is gone                                  | dial first; `expect_points`                                        |
| Symmetry assumed after a SubTool change                 | the stroke lands on one side                        | it is per SubTool (Pablo RABWfzWNw0c 00:27:02): every pass sets it |
| `Brush:Smooth` picked as the brush                      | nothing smooths (it only becomes the Shift brush)   | Deformation Polish, lower SDiv                                     |
| Mirror And Weld with LSym on, or the bad side as source | mirrors locally or copies the bad side              | LSym off; Deformation Mirror first (9a9S1OcYHx4 00:09:35)          |

## Handoffs

- **Receives:** from scenario-zbrush-expert a session, brief and versioned ZTL; from scenario-zbrush-retopology-export a cleaned AI or scan mesh (scenario-3d meshes arrive this way); from domain skills proportions and the forms list.
- **Delivers** the P14 package (versioned ZTL, `stats()`, last sheet, forms as JSON, calibration, gate): realistic S3 or S4 forms on levels to scenario-zbrush-character-creature; shape-language work and hair to scenario-zbrush-stylized; organic bases to scenario-zbrush-hard-surface; a finished sculpt to scenario-zbrush-retopology-export.

## ZBrush 2026 notes

- Perspective is `Draw:Perspective` (installed commands.xml); `Transform:Persp` does not exist (`zs.PERSP_PATHS`). PolyFrame is `Transform: Pf`.
- `Brush:Dam_Standard` does not resolve [v03]; `zb_ops.select_brush("Dam_Standard")` finds DamStandard.
- Smooth brushes only bind to Shift and `press_key` does not work: Zsub replaces Alt, Deformation Polish replaces Shift, Masking buttons and Mask Changed Points [verify] replace Ctrl gestures.
- No undo control (`merge_undo` is a stub): Morph Target or layer per pass, versioned ZTLs per stage.
- Gizmo deformers and Transpose drags are GUI-only; the Gizmo deforms softly unless Focal Shift is -100. Local Symmetry follows the Gizmo: off before Mirror And Weld.
- Sculptris Pro: no levels; Dots, FreeHand and Spray only. Chisel's default stroke changed in 2025.1: every pass sets its stroke type.

## References

- [`references/procedures.md`](references/procedures.md): bridge code per step (P0 to P17) with its live test. Load before writing bridge code.
- [`references/expert-notes.md`](references/expert-notes.md): the experts in depth and the disagreement table. Load when choosing between approaches.
- `references/critique.md`: per-stage rubric, AI-mesh judgment, stroke-plan review. Load at every gate.
- [`references/gui-paths.md`](references/gui-paths.md): hotkeys, palette paths and brush settings (computer-use agent).
- [`references/sources.md`](references/sources.md): sources, credentials, URLs, timestamps.
- `scripts/zb_sculpt.py`: stages, presets, Scene, generators, calibration, pass execution, remesh, levels, review metrics. Tests: `tests/code/zbrush-sculpting/` (offline passed; live not yet run in ZBrush).
