blender-hardsurface-modeling
Skill779 starsChanged 15 days agoMITView on GitHub
Hard-surface and prop modeling in Blender 5.2 - blockout-to-detail flow, non-destructive modifier stacks (Mirror, Boolean Exact/Manifold, Bevel, Weighted Normal, Smooth by Angle), mid-poly vs subdivision vs high-to-low workflows, shading/custom normals, cylinder segment budgets, edge attributes from Python. Use for weapons, vehicles, props, architecture, mechanical parts.
In this repository29 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- blender-addon-developmentSkill
- blender-animationSkill
- blender-asset-qaSkill
- blender-character-riggingSkill
- blender-clothingSkill
- blender-coreSkill
- blender-environment-kitsSkill
- blender-export-pipelinesSkill
- blender-facial-shapekeysSkill
- blender-game-optimizationSkill
- blender-geometry-nodesSkill
- blender-hair-groomingSkill
- blender-lighting-lookdevSkill
- blender-pbr-materialsSkill
- blender-pipeline-automationSkill
- blender-renderingSkill
- blender-retopology-uvSkill
- blender-scene-setupSkill
- blender-sculptingSkill
- blender-simulationSkill
- blender-stylized-nprSkill
- blender-texture-bakingSkill
- blender-texturingSkill
- blender-time-of-daySkill
- blender-video-editingSkill
- blender-weather-fxSkill
- blender-workflow-recipesSkill
The file
We split this skill into the rules it gives an agent
4 rules. About 0 are common, 1 is distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 30
Booleans: put cutters in a Cutters collection with display WIRE and hide_render=True.
- Distinctive: line 31
Avoid coplanar boolean faces: extend cutters slightly past the surface.
- Very specific: line 33
Weighted Normal: after Bevel: mode="FACE_AREA", keep_sharp=True, weight 50.
- Very specific: line 37
Triangulate: only for export/baking (keep_custom_normals=True, BEAUTY).
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Hard-Surface Modeling
The execution model is in blender-core. Run blender-asset-qa after every modeling pass.
Pick the workflow first
| Workflow | When | Output |
| Mid-poly (bevel + weighted normals, no bake) | modern games, props seen up close, fast iteration | game mesh directly; tiling materials/trim sheets |
| High → low (high via booleans+bevel or subd, low baked) | hero assets, unique textures, tight tri budgets | _high + _low → blender-texture-baking |
| Subdivision (support loops/creases + Subsurf) | renders, product viz, film | smooth surfaces, edges held by loops/creases |
Procedure
- Blockout at real scale (
ob.dimensions) from primitives. Settle the silhouette and proportions before any detail. Check against references. - Apply scale (
transform_apply(scale=True)) before bevels, booleans or solidify, because modifier distances use object space. - Primary → secondary → tertiary forms. Booleans for cuts and panels, then bevels. Small tertiary details go in normal maps/decals, or into the high-poly as "floaters" for baking.
- UV the base mesh now (mid-poly). Bevel/Boolean modifiers propagate UVs, but after bevels no edge is sharp enough to auto-seam. Then build the stack with
scripts/apply_stack.py -- --objects Body --preset midpoly --cutters Cut1 Cut2. Order: Mirror → Booleans → Bevel → Weighted Normal → (Triangulate at export). - Shading check: smooth shading + Weighted Normal (keep sharp). There must be no gradients across flat faces. View with a matcap or
lookinsolidshading. - QA with
blender-asset-qa, then apply the stack only on an export copy (--apply), keeping the editable source.
Stack rules
- Booleans: put cutters in a
Cutterscollection with displayWIREandhide_render=True. Solver:EXACT(robust default),MANIFOLD(much faster, but inputs must be closed manifold),FLOAT(legacy fast, fragile with coplanar faces). With many cutters, useoperand_type="COLLECTION". - Avoid coplanar boolean faces: extend cutters slightly past the surface. They also cause z-fighting.
- Bevel:
limit_method="ANGLE"(30°), or"WEIGHT"with abevel_weight_edgeattribute for hand-picked edges. Turn onuse_clamp_overlap,harden_normals=True,miter_outer="MITER_ARC". Width ≈ 0.5–2% of the part's size, kept consistent across the asset. - Weighted Normal after Bevel:
mode="FACE_AREA",keep_sharp=True, weight 50. Needs smooth faces (remove thesharp_faceattribute or callshade_smooth). - Smooth by Angle (4.1+, replaces auto smooth):
bpy.ops.object.shade_auto_smooth(angle=rad)adds a GN modifier, orshade_smooth_by_anglesetssharp_edgedestructively. - Mirror:
use_clip=True,use_mirror_merge=True. Model one half only at x ≥ 0. - Subdivision: hold edges with support loops (a loop 1–5% of the face width from the edge) or
crease_edge(0–1). Turn onuse_limit_surface. Don't use creases if the asset goes to an engine. - Triangulate only for export/baking (
keep_custom_normals=True,BEAUTY). Triangulating the bake mesh and the export mesh identically keeps normal maps synced.
Topology rules
- N-gons: fine on flat, non-deforming faces in mid-poly/game meshes. Never use them on curved surfaces or anything that subdivides or deforms.
- Poles (5+ edges) should sit on flat areas, never on a curvature peak or bevel.
- Cylinder segments by on-screen size: small (bolts) 6–8, medium (handles) 12–16, large (barrels) 24–32, hero/close-up 48+. Use multiples of 4 or 8 so booleans/mirrors line up with existing loops.
- No long, thin triangles across visible curved areas (shading and LOD artifacts).
- Panel lines: inset + extrude in (mid-poly) or a boolean groove on the high-poly, then bake.
- Spend density where the silhouette needs it, not on flat faces.
Edge/face attributes from Python (4.0+ names)
me = ob.data
bw = me.attributes.get("bevel_weight_edge") or me.attributes.new("bevel_weight_edge", "FLOAT", "EDGE")
cr = me.attributes.get("crease_edge") or me.attributes.new("crease_edge", "FLOAT", "EDGE")
sh = me.attributes.get("sharp_edge") or me.attributes.new("sharp_edge", "BOOLEAN", "EDGE")
bw.data[edge_index].value = 1.0; sh.data[edge_index].value = True
me.edges[edge_index].use_seam = True # seams are still an edge propertySelect sharp edges by angle in bmesh: e.calc_face_angle(0) > math.radians(30).
Gotchas
- A bevel that looks blobby or flips usually means unapplied/non-uniform scale or overlapping geometry (turn on clamp).
- A Boolean that returns nothing or garbage: the cutter isn't closed/manifold (Exact copes, Manifold fails), or its normals are inverted.
- Weighted Normal has no effect: faces are flat-shaded, or an earlier modifier destroyed the custom normals.
- 5.2: the GN
Mesh Bevelnode exists for procedural bevels inside node trees (blender-geometry-nodes). - Trim-sheet/mid-poly assets: UVs go to the trim strips (
blender-retopology-uv) and materials tile (blender-pbr-materials).
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

