Loading...
Loading...
Use when an agent drives Maxon ZBrush 2026 for any task (sculpt in ZBrush, DynaMesh, ZRemesher, UVs, export, polypaint, posing, 3D print, clean up an AI mesh in ZBrush), when writing ZBrush Python (zbrush.commands) or ZScript, when the ZBrush bridge is not answering, a palette path or set() does nothing, a scripted stroke does not sculpt or a dialog blocks a script, or when a ZBrush result has to be judged the way a professional artist would.
npx skill4agent add scenario-labs/skills scenario-zbrush-expertscripts/skill_get| Channel | Use for | Rules |
|---|---|---|
Bridge into a running ZBrush ( | all interactive work: palette operations, strokes, renders, measurements | |
| unattended jobs on saved files (export every SubTool, reports) | |
zbcruncallupdate(redraw_ui=True)start()message_*ask_*show_note(..., 0)set_notebar_text(text, progress)runcallsys.pathsys.modulessys.pathzb_launch.runzb_launch.hygiene()purge()zb_ops.sequence([["divide", [2]], ["polish", [10]]])freezeshow_actions(0)quiet()frozen(fn)update(redraw_ui=True)Document:Exportscreencapturestart()zb_launch.pyzbrush_info(0)| Action | Status | Substitute |
|---|---|---|
| Press, set and read palette items by path (DynaMesh, Divide, masks, exports) | yes, proven (v01, v03) | always |
Synthesized strokes | yes, proven (v02: volume 4.189 to 4.193) | |
| Replaying a recorded stroke with an offset | yes (v01: volume 4.184 to 4.189); rotation and scale [doc] | |
| no (v01: no change) | |
| Dialog-free canvas PNG and OBJ export | yes (v03: 0.04 s, 0.08 s) | |
| ZTL save by path | path exists, dialog-free [verify] | |
| Aiming strokes at model points | front view measured on the v03 OBJ; other views [verify live_04] | |
| Pen pressure in strings | unknown [verify live_02] | Draw:Z Intensity and Draw Size per stroke |
| Smoothing by stroke (Shift) | no: a Smooth brush only becomes the Shift brush | |
| ZModeler polygon clicks, Gizmo drags, pivot placement | no | Deformation sliders, Geometry X/Y/Z Position and XYZ Size, DynaMesh with Booleans, ZRemesher; else hand to a human or computer-use agent |
| Text prompts (SubTool Rename, New Folder) | no | name parts at creation; |
| FBX export options dialog | no ("You cannot escape any GUI", Maxon forum) | OBJ or |
| no ("Does not work" in the stub) | ZScript macro with |
| no ("Not implemented") | versioned ZTL saves, |
| Mask, layer, polygroup data | no API (Maxon forum 2026) | buttons plus visual checks; OBJ export for geometry |
| UV Master and Decimation Master presses | paths exist; return of control [verify live_08, live_09] | native |
set_transformzb_ops.stats()zb_audit.audit()gateget_polymesh3d_volume()is_polymesh3d_solid()zb_ops.require_gate(r)zb_review.review(out_dir)zb_ops.project_all(checkpoint="/abs/x.ztl")morph_repair(points)zb_ops.ensure_edit().ZTLzb_ops.save_ztl(path)_vNNN.ZPR.bakzbc.config()zbc.reset()| Brief | Skill chain | Delivers |
|---|---|---|
| Realistic character or creature | scenario-zbrush-sculpting, scenario-zbrush-character-creature, scenario-zbrush-retopology-export, scenario-zbrush-paint-render | ZTL stack, maps, renders |
| Stylized character or collectible | scenario-zbrush-sculpting, scenario-zbrush-stylized, then scenario-zbrush-pose-print or scenario-zbrush-paint-render | sculpt, print parts or renders |
| Hard-surface prop or weapon | scenario-zbrush-hard-surface, scenario-zbrush-retopology-export | high poly, game low poly, bakes |
| Retopology and export of a sculpt | scenario-zbrush-retopology-export | clean low poly, UVs, maps, OBJ or GoZ |
| AI-generated mesh cleanup | audit with zb_audit, scenario-zbrush-retopology-export (repair, remesh, project), scenario-zbrush-sculpting (forms) | clean sculpt worth detailing |
| Posing and 3D print | scenario-zbrush-pose-print | posed, hollowed, keyed parts in mm (STL or 3MF) |
| Polypaint, render, presentation | scenario-zbrush-paint-render | BPR or Redshift renders, turntables |
| Batch jobs, GoZ round trips, reports | scenario-zbrush-automation | scripts, |
stats()scripts/zb_launch.pystartpingstop(save_to)is_runningstatusscreen_lockeddiagnoserun(code, modules)call(module, func, *args)hygienepurgepython3 zb_launch.py start|ping|status|stop|runzb_ops.pynew_spheredynameshdividedel_levelszremesherproject_alltop_levelstore_morph_targetnew_layerset_layer_intensitymorph_repairpolishdeformmaskpolygroupsvisibilityuv_unwrapdecimateexport_objexport_canvassave_ztlselect_brushfind_brushset_drawset_materialset_symmetrysculpt_strokestatssubtoolsgaterequire_gatequietfrozensequencePATHSzb_stroke.pyencodedecodelinepolylinearczigzagdabresampleclip_to_canvasCamera(transform, pivot).project(p)frame_transformvisible_maskfront_most_vertexfit_conventionVIEWSzb_review.pyreview(out_dir, views, matcap)capture_viewssnapshot(path)contact_sheetsilhouette_bboxzb_audit.pyaudit(obj)verdict(report, "sculpt"|"game"|"print", ...)displaced(a, b)python3 -m unittest discover -s tests/code/zbrush-expert -p "test_*.py"references/sdk-cookbook.mdtests/code/zbrush-expert/run_live.sh# not yet run in ZBrush as a sequence
import sys; sys.path.insert(0, "<this skill>/scripts")
import zb_launch as zl, zb_review, zb_audit
zl.start()
zl.call("zb_ops", "new_sphere", 128)
zl.call("zb_ops", "sculpt_stroke", [[500, 380], [620, 380]], brush="ClayBuildup", size=40,
z_intensity=25)
sheet = zb_review.review("/abs/out/stage1")["sheet"] # look at it
obj = zl.call("zb_ops", "export_obj", "/abs/out/stage1.obj")
print(zb_audit.verdict(zb_audit.audit(obj["path"]), "sculpt"))
zl.call("zb_ops", "save_ztl", "/abs/out/head.ztl") # head_v001.ztl
zl.stop()set()Transform:FrameBrush:Dam_StandardTransform:Fitzb_ops.select_brush("Dam_Standard")Transform:PfTransform: PfDraw:PerspectiveTransform:PolyFTransform:Perspquery_mesh3d()int(zbc.query_mesh3d(1)[0])Logs/Activityreferences/sdk-cookbook.mdreferences/zbrush-2026-traps.mdreferences/sources.md