CommunityImagegithub.com

m4bwav/polywright-finish

Use whenever a mesh must be made ready for a game engine, the web or AR: is it game-ready, too many polygons, LODs, retopology, UVs, baking, PBR and normal-map conventions, collision, rigging, and axis, unit and format export for Roblox, Unity, Unreal, Godot, three.js (meshopt, KTX2), USDZ and video blockouts. Use on 'is this game-ready', 'make this work in Roblox/Unity', 'optimise for the web', 'reduce polygons', 'add LODs', 'retopologise', 'bake normals', 'imports sideways or tiny', 'flip...

What is polywright-finish?

polywright-finish is a Claude Code agent skill that use whenever a mesh must be made ready for a game engine, the web or AR: is it game-ready, too many polygons, LODs, retopology, UVs, baking, PBR and normal-map conventions, collision, rigging, and axis, unit and format export for Roblox, Unity, Unreal, Godot, three.js (meshopt, KTX2), USDZ and video blockouts. Use on 'is this game-ready', 'make this work in Roblox/Unity', 'optimise for the web', 'reduce polygons', 'add LODs', 'retopologise', 'bake normals', 'imports sideways or tiny', 'flip...

Works with✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/m4bwav/polywright/tree/HEAD/skills/polywright-finish

Installed? Explore more Image skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

What does polywright-finish do?

A mesh is finished when it passes its target's check, looks right in a render, and imports at the right size and orientation. Back to the hub: ../polywright/SKILL.md. Engine details: references/engines.md. Making and finishing for one engine, step by step: references/roblox.md, references/unity.md, references/web-threejs.md. Meshes that bend, shade and texture well: references/topology.md.

Step 1: measure, then decide

pw.py inspect <file> and pw.py check <file> --target <t> --real-size-m X. The failures say what to do: too many triangles, no UVs, too many materials, wrong size, open edges, and for game, web and AR targets flipped or stacked faces and uneven UV density (inspect --topology; flipped faces: convert --fix-winding). Render before and after every destructive step (pw.py render).

Step 2: scale, orientation, pivot

  • Real size in metres: pw.py convert in out --size-m X --ground --center (longest side to X; use a known dimension for odd shapes). A door is 2.0 to 2.1 m, a chair seat 0.45 m, a table 0.75 m, a person 1.7 to 1.8 m.
  • Pivot at the bottom centre for props, at the hinge for doors, the axle for wheels, the grip for weapons.
  • Axes: Blender +Z up and the front faces -Y; glTF +Y up and the front faces +Z; Unreal +Z up in centimetres; Unity +Y up left-handed; Roblox +Y up, 1 stud = 0.28 m. Test an export with a 1 m cube and a facing arrow when in doubt.

Step 3: geometry for the target

NeedDo
Fewer triangles, static proppw.py convert --max-tris N (collapse decimation keeps the silhouette); LODs with pw.py lods (about half per level)
Fewer triangles, mesh that bendsnot decimation: merge loops where nothing bends, keep the loops around joints (references/topology.md)
Clean quads for deformation or sculptingvoxel remesh first (closes it), then QuadriFlow (recipe in polywright-blender), Instant Meshes, Quad Remesher (paid), or a hosted quad remesh; characters: by hand
Generated mesh (dense, lumpy, soft edges)static prop: decimate and re-bake; hero or animated: retopology and re-bake; or regenerate with better references
Many parts that should be one--join; for a solid, pw.py union
Collisiona box, capsule or convex hull per part; Unreal UCX_ prefix; Roblox CollisionFidelity Box or Hull; never the render mesh for moving objects

Step 4: UVs and textures

  • UVs: pw.py convert --uv (Smart UV Project) for props; a second non-overlapping set for baked lightmaps (recipe); consistent texel density across a kit; trim sheets and atlases to cut materials and draw calls.
  • Bake from the dense mesh to the low one: normal, AO, colour (recipe bake-high-to-low). Retopology destroys UVs, so always re-bake.
  • PBR metal-rough: metalness 0 or 1, roughness carries the look, albedo never pure black or white; glTF packs occlusion, roughness, metalness into R, G, B (ORM).
  • Normal maps: OpenGL (Y+) for Blender, Unity, Godot, glTF, three.js, Roblox; DirectX (Y-) for Unreal. Fix a mismatch by inverting green. Textures in powers of two; 1024 to 2048 per material for web and AR.

Step 5: rig (when it moves)

