skill
blender-LPM-skill
Blender Low Poly Modelling Skill — AI agent skill (Claude Code) that builds flat-shaded, palette-textured, budgeted low-poly game assets in Blender from a one-line brief and exports Unity-ready FBX
Set up
Skills are installed by placing their folder where your agent loads skills.
Install instructions come from the README
README
synced Oct 14, 2026Blender Low Poly Modelling Skill
Tell Claude Code what you want — get a finished, game-ready low-poly asset out of Blender: .blend + .fbx + textures + renders.
"Low-poly Roman loot chest, 1.2 m, ≤ 2 500 tris, wood + bronze, collider, Unity/URP" → 868 triangles, Cycles render, one run.
Download & install (2 minutes)
1. Get the skill
git clone https://github.com/ozanzeng/blender-LPM-skill.git
or press Code → Download ZIP on this page and unzip it.
2. Put it into your project
# the folder that matters is skills/blender-lpm-skill
cp -r blender-LPM-skill/skills/blender-lpm-skill <your-project>/.claude/skills/
Windows (PowerShell):
Copy-Item -Recurse blender-LPM-skill\skills\blender-lpm-skill <your-project>\.claude\skills\
3. Requirements
| Blender | 4.2 or newer (tested on 5.2 LTS, Windows 11 / RTX 3070 Ti). Default install path is found automatically; otherwise set BLENDER_EXE. |
| Python | 3.9+ on the host (for the helper scripts) |
| Agent | Claude Code (or any agent that reads SKILL.md: Codex, Cursor) |
| Optional | Blender MCP (official Blender Lab server or ahujasid/blender-mcp) for live sessions — not required, everything runs headless |
4. Use it — open Claude Code in your project and write a brief in plain language. Example:
Low-poly Roman gladius, 0.65 m, 1 200 triangles, palette material, FBX for Unity. Render 5 views and check the gates.
The skill builds the model from primitives with a recipe script, renders it, checks it, and exports it. Files land in _work/<asset>/.
The prompts we ran (verbatim)
| # | Prompt (as given, Turkish) | Meaning | Result |
|---|---|---|---|
| 1 | "tamam güzel sandığı boya ve render al bakalım nasıl görünüyor" (after "bana low poly sandık çiz") | "Draw me a low-poly chest" → "nice, now paint it and render it, let's see" | SM_Chest — 576 tris / budget 800, barrel lid with alternating planks, iron straps + rivets, lock, brackets, handles; Cycles render below |
| 2 | "low-poly bir Roma ganimet sandığı oluştur. Mobil Unity/URP hedefli olsun; kapalı halde 1.2 m genişlik, en fazla 2.500 üçgen, ahşap gövde ve bronz şeritler, ayrı basit çarpışma gövdesi, uygulanmış transformlar, UV'ler ve materyaller içersin. Düzenlenebilir .blend ile .fbx teslim et; ayrıca turntable/inceleme renderı üret." | "Create a low-poly Roman loot chest for mobile Unity/URP: closed, 1.2 m wide, max 2 500 tris, wood body + bronze straps, separate simple collision body, applied transforms, UVs and materials. Deliver editable .blend + .fbx and a turntable/inspection render." | SM_RomanChest — 868 tris + 12-tri _COL collider, 1.20 × 0.69 × 0.80 m, gates PASS, .blend + .fbx + palette textures, 48-frame turntable MP4, Cycles renders, one-file asset card |
| 3 | "benim için blenderda skill kullanarak low poly villa bir ev tasarla" | "Design a low-poly villa house for me in Blender using the skill" | SM_RomanVilla — 1 580 tris / budget 3 000, 23 × 17 × 8 m: hipped terracotta roofs, 4-column portico, arched door, tower, wing, shuttered windows, plinth with steps and gate piers, two cypresses; collider, turntable, Cycles renders, asset card |
All three were produced end-to-end by the skill's loop: brief → part list → recipe script → build → render → look → fix → gates → export → asset card. Prompt 2 needed two iterations (the collision box leaked into the first render; lid straps poked above the ridge); prompt 3 needed two (plinth too small, garden wall inside the tower) — every fix went back into the skill or the recipe.
What you get per asset
_work/<asset>/
<Name>.blend editable scene (asset + <Name>_COL collider in its own collection)
<Name>.fbx Unity axes (-Z forward, Y up), 1 unit = 1 m, transforms applied
tex/<Name>_BaseColor.png palette (sRGB)
tex/<Name>_MaskMap.png R metallic · G occlusion · A smoothness (Unity URP/HDRP mask layout)
views/sheet.png front / side / back / three-quarter / top
beauty_*.png presentation renders (EEVEE or Cycles)
turntable/*.mp4 + sheet 360° turntable
inspect.json, gates.md measurements + PASS/FAIL gate report
<Name>_card.html / .md prompt + recipe + metrics + renders in one shareable file
More examples (all in examples/, all built by the same toolkit)
Figures from a 4-view sheet (Route C)
For figures that must match a reference (a lion, an eagle, a skull), primitives and silhouette hulls are not enough.
multiview_to_mesh.py sends a front/back/left/right sheet to Hunyuan3D v3 (via fal.ai), gen_to_lowpoly.py orients,
scales and decimates the result keeping UVs, and gltf_pbr_to_unity.py packs the PBR set for Unity URP. The Roman
lion altar came back with a real faceted lion at orthographic IoU 0.92 / 0.95 / 0.96 against the sheet.
Free variant (no paid service): hy3d_local_mv.py runs the open-weights tencent/Hunyuan3D-2mv on the local GPU
(shape only, ~6 GB VRAM) and project_views_bake.py textures the mesh by projecting the four reference views and
baking them into one atlas in Blender. Same lion: ortho IoU 0.91 / 0.93 / 0.95, cost $0.
Reference matching: compare_silhouette.py overlays a render on your concept art (red = reference only, green = model only, yellow = match) and reports IoU, aspect and centroid errors. The scutum went from IoU 0.78 / 23 % aspect error to IoU 0.95 / 0.9 % by changing two numbers in its recipe.
How it works
- Brief → budget. One line: asset, real size in metres, triangle budget, palette, engine.
- Part list. 4–12 primitive parts, each with a palette colour.
- Recipe. A ~30-line Python script using
lpm.py—box,grid_box,prism,lathe,sweep,plate, thenbend/taper/mirror_x/paint;finish()joins, welds, grounds, writes palette UVs, assigns one material, checks the budget;collision_box()adds a collider;export_unity()writes the files. - Look.
render_views.pyrenders five views; the agent reads the sheet and fixes the recipe (three iterations is normal). - Gates.
inspect_scene.py+gate_report.py: budget, transforms, ground, UVs, empty slots, degenerate faces, loose vertices. - Deliver.
beauty_render.py,turntable.py,asset_card.py.
Everything runs headless (scripts/bl.py starts Blender with factory settings) so results are reproducible; with Blender MCP the same recipes run in the open scene.
import os, sys; sys.path.insert(0, ".claude/skills/blender-lpm-skill/scripts"); import lpm
lpm.reset()
P = lpm.Palette(lpm.PALETTE_ROMAN)
head = lpm.sweep("head", [(-0.09, 0), (0.09, 0), (0.12, 0.14), (0, 0.19), (-0.12, 0.14)], depth=0.02, at=(0, 0, 1.15), color=P["iron"])
haft = lpm.prism("haft", 8, 0.018, 1.15, at=(0, 0, 0), color=P["wood"], radius_top=0.016)
axe = lpm.finish("SM_Axe", [head, haft], P, budget=900)
lpm.export_unity(axe, "_work/axe/SM_Axe", extra=[lpm.collision_box(axe)])
Folder map
skills/blender-lpm-skill/
SKILL.md what the agent reads: procedure, style rules, toolkit summary
references/ budgets & facet counts, palette design, recipe rules, Unity export contract, QA checklist
scripts/
lpm.py the toolkit
bl.py run Blender headless
render_views.py 5-view sheet beauty_render.py presentation render
turntable.py 360° MP4 + sheet inspect_scene.py measurements
gate_report.py PASS/FAIL gates compare_silhouette.py reference overlay
asset_card.py one-file delivery card
examples/ gladius, scutum, galea_helmet, arena_column, chest, roman_chest, roman_villa
docs/images/ renders used in this README
Low-poly rules baked in
Flat shading only · silhouette before surface · one palette material, no bakes, no normal maps · real metres, base on z = 0 · symmetry by mirror · no coplanar faces between parts (they render black) · every triangle earns its place.
License
MIT © 2026 Ozan Zengin — original work, no third-party skill content. Companion collection (routing hub, retopology, UV/PBR, rigging, reference matching): blender-modelling-skills.