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.
Installs into .claude/skills of the current project.
Are you the author of Scenario Zbrush Sculpting?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/scenario-labs-scenario-zbrush-sculpting)
---
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).