Agent Skills
› EL4CTEO/blender-skills
› blender-hardsurface-modeling
blender-hardsurface-modeling
GitHubBlender硬表面建模指南,涵盖Blockout、中模、高转低及细分工作流。规范非破坏性修改器堆栈(布尔、倒角、法线加权),强调比例、UV与平滑着色检查,支持武器、载具等道具资产创建。
触发场景
需要创建3D硬表面模型或道具
询问Blender建模工作流选择
咨询修改器堆栈配置与优化
安装
npx skills add EL4CTEO/blender-skills --skill blender-hardsurface-modeling -g -y
SKILL.md
Frontmatter
{
"name": "blender-hardsurface-modeling",
"license": "MIT",
"metadata": {
"author": "blender-agent-skills",
"version": "1.2.0"
},
"description": "Hard-surface and prop modeling in Blender 5.3 - 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."
}
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 property
Select 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). - 5.3: LoopTools is built in (
mesh.relax_edge_loops,curve_edge_loops_between_selected,fit_edge_loops_to_annotation,space_edge_loops_evenly).mesh.primitive_quad_sphere_add(segments=4)gives an all-quad cube-sphere: no pinched poles, so it subdivides and bevels cleanly. - Trim-sheet/mid-poly assets: UVs go to the trim strips (
blender-retopology-uv) and materials tile (blender-pbr-materials).
版本历史
- b1b21df 当前 2026-11-15 13:19


