O que polywright-finish faz?
Uma malha está finalizada quando passa na verificação do seu destino, parece correta em uma renderização e importa no tamanho e orientação certos. Voltar ao hub: ../polywright/SKILL.md. Detalhes dos motores: references/engines.md. Criar e finalizar para um motor, passo a passo: references/roblox.md, references/unity.md, references/web-threejs.md. Malhas que deformam, sombreiam e texturizam bem: references/topology.md.
Passo 1: medir, depois decidir
pw.py inspect <arquivo> e pw.py check <arquivo> --target <t> --real-size-m X. As falhas dizem o que fazer:
triângulos demais, sem UVs, muitos materiais, tamanho errado, arestas abertas e, para jogos, web e AR, faces
invertidas ou empilhadas e densidade UV irregular (inspect --topology; faces invertidas: convert --fix-winding). Renderize
antes e depois de cada etapa destrutiva (pw.py render).
Passo 2: escala, orientação, pivô
- Tamanho real em metros:
pw.py convert in out --size-m X --ground --center(maior lado para X; use uma dimensão conhecida para formas irregulares). Uma porta tem 2,0 a 2,1 m, um assento de cadeira 0,45 m, uma mesa 0,75 m, uma pessoa 1,7 a 1,8 m. - Pivô no centro inferior para objetos de cena, na dobradiça para portas, no eixo para rodas, no cabo para armas.
- Eixos: Blender +Z para cima e a frente para -Y; glTF +Y para cima e a frente para +Z; Unreal +Z para cima em centímetros; Unity +Y para cima, canhoto; Roblox +Y para cima, 1 stud = 0,28 m. Teste uma exportação com um cubo de 1 m e uma seta de frente quando estiver em dúvida.
Passo 3: geometria para o destino
| Necessidade | Faça |
|---|---|
| Menos triângulos, objeto estático | pw.py convert --max-tris N (decimação por colapso mantém a silhueta); LODs com pw.py lods (cerca de metade por nível) |
| Menos triângulos, malha que deforma | não decimar: mesclar loops onde nada deforma, manter loops ao redor das juntas (references/topology.md) |
| Quads limpos para deformação ou escultura | primeiro remesh voxel (fecha a malha), depois QuadriFlow (receita no polywright-blender), Instant Meshes, Quad Remesher (pago), ou um remesh quádruplo hospedado; personagens: manualmente |
| Malha gerada (densa, irregular, bordas suaves) | objeto estático: decimar e re-bake; herói ou animado: retopologia e re-bake; ou regenerar com referências melhores |
| Muitas partes que deveriam ser uma | --join; para um sólido, pw.py union |
| Colisão | uma caixa, cápsula ou convex hull por parte; Unreal prefixo UCX_; Roblox CollisionFidelity Box ou Hull; nunca a malha de render para objetos em movimento |
Passo 4: UVs e texturas
- UVs:
pw.py convert --uv(Smart UV Project) para objetos de cena; um segundo conjunto não sobreposto para mapas de luz horneados (receita); densidade de texel consistente em um kit; folhas de trim e atlases para reduzir materiais e chamadas de draw. - Bake da malha densa para a malha baixa: normal, AO, cor (receita
bake-high-to-low). Retopologia destrói UVs, então sempre re-bake. - PBR metal-rough: metalicidade 0 ou 1, rugosidade carrega a aparência, albedo nunca preto ou branco puro; glTF empacota oclusão, rugosidade, metalicidade em R, G, B (ORM).
- Mapas normais: OpenGL (Y+) para Blender, Unity, Godot, glTF, three.js, Roblox; DirectX (Y-) para Unreal. Corrija uma incompatibilidade invertendo o verde. Texturas em potências de dois; 1024 a 2048 por material para web e AR.
Passo 5: rig (quando se move)
Entrada em pose A, malha limpa e manifold. UniRig (MIT, local, 8 GB) ou Tripo hospedado, Meshy, AccuRIG (pesos mais limpos para humanoides), Mixamo (humanoides, melhores documentos de retarget). Uma comparação de 2026 descobriu que o pivô do quadril do Meshy está 5 a 15 cm deslocado (pés deslizam) e o AccuRIG importa uma vez na escala 0,01: verifique escala e pivô após rigging. Roblox: no máximo 4 influências de osso por vértice, raiz na origem. Um rig Rigify exporta muito mais ossos do que seu conjunto de deformação (278 de 706 com apenas deformação ativada): para jogos, construa um esqueleto apenas de deformação ou use as rotas acima.
Clipes de animação: inicie e termine cada clipe em uma de algumas poses centrais compartilhadas para que os clipes se encadeiem sem mistura; a primeira imagem de um loop é igual à sua última; decida movimento da raiz ou no lugar por clipe e anote; mantenha clipes aditivos (mirar, olhar, inclinar) como ações separadas sobre uma pose base (Gregory, Game Engine Architecture 2e (2014), sec. 11.6).
Passo 6: exportar e verificar
pw.py convert escreve GLB, FBX, OBJ, USD/USDZ, STL. Por destino:
| Destino | Exportar | Depois |
|---|---|---|
| game-roblox | FBX, OBJ ou GLB por MeshPart, abaixo de 20k triângulos, um material | check --target game-roblox; roblox-agent o posiciona |
| game-unity | GLB (glTFast) ou FBX --fbx-bake-axes | teste de importação no projeto (unity-agent) |
| game-unreal | FBX ou GLB; Nanite para malhas opacas densas | verificar escala na importação |
| web-threejs | GLB, depois gltf-transform optimize in.glb out.glb --compress meshopt --texture-compress ktx2 --join-named false | gltf_validator; verificar na página (threewright) |
| ar-usdz | convert in.glb out.usdz | usdchecker --arkit quando usd-core estiver instalado |
| video-blockout | GLB ou .blend na escala real, além de turntables e passes de profundidade/normal (receitas) | entregar ao plugin de vídeo (cinewright) |
| commerce-gltf | GLB, tamanho real, origem centro inferior, apenas triângulos | check --target commerce-gltf |
Suavizar por ângulo é um modificador Geometry Nodes no Blender 4.1 e posterior: exporte com modificadores aplicados, ou as
arestas duras sairão suavizadas demais (glTF, FBX e OBJ igualmente, verificado na versão 5.2.1). Registre cada saída: pw.py manifest <dir> --add-output out/<arquivo> --target <t> --inspect.
Manutenção
Unidade sempre atualizada, nível de esforço moderate. Acompanhantes: RESEARCH.md, CHANGELOG.md,
LEARNINGS.md, TESTS.md com evals/evals.json, MAINTENANCE.md,
estado em evergreen.json. Leia evergreen.json a cada uso; atualize quando necessário.