polywright-finish (Finalisierung)
Ein Netz ist fertig, wenn es die Prüfung seines Zielsystems besteht, in einer Renderansicht korrekt aussieht und in der richtigen Größe und Ausrichtung importiert wird. Zurück zum Hub: ../polywright/SKILL.md. Engine-Details: references/engines.md. Schrittweise Erstellung und Finalisierung für eine Engine: references/roblox.md, references/unity.md, references/web-threejs.md. Netze, die sich gut verformen, schattieren und texturieren lassen: references/topology.md.
Schritt 1: Messen, dann entscheiden
pw.py inspect <datei> und pw.py check <datei> --target <ziel> --real-size-m X. Die Fehler zeigen, was zu tun ist: zu viele Dreiecke, keine UVs, zu viele Materialien, falsche Größe, offene Kanten, und für Spiel-, Web- und AR-Ziele umgekehrte oder gestapelte Flächen sowie ungleichmäßige UV-Dichte (inspect --topology; umgekehrte Flächen: convert --fix-winding). Vor und nach jedem destruktiven Schritt rendern (pw.py render).
Schritt 2: Skalierung, Ausrichtung, Pivot
- Echte Größe in Metern:
pw.py convert eingabe ausgabe --size-m X --ground --center(längste Seite auf X; bei ungewöhnlichen Formen ein bekanntes Maß verwenden). Eine Tür ist 2,0 bis 2,1 m, eine Stuhlsitzfläche 0,45 m, ein Tisch 0,75 m, eine Person 1,7 bis 1,8 m. - Pivot: bei Requisiten am unteren Mittelpunkt, bei Türen am Scharnier, bei Rädern an der Achse, bei Waffen am Griff.
- Achsen: Blender +Z oben und die Vorderseite zeigt -Y; glTF +Y oben und die Vorderseite zeigt +Z; Unreal +Z oben in Zentimetern; Unity +Y oben linkshändig; Roblox +Y oben, 1 Stud = 0,28 m. Im Zweifelsfall den Export mit einem 1-m-Würfel und einem Richtungspfeil testen.
Schritt 3: Geometrie für das Ziel
| Bedarf | Maßnahme |
|---|---|
| Weniger Dreiecke, statische Requisite | pw.py convert --max-tris N (Collapse-Decimation erhält die Silhouette); LODs mit pw.py lods (ca. halbieren pro Stufe) |
| Weniger Dreiecke, sich verformendes Netz | Keine Decimation: Schleifen zusammenführen, wo sich nichts verformt, Schleifen an Gelenken erhalten (references/topology.md) |
| Saubere Quads für Verformung oder Sculpting | Zuerst Voxel-Remesh (schließt das Netz), dann QuadriFlow (Rezept in polywright-blender), Instant Meshes, Quad Remesher (kostenpflichtig) oder gehostetes Quad-Remesh; Charaktere: von Hand |
| Generiertes Netz (dicht, klumpig, weiche Kanten) | Statische Requisite: decimieren und neu backen; Held oder animiert: Retopologie und neu backen; oder mit besseren Referenzen neu generieren |
| Viele Teile, die eins sein sollen | --join; für einen Volumenkörper pw.py union |
| Kollision | Eine Box, Kapsel oder konvexe Hülle pro Teil; Unreal UCX_-Präfix; Roblox CollisionFidelity Box oder Hull; niemals das Render-Mesh für bewegliche Objekte |
Schritt 4: UVs und Texturen
- UVs:
pw.py convert --uv(Smart UV Project) für Requisiten; einen zweiten, nicht überlappenden Satz für gebackene Lightmaps (Rezept); konsistente Texel-Dichte über ein Kit hinweg; Trim Sheets und Atlanten, um Materialien und Draw Calls zu reduzieren. - Backen vom dichten auf das niedrige Netz: Normal, AO, Farbe (Rezept
bake-high-to-low). Retopologie zerstört UVs, daher immer neu backen. - PBR Metal-Rough: Metallicity 0 oder 1, Roughness trägt das Aussehen, Albedo niemals rein schwarz oder weiß; glTF packt Occlusion, Roughness, Metallicity in R, G, B (ORM).
- Normal Maps: OpenGL (Y+) für Blender, Unity, Godot, glTF, three.js, Roblox; DirectX (Y–) für Unreal. Eine Fehlpaarung durch Invertieren von Grün korrigieren. Texturen in Potenzen von zwei; 1024 bis 2044 pro Material für Web und AR.
Schritt 5: Rig (wenn es sich bewegt)
A-Pose als Eingabe, sauberes, manifoldes Netz. UniRig (MIT, lokal, 8 GB) oder gehostet Tripo, Meshy, AccuRIG (sauberste humanoide Gewichte), Mixamo (humanoid, beste Retarget-Dokumentation). Ein Vergleich aus dem Jahr 2026 ergab, dass Meshy's Hüftpivot 5 bis 15 cm daneben lag (Füße rutschen) und AccuRIG einmal mit dem Maßstab 0,01 importierte: Maßstab und Pivot nach dem Rigging prüfen. Roblox: maximal 4 Bone-Influences pro Vertex, Root am Ursprung. Ein Rigify-Rig exportiert weit mehr Bones als seine Deform-Menge (278 von 706 bei nur Deform): für Spiele ein reines Deform-Skelett erstellen oder die obigen Routen verwenden.
Animationsclips: Jeden Clip auf einer von wenigen gemeinsamen Kernposen beginnen und enden lassen, damit die Clips ohne Blend aneinanderreihen; der erste Frame einer Schleife entspricht ihrem letzten; Root Motion oder In Place pro Clip festlegen und notieren; additive Clips (Zielen, Schauen, Neigen) als separate Aktionen über einer Basispose halten (Gregory, Game Engine Architecture 2e (2014), Abschn. 11.6).
Schritt 6: Exportieren und verifizieren
pw.py convert schreibt GLB, FBX, OBJ, USD/USDZ, STL. Pro Ziel:
| Ziel | Export | Dann |
|---|---|---|
| game-roblox | FBX, OBJ oder GLB pro MeshPart, unter 20k Dreiecken, ein Material | check --target game-roblox; roblox-agent platziert es |
| game-unity | GLB (glTFast) oder FBX --fbx-bake-axes | Importtest im Projekt (unity-agent) |
| game-unreal | FBX oder GLB; Nanite für dichte, opake Netze | Maßstabsprüfung beim Import |
| web-threejs | GLB, dann gltf-transform optimize in.glb out.glb --compress meshopt --texture-compress ktx2 --join-named false | gltf_validator; Seitenprüfung (threewright) |
| ar-usdz | convert in.glb out.usdz | usdchecker --arkit wenn usd-core installiert ist |
| video-blockout | GLB oder .blend in Echtgröße, plus Drehteller und Tiefen-/Normal-Pässe (Rezepte) | an das Video-Plugin übergeben (cinewright) |
| commerce-gltf | GLB, Echtgröße, Ursprung unten mittig, nur Dreiecke | check --target commerce-gltf |
Smooth by Angle ist ein Geometry-Nodes-Modifikator in Blender 4.1 und höher: Export mit angewendeten Modifikatoren, sonst werden harte Kanten überglättet (gleichermaßen bei glTF, FBX und OBJ, geprüft ab Version 5.2.1). Jede Ausgabe protokollieren: pw.py manifest <verzeichnis> --add-output ausgabe/<datei> --target <ziel> --inspect.
Wartung
Evergreen-Einheit, Stufe moderate. Begleiter: RESEARCH.md, CHANGELOG.md, LEARNINGS.md, TESTS.md mit evals/evals.json, MAINTENANCE.md, Zustand in evergreen.json. evergreen.json bei jeder Nutzung lesen; bei Fälligkeit aktualisieren.