{"slug":"scenario-zbrush-pose-print","title":"scenario-zbrush-pose-print","summary":"Use when posing a sculpt or preparing it for 3D printing in ZBrush: \"pose this character\", Transpose Master, TPoseMesh, Gizmo posing with masks, ZSphere rig, Proxy Pose, weapon in the hand, stretching after posing, \"3D print this\", 1/6 scale statue, miniature, resin or FDM, hollo","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-10-17T09:10:59.047988Z","repo":{"url":"https://github.com/scenario-labs/skills","stars":1035,"forks":129,"license":"MIT","updatedAt":"2026-10-17T05:01:44Z"},"bodyHtml":"<hr>\n<h2>name: scenario-zbrush-pose-print\ndescription: 'Use when posing a sculpt or preparing it for 3D printing in ZBrush: \"pose this character\", Transpose Master, TPoseMesh, Gizmo posing with masks, ZSphere rig, Proxy Pose, weapon in the hand, stretching after posing, \"3D print this\", 1/6 scale statue, miniature, resin or FDM, hollowing, wall thickness, drain holes, keys and pins, cutting into parts, 3D Print Hub, Scale Master, Decimation Master, STL or 3MF, size in millimeters.'\nlicense: MIT</h2>\n<h1>ZBrush posing and 3D print</h1>\n<p>Expert level means a pose that stands and reads, transferred onto every SubTool without losing a level, and print parts whose size, walls, fits and cavities were measured in millimeters on the exported files. The stance: turn every decision into a number the agent can check (scale, point order, joint angles, walls, gaps), keep the pose reversible, use strokes only for cleanup. If a sibling skill named here is missing from your available skills, ask the user to install it (<code>npx skills add scenario-labs/skills --skill &lt;name&gt;</code>); unattended, proceed from tool schemas and flag the gap.</p>\n<p><strong>REQUIRED BACKGROUND:</strong> scenario-zbrush-expert (bridge, stroke engine, review loop, 2026 traps).</p>\n<h2>Stance (the expert delta)</h2>\n<ul>\n<li><strong>Gaboury: scale is the first decision.</strong> SubTool number one is a box at the client's size; nothing may clip out of it, and the whole tool resizes in one step because sizes change late (6 in with 15 points of articulation became 4 in with 8). Agent form: <code>brief_box</code>, <code>zb_print.envelope</code>, <code>set_export_scale(target_mm)</code>.</li>\n<li><strong>Munoz Gomez: pose at the lowest level, several SubTools through Transpose Master, the pose on a 3D Layer.</strong> Plates and carried props (weapon, shield, staff) stay IN the TPose mesh as rigid pieces (Auto Groups, one group per loose piece, masked whole); Move Topological clears intersections. Plouffe forbids deforming primitives, not moving them rigidly: never pull a carried prop out and re-place it with one rotation.</li>\n<li><strong>Maxon doc: two things destroy a transfer:</strong> a partially hidden SubTool (Vertex Mismatch) and Gizmo 3D deformers on the TPose mesh (they reorder points; SubTools die on TPose&gt;SubT). Pavlovich: \"The order of the vertices is very important.\" Start from a clean project, save the ZPR while a TPose mesh exists (the Transpose Master data lives there).</li>\n<li><strong>Plouffe: parts that bend together need the same polygon size at level 1</strong> (mask blur spreads per polygon). Re-place bolts and discs after bending. Spend detail only where the final size and viewing distance show it.</li>\n<li><strong>Pavlovich: DynaMesh without levels = Proxy Pose plus a ZSphere rig.</strong> Location beats size, helpers hold volume, rotate only.</li>\n<li><strong>Gaboury: never hollow the 9M sculpt.</strong> Shell a light DynaMesh copy (128 was enough for a 9 in car), keep its inner wall, Polish it, subtract it from the untouched detailed part in Live Boolean. Create Shell Thickness is not millimeters: measure.</li>\n<li><strong>Bennett (Hasbro): 1 mm minimum wall (0.85 mm was flagged), 0.5 mm edges, 0.12 mm fit offset for Formlabs parts;</strong> thin walls are thickened from the inside so the outside does not change.</li>\n<li><strong>Gaboury: decimate by eye</strong> (about 1M per mesh is plenty; 10k to 20k triangles can still print); masks on the detail that matters (face, hands) steer Decimation Master; pre-process again after any edit; vent every cup on SLA.</li>\n</ul>\n<h2>Establish first</h2>\n<table>\n<thead>\n<tr>\n<th>Input</th>\n<th>Why it changes the plan</th>\n<th>Default when the brief is silent</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Process: resin (SLA, MSLA), FDM, molded or cast</td>\n<td>walls, clearance, hollowing, shrink (Hasbro sculpts PVC at 104 %); molds add Hasbro's rules: touching fingers lock the mold, Group Front shows the parting line, Draw Draft Analysis shows draft</td>\n<td>resin, direct print</td>\n</tr>\n<tr>\n<td>Size: ratio and real height, envelope W x H x D, base included or not</td>\n<td>export scale, brief box, feature floor</td>\n<td>1/6 = standing height / 6 (1,800 mm gives 300 mm), measured on the rest pose</td>\n</tr>\n<tr>\n<td>Printer volume, slicer caps</td>\n<td>splits (Gaboury split a car for the Form 2 bed); polycount or file caps (his example: 50 MB)</td>\n<td>ask; report each part's size</td>\n</tr>\n<tr>\n<td>Parts: one piece or kit, glued or pegged</td>\n<td>cuts and keys (Carratala plans cuts while sculpting)</td>\n<td>natural breaks (collar, belt, cuffs, weapon at the hand), two keys per glued joint [added]</td>\n</tr>\n<tr>\n<td>Pose source; alternate poses</td>\n<td>route and layers</td>\n<td>one layer per pose</td>\n</tr>\n<tr>\n<td>Deliverable</td>\n<td>STL has no units; 3MF declares them</td>\n<td>STL and 3MF per part in mm, JSON report</td>\n</tr>\n</tbody>\n</table>\n<h2>Posing without a mouse</h2>\n<p>The artists' default (Ctrl+click a polygroup, drag a Gizmo ring) is a canvas gesture. The SDK cannot read mask data, and <code>press_key</code> is documented but marked \"Does not work, hidden for now\" in the installed 2026 stub (with <code>canvas_click</code> it is reported unreliable, Maxon forum). Routes by determinism:</p>\n<table>\n<thead>\n<tr>\n<th>Route</th>\n<th>When</th>\n<th>How</th>\n<th>Status</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>A. Numeric external rig (Munoz Gomez's Blender route, made exact)</td>\n<td>humanoids, extreme or many poses</td>\n<td>TPoseMesh, <code>export_tpose</code>, <code>loose_pieces</code> weighted rigidly to one bone each, scenario-blender-rigging poses by angle and returns the same order, <code>import_pose</code>, TPose&gt;SubT</td>\n<td>deterministic; guards tested offline</td>\n</tr>\n<tr>\n<td>B. ZSphere rig by code</td>\n<td>in ZBrush, organic, or DynaMesh via Proxy Pose</td>\n<td>joints from polygroup borders, <code>zs_build</code>, forward kinematics <code>zs_pose</code></td>\n<td>FK tested; bound mesh following API edits [verify live_p02]</td>\n</tr>\n<tr>\n<td>C. Whole-SubTool rigid moves</td>\n<td>a base, a stand, a prop added after posing</td>\n<td><code>rotate_subtool_matrix</code> (X, Y, Z) plus <code>translate_subtool</code>, the carrier's whole transform, corrected from exports</td>\n<td>math tested; signs [verify live_p03, p08]</td>\n</tr>\n<tr>\n<td>D. Mask plus Gizmo or action line</td>\n<td>cleanup by a computer-use agent or a human</td>\n<td>Ctrl+click group, Alt pivot, drag</td>\n<td>weak for this agent</td>\n</tr>\n</tbody>\n</table>\n<p>Weak without a human: gesture design, Plouffe's hand-painted gradient masks, large fold redesign. Seam smoothing and Move Topological have agent forms in <code>procedures.md</code> P6, still [verify].</p>\n<h2>Workflow</h2>\n<p><code>zb_pose.call(\"name\", ...)</code> runs inside ZBrush; <code>zb_print</code> runs on exported OBJs; full code in <a href=\"references/procedures.md\"><code>references/procedures.md</code></a>.</p>\n<ol start=\"0\">\n<li><strong>Intake.</strong> Versioned ZTL, <code>inventory()</code>, target and envelope in mm. GATE: every SubTool named, unique, with points and levels.</li>\n<li><strong>Scale.</strong> <code>set_export_scale</code>, <code>export_parts</code>, <code>check_scale</code>, then <code>brief_box</code> (hidden while exporting). GATE: height within 0.5 % [added], one export scale on every part (a part appended from another ZTool arrives at another scale), <code>envelope</code> ok, named dimensions checked with <code>caliper</code>.</li>\n<li><strong>Pose prep.</strong> <code>clean_project</code> (ZTL saved, default project, Load Tool); polygroup every segment, plates and props left as loose pieces; <code>preflight_tpose</code>. GATE: preflight ok, density spread under 2x [added]. No levels: scenario-zbrush-retopology-export or Proxy Pose.</li>\n<li><strong>Pose.</strong> <code>tpose_mesh(layer=True, groups=True)</code> with props and plates visible, <code>export_tpose</code> (the order reference), <code>save_project</code>; route A or B, center first, parents before children, rotations only; no Gizmo deformers. GATE: <code>rigid_pieces</code> ok, <code>follows</code> puts each carried prop where its carrier took it (0.5 mm [added]), <code>piece_interference</code> empty or listed for P6, <code>tpose_to_subtools(expected, rest_obj)</code> passes its order guard and point counts, <code>rigid_delta</code> within 2 degrees of the plan [added], <code>balance</code> stands or a base is planned; review sheet: silhouette and weight read (Plouffe: an unstable pose \"destroys the entire work\").</li>\n<li><strong>Fix deformation.</strong> New layer at the top level. Seam first while the rest is protected (Munoz Gomez smooths and moves before clearing the mask); then volumes and folds re-sculpted for the new pose (tension from the stretched joint, compression on the inner bend [added]); re-place primitives; Move Topological on pieces; pose-specific detail on a pose-only layer, because layers blend linearly. GATE: <code>stretch_report</code> near the rest pose, <code>piece_interference</code> ok, Polyframe tiles.</li>\n<li><strong>Breakdown.</strong> Parts at natural breaks; merge what prints as one (Live Boolean union or DynaMesh on light copies: Hasbro engineers on decimated meshes). Molded: loops, parting line, draft. GATE: each part closed, fits the build volume.</li>\n<li><strong>Hollow when asked.</strong> <code>hollow_copy</code> (insert inside, DynaMesh about 128, Create Shell), <code>keep_inner_shell</code>, Live Boolean: detailed part start, inner shell, drain and vents subtract; thin ends stay solid. Too thin: move the cutter inward, never the outside. GATE: <code>thickness</code> p01 at the wall target, no sealed cavity for resin, <code>outer_drift</code> ok, vents at cups.</li>\n<li><strong>Cut and key.</strong> Cutter QCube in Live Boolean or a polygroup split then Close Holes [added]; <code>plan_keys</code>; socket = peg grown by 2 x clearance. GATE: <code>clearance</code> median at target, no interference; one key pair test-printed before the kit (Gaboury).</li>\n<li><strong>Decimate.</strong> Unique names; per-SubTool budgets, masks before Pre-process (<code>mask=\"cavity\"</code> [added]), pre-process after any edit. GATE: faces within budget, <code>deviation</code> p99 under the printer's XY resolution [added], close-ups before and after.</li>\n<li><strong>Deliver.</strong> STL and 3MF per part in mm, <code>print_report(..., envelope_mm=...)</code>, a review tile at real size (detail under the process floor is backfilled, fused or left to paint: Hasbro). GATE: <code>print_report[\"ok\"]</code>, every \"to look at\" item looked at, unit stated.</li>\n</ol>\n<h2>Numbers</h2>\n<table>\n<thead>\n<tr>\n<th>Item</th>\n<th>Value</th>\n<th>Source</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Minimum wall</td>\n<td>1 mm; 0.85 flagged</td>\n<td>Hasbro, PVC and Formlabs copies</td>\n</tr>\n<tr>\n<td>Edges after trimming</td>\n<td>0.5 mm; about 0.2 mm floats away</td>\n<td>Hasbro</td>\n</tr>\n<tr>\n<td>Fit offset</td>\n<td>0.12 mm (Formlabs); Inflate 2 gave it in his ZTool</td>\n<td>Hasbro, calibrate per ZTool</td>\n</tr>\n<tr>\n<td>Shell copy</td>\n<td>DynaMesh 64 too low, 128 enough (9 in car); Thickness 4 then 6</td>\n<td>Gaboury</td>\n</tr>\n<tr>\n<td>From Thickness</td>\n<td>Min 1, Max 5 once scaled to mm</td>\n<td>Maxon doc</td>\n</tr>\n<tr>\n<td>Decimation</td>\n<td>about 1M per mesh; 2.7M to 545k at 20 % unchanged; 8k faceted</td>\n<td>Gaboury</td>\n</tr>\n<tr>\n<td>Decimation quality</td>\n<td>40 to 100 % near identical, 2 to 40 % visible</td>\n<td>Maxon doc</td>\n</tr>\n<tr>\n<td>Scale with shrink</td>\n<td>height / 12 + 4 % for a 6 in PVC figure</td>\n<td>Hasbro</td>\n</tr>\n<tr>\n<td>Proxy Pose skin</td>\n<td>Adaptive Skin Density 1, DynaMesh Resolution 0</td>\n<td>Pavlovich</td>\n</tr>\n</tbody>\n</table>\n<h2>Quality gates</h2>\n<ul>\n<li><strong>Measured</strong> (<code>zb_print</code> on OBJs in mm): watertight, volume, thin-wall share (0.2 % of samples [added]), sealed cavities, floating shells, height, envelope, one export scale, build volume, clearance, balance, faces, outer drift. Pose: point order, <code>rigid_pieces</code>, <code>follows</code>, <code>piece_interference</code>, <code>rigid_delta</code>, <code>stretch_report</code>.</li>\n<li><strong>Visual</strong> (scenario-zbrush-expert <code>zb_review.review</code>, MatCap Gray, five views): gesture and balance; joints with Polyframe; primitives round; the grip closed around the handle; the brief box shown once; From Thickness on a copy; every listed spot; decimated close-ups. Judge with <a href=\"references/critique.md\"><code>references/critique.md</code></a>.</li>\n</ul>\n<h2>Common mistakes</h2>\n<table>\n<thead>\n<tr>\n<th>Mistake</th>\n<th>What it looks like</th>\n<th>Fix</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Top-level pose, rough mask, mask cleared too early</td>\n<td>stretched, overlapping polygons</td>\n<td>lowest level, blurred mask, Smooth and Move the seam before clearing (Munoz Gomez)</td>\n</tr>\n<tr>\n<td>Carried prop pulled out of the TPose mesh, turned by one angle afterwards</td>\n<td>a sword beside a raised, bent hand; <code>interference</code> 0 still passes</td>\n<td>keep it in the TPose mesh as a rigid piece; else the carrier's whole transform, gate <code>follows</code></td>\n</tr>\n<tr>\n<td>Partly hidden SubTool at TPoseMesh</td>\n<td>Vertex Mismatch</td>\n<td><code>preflight_tpose</code> (ShowPt on all)</td>\n</tr>\n<tr>\n<td>Gizmo deformer on the TPose mesh</td>\n<td>destroyed SubTools; a point count check misses a reorder</td>\n<td>rotations or rigs; the order guard refuses the transfer</td>\n</tr>\n<tr>\n<td>Session closed with a TPose mesh, no ZPR</td>\n<td>no way back to the SubTools</td>\n<td><code>save_project</code> right after TPoseMesh</td>\n</tr>\n<tr>\n<td>Neutral-pose detail shown on the pose</td>\n<td>soft, stretched detail at bends</td>\n<td>refine on a pose-only layer (linear blend)</td>\n</tr>\n<tr>\n<td>Create Shell numbers read as mm; insert touching the surface</td>\n<td>wrong walls; one joined piece</td>\n<td>measure <code>thickness</code>; insert inside, drain as a cutter</td>\n</tr>\n<tr>\n<td>Wall thickened from outside</td>\n<td>the sculpt drifts</td>\n<td>move the cutter inward, check <code>outer_drift</code></td>\n</tr>\n<tr>\n<td>Mask or edit after Pre-process</td>\n<td>decimation ignores it</td>\n<td>pre-process again (the wrapper always does)</td>\n</tr>\n<tr>\n<td>No clearance on keys</td>\n<td>\"20 discs to sand before noon\" (Hasbro)</td>\n<td>0.12 mm offset, measured, test print</td>\n</tr>\n<tr>\n<td>STL without a unit</td>\n<td>150 mm printed as 150 in</td>\n<td>say mm, or ship 3MF</td>\n</tr>\n</tbody>\n</table>\n<h2>Handoffs</h2>\n<ul>\n<li><strong>Receives</strong> from scenario-zbrush-sculpting, scenario-zbrush-character-creature, scenario-zbrush-stylized or scenario-zbrush-hard-surface: a versioned ZTL with named SubTools, levels (or a DynaMesh for Proxy Pose), polygroups per part, the last review sheet; from scenario-zbrush-retopology-export, a projected stack when a sculpt had no levels.</li>\n<li><strong>Sends</strong> to scenario-blender-rigging or scenario-maya-expert: the TPose OBJ and a plan (joints, angles, rigid pieces per bone), expecting the same vertex order back.</li>\n<li><strong>Delivers</strong> posed sculpts (layers, ZTL, ZPR, sheets) to scenario-zbrush-paint-render; print packages (STL and 3MF in mm, report, sheets, part and key list) to the user or the printer.</li>\n</ul>\n<h2>ZBrush 2026 notes</h2>\n<ul>\n<li>Proxy Pose (2023.1) is in Tool &gt; Geometry. Transpose Master still ships (\"inactive after a file save\" fixed in 2025.2); its data lives in the ZPR. The doc's clean project, DefaultCube.ZPR, is not in the 2026.2.1 install: <code>Lightbox/Projects/DefaultProject.ZPR</code> is used [verify].</li>\n<li>3D Print Hub has Export to 3MF (errors fixed in 2026.2.1). Update Size Ratios and Scale Master Set Scene Scale open dialogs: use the export scale route.</li>\n<li>From Thickness (2026.2.1 labels Min Thickness, Max Thickness, Ball or Ray) asks \"Too many polygons... proceed?\" above Max Thickness Polygons; that note stalls the bridge, so <code>from_thickness</code> refuses first.</li>\n<li>Live Boolean drops UVs, creases, 3D layers and masks on the result: boolean the print copy. Decimation Master and Transpose Master are ZScript plugins: check that control returns (live_p01, p07). Cmd+W quits ZBrush on macOS.</li>\n</ul>\n<h2>References</h2>\n<ul>\n<li><code>references/procedures.md</code>: bridge procedures with full code (scale and brief box, clean project, Transpose Master, three rig routes, fixes, hollow chain, keys, masked decimation, delivery). Load before driving ZBrush.</li>\n<li><a href=\"references/expert-notes.md\"><code>references/expert-notes.md</code></a>: principles by expert with timestamps and deciding conditions. Load when planning a pose or a kit.</li>\n<li><code>references/critique.md</code>: the rubric for pose, deformation and print parts. Load at every gate.</li>\n<li><a href=\"references/gui-paths.md\"><code>references/gui-paths.md</code></a>: palettes, buttons, hotkeys for a computer-use agent or a human.</li>\n<li><a href=\"references/sources.md\"><code>references/sources.md</code></a>: sources, credentials, timestamps, revisions.</li>\n<li><a href=\"scripts/zb_pose.py\"><code>scripts/zb_pose.py</code></a> (inside ZBrush) and <a href=\"scripts/zb_print.py\"><code>scripts/zb_print.py</code></a> (agent side, numpy): offline tests in <code>tests/code/zbrush-pose-print/</code>; live tests <code>live_p01</code> to <code>live_p08</code> not yet run in ZBrush.</li>\n</ul>\n","files":[{"path":"references/critique.md","sizeBytes":15412,"isText":true},{"path":"references/expert-notes.md","sizeBytes":22883,"isText":true},{"path":"references/gui-paths.md","sizeBytes":25358,"isText":true},{"path":"references/procedures.md","sizeBytes":35751,"isText":true},{"path":"references/sources.md","sizeBytes":10111,"isText":true},{"path":"scripts/zb_pose.py","sizeBytes":56739,"isText":true},{"path":"scripts/zb_print.py","sizeBytes":67138,"isText":true},{"path":"SKILL.md","sizeBytes":20082,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-10-17T09:12:58.687085Z","sha256":"C49E5A0B4B41FC768A699007C43B5847298058BBAFD768C5A21BB5A949BC53E6","sizeBytes":84732},"review":null,"source":{"repositoryUrl":"https://github.com/scenario-labs/skills","path":"skills/dcc/zbrush/scenario-zbrush-pose-print","license":"MIT","commit":"dc592af7139ffacfe8fdae7dc7efa80f4dd09be3","subtreeSha":"B2C880C5CDA59BA93127683659F7DBB559AC695BF97B7A7C8E6AB2659FA1D3F6","lastSyncedAt":"2026-10-17T09:10:46.286688Z"},"reviewedAt":"2026-10-17T09:16:23.163386Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/scenario-labs/skills/tree/main/skills/dcc/zbrush/scenario-zbrush-pose-print"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install scenario-labs-skills@llmmart"},{"target":"git","command":"git clone https://github.com/scenario-labs/skills.git"}]}