Shape a mesh form in Blender sculpt mode: enter sculpt mode on a base mesh, set symmetry, choose a brush by its sculpt brush type and set size, strength, and falloff, pick one detail strategy (dynamic topology, voxel remesh, or multires), mask finished areas, and stop at the right point to hand off to retopology, UV, or rigging work. Use when a mesh exists as a rough base and needs its form sculpted before any later stage.
./install.sh blender-sculpting-basicsname: blender_sculpting_basics description: "Shape a mesh form in Blender sculpt mode: enter sculpt mode on a base mesh, set symmetry, choose a brush by its sculpt brush type and set size, strength, and falloff, pick one detail strategy (dynamic topology, voxel remesh, or multires), mask finished areas, and stop at the right point to hand off to retopology, UV, or rigging work. Use when a mesh exists as a rough base and needs its form sculpted before any later stage." metadata: { "includeInPrompt": true }
Take a base mesh from rough volume to a finished form using sculpt brushes. The work runs in a fixed order: prepare a clean base, set symmetry before the first stroke, block out large form with big brushes at low detail, pick one detail strategy and stay with it, refine in passes, protect finished areas with a mask, and stop when the form reads well and the mesh needs a different kind of work than brushes can give. Sculpting decides shape only. Topology for deformation, UV layout, and materials belong to later stages, and this skill hands off to them instead of trying to do their job with brushes.
Scope:
~/.local/bin/blender --version returned on the drafting machine, started as ~/.local/bin/blender -b --factory-startup --python script.py. Operators called and returned FINISHED: bpy.ops.mesh.primitive_uv_sphere_add, bpy.ops.mesh.primitive_ico_sphere_add, bpy.ops.mesh.primitive_cube_add, bpy.ops.object.mode_set with SCULPT and OBJECT, bpy.ops.object.modifier_add with type MULTIRES, bpy.ops.object.multires_subdivide, bpy.ops.object.multires_base_apply, bpy.ops.sculpt.dynamic_topology_toggle, bpy.ops.sculpt.optimize, bpy.ops.object.voxel_remesh, bpy.ops.object.quadriflow_remesh, bpy.ops.object.shade_smooth, bpy.ops.wm.read_factory_settings, bpy.ops.wm.save_as_mainfile, and bpy.ops.wm.open_mainfile. A UV sphere at segments 32 and ring_count 16 measured 482 vertices and 512 polygons, an icosphere at subdivisions 3 measured 162 vertices and 320 polygons, a voxel remesh of that UV sphere at voxel size 0.2 measured 536 vertices and 534 polygons, and a quadriflow remesh of it at default settings measured 3964 vertices and 3962 polygons. Properties read or set with the values stated in the Workflow: on tool_settings.sculpt, use_symmetry_x, use_symmetry_y, use_symmetry_z, lock_x, lock_y, lock_z, use_deform_only, detail_size, detail_percent, constant_detail_resolution, detail_type_method, detail_refine_method, and unified_paint_settings with use_unified_size, use_unified_strength, size, and strength; on the active brush, size, strength, hardness, auto_smooth_factor, spacing, stroke_method, direction, falloff_shape, sculpt_brush_type, use_pressure_size, use_pressure_strength, use_frontface, use_accumulate, and use_automasking_topology; on the object, use_dynamic_topology_sculpting; on the mesh, remesh_mode, remesh_voxel_size, remesh_voxel_adaptivity, use_remesh_preserve_volume, and use_remesh_preserve_attributes; on a Multiresolution modifier, levels, sculpt_levels, render_levels, total_levels, and quality. The sculpt_brush_type enum was read in full and setting it was tested by switching a brush to CLAY_STRIPS. The checker fixture run in the Operating Rules section returned objects_total: 2, mesh_objects: 2, vertices_total: 644, polygons_total: 832, multires_modifiers: 1 with total_levels 2, dyntopo_objects: 1, and verdict: PASS, on two separate audit runs with identical output. Probes that failed, with the fix applied in this skill: bpy.ops.object.multires_add exists in the operator list but calling it failed, so multires modifiers are added with bpy.ops.object.modifier_add(type='MULTIRES') instead; bpy.ops.paint.mask_flood_fill, bpy.ops.sculpt.mask_filter, bpy.ops.sculpt.face_sets_init, and bpy.ops.sculpt.symmetrize each crashed the headless process (exit 139), so none of them is used or scripted here and mask work is taught through the MASK brush type only; bpy.ops.sculpt.detail_flood_fill failed its poll check headless and bpy.ops.object.multires_unsubdivide errored on a freshly subdivided sphere, so neither is named in the Workflow; bpy.ops.object.multires_reshape requires a second selected mesh object and is out of scope. Names that do not exist in 5.1.1 and are not used here: brush.curve_preset, brush.autosmooth_factor (the real name is auto_smooth_factor), sculpt.use_dynamic_topology_sculpting (the flag lives on the object), and sculpt.constant_detail (the real name is constant_detail_resolution). What was NOT verified: no hand drawn stroke was run and no stylus was used, so tablet pressure feel and stroke results in a live session are untested, and the pressure properties above were only read and set; GUI-only panels, menus, and the brush asset shelf were not exercised headless, so panel locations in a live session may differ from the data names used here; face sets, mask flood and filter operations, and symmetrize are unverified for the crash reason above; no render, no material, and no rigged or posed mesh was tested.bpy.ops.mesh.primitive_uv_sphere_add(segments=32, ring_count=16, radius=1.0) gives 482 vertices and 512 polygons, a good low base. bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=3, radius=1.0) gives 162 vertices and 320 polygons with no poles, which suits organic blobs. bpy.ops.mesh.primitive_cube_add(size=2.0) gives the hard surface starting point.bpy.ops.wm.save_as_mainfile. Every detail strategy in step 7 can destroy base topology, and the base is the only clean way back.bpy.ops.object.mode_set(mode='SCULPT'). Read the mode back from the object before trusting it. Sculpting applies to the active object only, so a scene with several meshes is sculpted one object at a time.bpy.ops.object.shade_smooth in object mode. Flat shading hides form errors that smooth shading shows at once.tool_settings.sculpt.use_symmetry_x, use_symmetry_y, and use_symmetry_z. X starts on by default in a factory scene, Y and Z start off. Symmetry set late cannot repair form built lopsided early without rework.tool_settings.sculpt.lock_x, lock_y, and lock_z, when a stroke must not move vertices along one axis, for example flattening a back or a sole without narrowing the form.tool_settings.sculpt.use_deform_only when a pass should move existing vertices without adding or removing any, such as a late smoothing pass on a dyntopo mesh where new tessellation would change the detail budget.sculpt_brush_type value on the brush data. The full enum read in the probe run: DRAW, DRAW_SHARP, CLAY, CLAY_STRIPS, CLAY_THUMB, LAYER, INFLATE, BLOB, CREASE, SMOOTH, PLANE, MULTIPLANE_SCRAPE, PINCH, GRAB, ELASTIC_DEFORM, SNAKE_HOOK, THUMB, POSE, NUDGE, ROTATE, TOPOLOGY, BOUNDARY, CLOTH, SIMPLIFY, MASK, DRAW_FACE_SETS, DISPLACEMENT_ERASER, DISPLACEMENT_SMEAR, PAINT, SMEAR, and BLUR. Work with a small set first: GRAB to move masses, CLAY and CLAY_STRIPS to build volume, DRAW to add or cut soft form, INFLATE to swell, CREASE and PINCH to sharpen edges, PLANE to flatten, and SMOOTH to finish.size, in pixels on screen. Big form wants a brush near the size of the mass being moved. Detail wants a brush near the size of the feature. Working a whole form with a small brush makes lumpy, stroked surfaces that no amount of smoothing fully repairs.strength, 0.0 to 1.0. Low strength with several light strokes builds form that can be stopped at the right point. Full strength settles a shape in one stroke and overshoots just as fast. Default Draw strength in a factory scene is 0.5.direction, ADD or SUBTRACT. The same DRAW brush adds material on ADD and carves on SUBTRACT. Most brushes have a natural direction, and flipping it is faster than swapping brushes for a cut.hardness firms the edge of the brush falloff, and auto_smooth_factor blends each stroke into the surface under it. Autosmooth above zero softens stroke borders as you work and costs some sharpness. Keep it low or off while blocking, raise it for blending passes.stroke_method, SPACE by default, with spacing as a percent of brush size (10 in a factory scene). Wide spacing leaves a dotted trail on fast strokes. Tight spacing costs performance on dense meshes.use_pressure_size and use_pressure_strength on the brush decide whether pen pressure drives radius and strength. The factory Draw brush has use_pressure_strength on and use_pressure_size off. These flags were read and set in the probe runs. Their feel on real hardware was not tested, per the verification note.tool_settings.sculpt.unified_paint_settings holds size and strength shared across brushes when use_unified_size and use_unified_strength are on. Unified size starts on and unified strength starts off in a factory scene. Turn both on when switching brushes often, so a size tuned for one brush is still there on the next.falloff_shape, SPHERE or PROJECTED. SPHERE applies the brush in a ball around the cursor and reaches into curved and partly hidden surface. PROJECTED applies it flat from the view direction and gives cleaner control on the face of a form facing the camera.curve_strength and a size curve as curve_size, both curve mapping data. A curve that stays high then drops fast gives a firm center and a clear edge. A curve that falls from the center gives soft, blended strokes. When a brush feels weak at the center or harsh at the edge, the curve is the cause more often than strength.use_frontface limits a stroke to faces pointing at the view. Turn it on when working thin forms, ears, or cloth-like shapes, so the back side does not move with the front.use_accumulate lets repeated strokes in one drag keep building past the single stroke limit on brushes that support it. Leave it off while learning a form, because overshoot arrives with no clear stroke to blame.bpy.ops.sculpt.dynamic_topology_toggle(). Read the state from use_dynamic_topology_sculpting on the object, not on the tool settings, because in 5.1.1 the flag lives on the object. DynTopo subdivides and collapses triangles under the brush as you work, so detail can start anywhere with no base density planning. Save while the object is still in sculpt mode when this state matters: the checker fixture showed the flag and the active brush read back clean on reopen only when the file was saved in sculpt mode.tool_settings.sculpt.detail_type_method takes RELATIVE, CONSTANT, BRUSH, and MANUAL. RELATIVE sizes detail in screen pixels with detail_size, 12.0 in a factory scene, so zooming in gives finer detail. CONSTANT fixes detail in scene units with constant_detail_resolution, set to 4.0 in the checker fixture, so detail stays even at any zoom. BRUSH sizes detail from the brush with detail_percent, 25.0 in a factory scene. CONSTANT suits a form that needs even skin or scale detail. RELATIVE suits exploratory work where close areas earn detail first.tool_settings.sculpt.detail_refine_method takes SUBDIVIDE, COLLAPSE, and SUBDIVIDE_COLLAPSE, the factory default. SUBDIVIDE_COLLAPSE adds detail where strokes need it and removes it where the surface is plain. COLLAPSE alone is the cleanup setting for a mesh that grew too dense. bpy.ops.sculpt.optimize() rebalances a dyntopo mesh without a stroke and returned FINISHED in the probe run with DynTopo on.remesh_voxel_size and remesh_voxel_adaptivity on the mesh data, then call bpy.ops.object.voxel_remesh(). The remesh rebuilds the whole surface as an even grid of quads at the voxel size, joins separate shells that overlap, and erases poles and stretched faces. Probe numbers: the 482 vertex UV sphere at voxel size 0.2 came back with 536 vertices and 534 polygons. Smaller voxels hold finer detail and cost far more vertices, so halve the voxel size in steps and check the count each time.use_remesh_preserve_volume on the mesh, on by default, keeps the overall volume through the rebuild. use_remesh_preserve_attributes keeps mesh attributes where the rebuild can carry them. Neither preserves a pose built from careful topology, because the topology itself is replaced. Remesh is the standard reset between blocking and detail: block with DynTopo or by hand, remesh once at a voxel size that holds the blocked form, then detail on the clean surface.remesh_mode property takes VOXEL and QUAD. For the QUAD path, bpy.ops.object.quadriflow_remesh() rebuilt the probe sphere at default settings into 3964 vertices and 3962 polygons. It is slower than the voxel path and aims for flow that follows the form. Use it when the sculpt is nearly done and the result will be used with light cleanup rather than a full retopology pass.bpy.ops.object.modifier_add(type='MULTIRES'). In 5.1.1 the older bpy.ops.object.multires_add call fails, per the verification note. Subdivide with bpy.ops.object.multires_subdivide(modifier=mod.name), once per level. Each call raised total_levels by one in the probe runs, to 2 after two calls.levels for the viewport, sculpt_levels for sculpt mode, render_levels for renders, and total_levels for the levels that exist. The checker fixture holds levels 2, sculpt_levels 1, render_levels 2, and total_levels 2 on one object, which is the working pattern: sculpt large moves at a low sculpt level, raise the level for finer detail, and lower it again when a big proportion fix appears late. Multires keeps the low base intact under the detail, which makes it the only one of the three strategies that can step detail down without a remesh.bpy.ops.object.multires_base_apply(modifier=mod.name) applies the lowest level shape into the base mesh and returned FINISHED in the probe run with the vertex count unchanged at 482. Treat it as a checkpoint operation: save first, apply, then check the form.sculpt_brush_type and paint the areas that must not move: a finished face while the head around it changes, a hard edge while the surface next to it gets smoothed, fingers while the palm is reshaped. Painted mask protects vertices from brush deformation.use_automasking_topology, read as off on the factory Draw brush. Topology automasking keeps a stroke from crossing to disconnected surface under the brush, which protects nearby shells without painting a mask at all.bpy.ops.wm.save_as_mainfile with a new file name each time. Sculpting has no reliable undo across sessions, and versioned files are the recovery path.Deliver these items, in this order:
Run: ~/.local/bin/blender -b --factory-startup --python sculpt_audit.py -- --make-fixture sculpt_fixture.blend builds the worked fixture blend file. Then run: ~/.local/bin/blender -b --factory-startup --python sculpt_audit.py -- sculpt_fixture.blend to reproduce the output below. Run it on a real sculpt with ~/.local/bin/blender -b --factory-startup --python sculpt_audit.py -- FILE.blend. Blender prints its own banner and a read line before the script output. The block below is the script output only.
Expected output for the fixture run:
text
fixture_file: sculpt_fixture.blend
objects_total: 2
mesh_objects: 2
OBJECT DynoBall verts=162 polys=320 modifiers=0 dyntopo=True
OBJECT SculptTarget verts=482 polys=512 modifiers=1 dyntopo=False
MULTIRES object=SculptTarget levels=2 sculpt_levels=1 render_levels=2 total_levels=2
vertices_total: 644
polygons_total: 832
multires_modifiers: 1
dyntopo_objects: 1
symmetry_x: True
symmetry_y: False
symmetry_z: False
detail_type_method: CONSTANT
constant_detail_resolution: 4.0
detail_refine_method: SUBDIVIDE_COLLAPSE
brush_name: Draw
brush_type: DRAW
use_unified_size: True
unified_size: 120
use_unified_strength: True
unified_strength: 0.70
verdict: PASS
The fixture is built to show each audit result once: two mesh objects, one carrying a Multiresolution modifier subdivided twice with sculpt_levels lowered to 1, and one with dynamic topology on, saved while still in sculpt mode so the flag and the active Draw brush read back on reopen. X symmetry is on, the detail method is CONSTANT at resolution 4.0, and unified size and strength are both on at 120 and 0.70, which gives vertices_total: 644, polygons_total: 832, and a verdict of PASS.
sculpt_audit.py (runs inside Blender, uses bpy). Save this code as sculpt_audit.py:
python
#!/usr/bin/env python3
"""Audit sculpt-relevant state in a Blender scene.
This script runs inside Blender, not in plain Python:
blender -b --factory-startup --python sculpt_audit.py -- --make-fixture sculpt_fixture.blend
blender -b --factory-startup --python sculpt_audit.py -- sculpt_fixture.blend
The --make-fixture form builds a small fixture blend file holding
two mesh objects: SculptTarget, a UV sphere with a Multiresolution
modifier subdivided twice with sculpt_levels lowered to 1, and
DynoBall, an icosphere with dynamic topology enabled, constant
detail at resolution 4.0, X symmetry on, and unified paint
settings at size 120 and strength 0.70 with both unified flags
on. It saves that scene while DynoBall is
still in sculpt mode, which is what keeps the dynamic topology
flag and the active brush readable on reopen, and prints two
fixture lines.
The audit form opens the blend file named after the -- separator,
then prints one line per mesh object sorted by name, one line per
Multiresolution modifier, the saved sculpt tool settings, and
summary counts. The verdict is PASS when the scene holds exactly
the fixture shape: two mesh objects, one Multiresolution modifier
with total_levels 2, and one dynamic topology object. Any other
shape prints REVIEW. Blender prints its own banner lines before
the script output; the lines below are the script output only.
"""
import sys
import bpy
def build_fixture(path):
bpy.ops.wm.read_factory_settings(use_empty=True)
bpy.ops.mesh.primitive_uv_sphere_add(segments=32, ring_count=16, radius=1.0)
target = bpy.context.active_object
target.name = "SculptTarget"
bpy.ops.object.modifier_add(type='MULTIRES')
mod = target.modifiers[-1]
bpy.ops.object.multires_subdivide(modifier=mod.name)
bpy.ops.object.multires_subdivide(modifier=mod.name)
mod.sculpt_levels = 1
bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=3, radius=1.0)
dyno = bpy.context.active_object
dyno.name = "DynoBall"
bpy.ops.object.mode_set(mode='SCULPT')
bpy.ops.sculpt.dynamic_topology_toggle()
sculpt = bpy.context.tool_settings.sculpt
sculpt.detail_type_method = 'CONSTANT'
sculpt.constant_detail_resolution = 4.0
sculpt.detail_refine_method = 'SUBDIVIDE_COLLAPSE'
sculpt.use_symmetry_x = True
unified = sculpt.unified_paint_settings
unified.use_unified_size = True
unified.size = 120
unified.use_unified_strength = True
unified.strength = 0.7
bpy.ops.wm.save_as_mainfile(filepath=path)
print(f"fixture_file: {path}")
print("fixture_objects: 2")
return 0
def audit(path):
bpy.ops.wm.open_mainfile(filepath=path)
meshes = sorted(
(ob for ob in bpy.data.objects if ob.type == 'MESH'),
key=lambda ob: ob.name,
)
sculpt = bpy.context.tool_settings.sculpt
brush = sculpt.brush
print(f"fixture_file: {path}")
print(f"objects_total: {len(bpy.data.objects)}")
print(f"mesh_objects: {len(meshes)}")
verts_total = 0
polys_total = 0
dyntopo_objects = 0
multires_rows = []
for ob in meshes:
verts = len(ob.data.vertices)
polys = len(ob.data.polygons)
verts_total += verts
polys_total += polys
if ob.use_dynamic_topology_sculpting:
dyntopo_objects += 1
print(
f"OBJECT {ob.name} verts={verts} polys={polys} "
f"modifiers={len(ob.modifiers)} dyntopo={ob.use_dynamic_topology_sculpting}"
)
for mod in ob.modifiers:
if mod.type == 'MULTIRES':
multires_rows.append((ob.name, mod))
for name, mod in multires_rows:
print(
f"MULTIRES object={name} levels={mod.levels} "
f"sculpt_levels={mod.sculpt_levels} render_levels={mod.render_levels} "
f"total_levels={mod.total_levels}"
)
print(f"vertices_total: {verts_total}")
print(f"polygons_total: {polys_total}")
print(f"multires_modifiers: {len(multires_rows)}")
print(f"dyntopo_objects: {dyntopo_objects}")
print(f"symmetry_x: {sculpt.use_symmetry_x}")
print(f"symmetry_y: {sculpt.use_symmetry_y}")
print(f"symmetry_z: {sculpt.use_symmetry_z}")
print(f"detail_type_method: {sculpt.detail_type_method}")
print(f"constant_detail_resolution: {sculpt.constant_detail_resolution:.1f}")
print(f"detail_refine_method: {sculpt.detail_refine_method}")
unified = sculpt.unified_paint_settings
print(f"brush_name: {brush.name if brush else '-'}")
print(f"brush_type: {brush.sculpt_brush_type if brush else '-'}")
print(f"use_unified_size: {unified.use_unified_size}")
print(f"unified_size: {unified.size}")
print(f"use_unified_strength: {unified.use_unified_strength}")
print(f"unified_strength: {unified.strength:.2f}")
ok = (
len(meshes) == 2
and len(multires_rows) == 1
and multires_rows[0][1].total_levels == 2
and dyntopo_objects == 1
)
print(f"verdict: {'PASS' if ok else 'REVIEW'}")
return 0
def main():
args = sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else []
if len(args) == 2 and args[0] == "--make-fixture":
return build_fixture(args[1])
if len(args) == 1:
return audit(args[0])
print("usage: sculpt_audit.py -- [--make-fixture FILE.blend | FILE.blend]")
return 2
if __name__ == "__main__":
raise SystemExit(main())
publisher key 2e43c913833850e6d80f939677e3de76e806d47785c0f1caaca90f9d18c98e1e
No ratings yet — be the first to rate it.