A-pose input, clean manifold mesh. UniRig (MIT, local, 8 GB) or hosted Tripo, Meshy, AccuRIG (cleanest humanoid weights), Mixamo (humanoid, best retarget docs). A 2026 comparison found Meshy's hip pivot 5 to 15 cm off (feet slide) and AccuRIG importing once at 0.01 scale: check scale and pivot after rigging. Roblox: at most 4 bone influences per vertex, root at the origin. A Rigify rig exports far more bones than its deform set (278 of 706 with deform-only on): for games build a deform-only skeleton or use the routes above.

Animation clips: start and end each clip on one of a few shared core poses so clips chain without a blend; a loop's first frame equals its last; decide root motion or in place per clip and write it down; keep additive clips (aim, look, lean) as separate actions over a base pose (Gregory, Game Engine Architecture 2e (2014), sec. 11.6).

Step 6: export and verify

pw.py convert writes GLB, FBX, OBJ, USD/USDZ, STL. Per target:

TargetExportThen
game-robloxFBX, OBJ or GLB per MeshPart, under 20k triangles, one materialcheck --target game-roblox; roblox-agent places it
game-unityGLB (glTFast) or FBX --fbx-bake-axesimport test in the project (unity-agent)
game-unrealFBX or GLB; Nanite for dense opaque meshesscale check on import
web-threejsGLB, then gltf-transform optimize in.glb out.glb --compress meshopt --texture-compress ktx2 --join-named falsegltf_validator; page check (threewright)
ar-usdzconvert in.glb out.usdzusdchecker --arkit when usd-core is installed
video-blockoutGLB or .blend at real scale, plus turntables and depth/normal passes (recipes)hand to the video plugin (cinewright)
commerce-gltfGLB, real size, origin bottom centre, triangles onlycheck --target commerce-gltf

Smooth by Angle is a Geometry Nodes modifier in Blender 4.1 and later: export with modifiers applied, or the hard edges come out smoothed over (glTF, FBX and OBJ alike, checked on 5.2.1). Record each output: pw.py manifest <dir> --add-output out/<file> --target <t> --inspect.

Maintenance

Evergreen unit, tier moderate. Companions: RESEARCH.md, CHANGELOG.md, LEARNINGS.md, TESTS.md with evals/evals.json, MAINTENANCE.md, state in evergreen.json. Read evergreen.json at each use; refresh when due.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

m4bwav/polywright

Start here whenever a task needs a 3D model and no sibling below clearly owns it: a model of a real or imagined thing for a game (Unity, Roblox, Unreal, three.js), a 3D print, AI video or AR, or another plugin asking for a mesh. Picks the route (find, capture, generate, code), scaffolds the asset folder and manifest other plugins read, and runs pw.py (inspect, render a sheet, convert, check a budget, bpy headless, match a picture's camera, army blockouts with depth and pose passes for AI...

m4bwav/polywright-blender

Use whenever Blender is scripted, automated or debugged, before writing any bpy code: headless runs that report errors (pw.py bpy), the bpy API traps models still write in Blender 5.x (removed importers, renamed sockets, EEVEE names), tested recipes (modifiers, booleans, remesh, UVs, bakes, turntables, depth passes, batch exports), Blender MCP servers and their risks, and other 3D tools per OS. Use on 'write a Blender script', 'automate Blender', 'batch export .blend', any bpy traceback or...

m4bwav/polywright-generate

Use whenever an imagined or hypothetical 3D model must be made from a prompt, a drawing, concept art, photos or a blockout: image-to-3D through ComfyUI (TRELLIS.2, Pixal3D, Hunyuan3D-2 via pw.py gen) or hosted (Meshy, Tripo, Rodin), or code (bpy, build123d, CadQuery, OpenSCAD) when it has dimensions; then texturing and the licence record. Use on 'make me a 3D model of a dragon', 'turn this drawing or concept art into 3D', 'image to 3D', 'text to 3D', 'TRELLIS', 'Hunyuan3D', 'Meshy', 'model a...

m4bwav/polywright-references

Use whenever reference images, views or textures for a 3D model are needed, before modelling or image-to-3D: orthographic front, side and back views with a height bar, A-pose turnarounds, multi-view sets, blockout renders repainted into consistent views, seamless textures and quick normal/height/roughness maps (pw.py texture). Use on 'what references do I need', 'reference sheet', 'front side back views', 'turnaround', 'seamless texture', 'PBR maps from this photo'. Not for flat graphic...

Related Skills