build-minecraft-model-from-image
Turn a 2D picture of an object into a Minecraft-style 3D model, a few clean cuboids with pixel textures in the Blockbench look, never fine jagged voxels. Exports GLB, a viewer and renders. Use for "ma
SKILL.mdplugins/build-minecraft-model-from-image/skills/build-minecraft-model-from-image/SKILL.md
GitHubBuild a Minecraft-style model from a picture (Dựng model kiểu Minecraft từ ảnh đồ vật)
If references/local.md exists, read it first: it sets the folders and house rules for this machine.
The agent looks at the picture and writes the model by hand as code. There is no image-to-3D model, no heightmap and no extrusion.
The look
A fine voxel grid looks jagged and ugly. The target is how Minecraft itself is modelled:
- A few big flat cuboids, about 20 to 110 boxes (a
roundtier takes 5 to 9). Each box or tier is a real part of the object. - Every face carries a pixel texture at one texel per unit, so all pixels are the same size everywhere.
- Model height is 16 to 40 units. Detail goes in the paint, not in more boxes: eyes, labels, seams, screws, patterns.
- Round things are 2 to 5 stacked tiers of chamfered boxes (
round,disc), never a staircase of tiny cubes. - Angled parts are one rotated box (
beam,rotation=). - Palette from the picture, 3 to 5 close ramp steps per material. Low noise on smooth things, a little more on rough ones.
Steps
{{SKILL_DIR}} is this skill's folder and {{WORK_DIR}} the folder where projects live. Scripts are in {{SKILL_DIR}}/scripts. Put each job in its own folder under {{WORK_DIR}}, with the picture as source.jpg. The scripts declare their Python dependencies inline, so uv run installs them. Blender 5.x does the renders. Set BLENDER_PATH if it is not on your PATH.
- Look at the whole picture at full size before any tool. Name each real part, and what is only shadow, reflection or background. Blueprints blur this: on the test run a port's shadow was read as a "dark neck", and a collared shirt as a white bib.
- Read it:
uv run --no-project {{SKILL_DIR}}/scripts/read_image.py source.jpg --blocks 24 --box x0,y0,x1,y1 --out read. Add--clear-background 18on a plain background so holes open up (handles, slats). This writesmask.png,blueprint.png(block coordinates with a ruler),palette.pngandrows.json. Pick--blocksso the thinnest part that must show gets 1 to 2 units. - Write the part sheet as the object script's docstring: what is visible, what is inferred for the unseen sides and why, what is left out. The camera view comes from measurement, see
references/method.md, "Reading the view". - Write the object script with
SOURCEandbuild(kit). API and worked patterns:references/method.md. Worked examples of four shapes:examples/. Their source pictures are not included. Credits are inREADME.mdat the repository root. - Build:
uv run --no-project {{SKILL_DIR}}/scripts/build_model.py object.py --out block --samples 48 --resolution 500. This writesmodel.glb,viewer.html,checks.json,overlay.png,compare.pngandviews/*.pngwith transparent backgrounds. Add--turntable 48forturntable.mp4.--device autois the default and goes to the CPU while the GPU is above 40% busy. - Look at
compare.pngand fix what reads wrong, at least one round. Go throughreferences/faults.md. Check the back and side views as hard as the picture's view. That is where a lazy model shows. - Blind read for anything going public: ask a fresh subagent, or a person, who is not told the object to name it from the renders alone.
Hard rules
build_model.pyexits 1 on floating parts or an extruded model. Fix the model. Do not loosen the check.- Warnings are real: coplanar overlaps flicker in every viewer, and too many or too tiny boxes mean the model is sliding back into voxels.
- Silhouette overlap is a guide only. Thin frames and photos with perspective score low (a correct chair scores 0.45). Open
overlay.pngrather than chasing the number. - Rendering uses the GPU. When another job holds it, keep to
--samples 24 --resolution 400, or use--no-renderandviewer.htmluntil it frees up. - Prefer pictures with a clear licence if the result is published; for an unclear one, name the risk once and ask the user. Leave third-party logos and brand text out of the model by default and say so; the user can ask for them.
- If the picture is not enough for the unseen sides of a real object, search reference views before inventing them.
- After editing the scripts, run
uv run --no-project {{SKILL_DIR}}/scripts/test_block_model.py(no GPU needed).