polywright-finish은(는) 무엇을 하나요?
메시는 대상 플랫폼의 검사를 통과하고, 렌더링에서 올바르게 보이며, 올바른 크기와 방향으로 임포트될 때 완성됩니다. 허브로 돌아가기: ../polywright/SKILL.md. 엔진 세부 정보: references/engines.md. 한 엔진에 맞춰 제작하고 완성하는 단계별 가이드: references/roblox.md, references/unity.md, references/web-threejs.md. 휘어짐, 음영 및 텍스처가 잘 적용되는 메시: references/topology.md.
1단계: 측정 후 결정
pw.py inspect <file> 및 pw.py check <file> --target <t> --real-size-m X를 실행합니다. 실패 항목이 무엇을 해야 할지 알려줍니다: 삼각형 수 초과, UV 없음, 재질 수 초과, 크기 오류, 열린 모서리, 그리고 게임/웹/AR 대상의 경우 뒤집히거나 겹친 면, 불균일한 UV 밀도(inspect --topology; 뒤집힌 면: convert --fix-winding). 파괴적인 단계 전후로 항상 렌더링합니다(pw.py render).
2단계: 스케일, 방향, 피벗
- 실제 크기(미터):
pw.py convert in out --size-m X --ground --center(가장 긴 면을 X로 설정; 비정형 형태는 알려진 치수 사용). 문은 2.02.1m, 의자 좌석은 0.45m, 테이블은 0.75m, 사람은 1.71.8m입니다. - 피벗: 소품은 하단 중앙, 문은 경첩, 바퀴는 축, 무기는 손잡이.
- 축: Blender는 +Z가 위, 앞면은 -Y; glTF는 +Y가 위, 앞면은 +Z; Unreal은 cm 단위 +Z 위; Unity는 +Y 위, 왼손 좌표계; Roblox는 +Y 위, 1 스터드 = 0.28m. 확실하지 않을 때는 1m 큐브와 방향 화살표로 내보내기 테스트.
3단계: 대상에 맞는 지오메트리
| 필요 사항 | 수행 방법 |
|---|---|
| 삼각형 수 줄이기, 정적 소품 | pw.py convert --max-tris N (collapse decimation이 실루엣 유지); LOD는 pw.py lods (레벨당 약 절반) |
| 삼각형 수 줄이기, 휘어지는 메시 | decimation 사용 금지: 휘지 않는 곳에서 루프 병합, 관절 주변 루프 유지 (references/topology.md) |
| 변형 또는 조각용 깔끔한 쿼드 | 먼저 복셀 리메시(닫힘), 그다음 QuadriFlow(polywright-blender 레시피), Instant Meshes, Quad Remesher(유료), 또는 호스팅 쿼드 리메시; 캐릭터: 수동 |
| 생성된 메시(밀도 높음, 울퉁불퉁, 부드러운 모서리) | 정적 소품: decimate 후 재베이킹; 히어로 또는 애니메이션: 리토폴로지 후 재베이킹; 또는 더 나은 레퍼런스로 재생성 |
| 여러 파트를 하나로 합쳐야 함 | --join; 솔리드의 경우 pw.py union |
| 콜리전 | 파트당 박스, 캡슐 또는 볼록 껍질; Unreal UCX_ 접두사; Roblox CollisionFidelity Box 또는 Hull; 움직이는 오브젝트에는 렌더 메시 사용 금지 |
4단계: UV 및 텍스처
- UV: 소품은
pw.py convert --uv(Smart UV Project); 베이크된 라이트맵용 두 번째 비중첩 UV 세트(레시피); 키트 전체에 일관된 텍셀 밀도; 트림 시트와 아틀라스로 재질 및 드로우 콜 절감. - 고밀도 메시에서 저밀도 메시로 베이킹: 법선, AO, 컬러 (레시피
bake-high-to-low). 리토폴로지는 UV를 파괴하므로 항상 재베이킹. - PBR 메탈-러프: 메탈릭 0 또는 1, 러프니스가 외관 결정, 알베도는 순수 검정/흰색 사용 금지; glTF는 오클루전, 러프니스, 메탈릭을 R, G, B (ORM)에 패킹.
- 법선 맵: OpenGL (Y+)은 Blender, Unity, Godot, glTF, three.js, Roblox용; DirectX (Y-)는 Unreal용. 불일치 시 녹색 채널 반전으로 수정. 텍스처는 2의 제곱 크기; 웹 및 AR용 재질당 1024~2048.
5단계: 리깅 (움직이는 경우)
A-포즈 입력, 깨끗하고 매니폴드한 메시. UniRig (MIT, 로컬, 8GB) 또는 호스팅 Tripo, Meshy, AccuRIG (가장 깨끗한 휴머노이드 웨이트), Mixamo (휴머노이드, 최고의 리타겟 문서). 2026년 비교 결과 Meshy의 엉덩이 피벗이 5~15cm 벗어남(발 미끄러짐) 및 AccuRIG가 0.01 스케일로 한 번 임포트됨: 리깅 후 스케일과 피벗 확인. Roblox: 버텍스 당 최대 4개 본 영향, 루트는 원점에 위치. Rigify 리그는 변형 세트보다 훨씬 많은 본을 내보냄(변형 전용 시 706개 중 278개): 게임용으로 변형 전용 스켈레톤을 만들거나 위 경로 사용.
애니메이션 클립: 각 클립은 공유 코어 포즈 중 하나에서 시작 및 종료하여 블렌드 없이 체인 연결; 루프의 첫 프레임은 마지막 프레임과 동일; 클립별로 루트 모션 또는 제자리 결정 및 기록; 베이스 포즈 위에 애드티브 클립(조준, 응시, 기울임)을 별도 액션으로 유지 (Gregory, Game Engine Architecture 2e (2014), sec. 11.6).
6단계: 내보내기 및 검증
pw.py convert는 GLB, FBX, OBJ, USD/USDZ, STL을 작성합니다. 대상별:
| 대상 | 내보내기 | 그 다음 |
|---|---|---|
| game-roblox | MeshPart당 FBX, OBJ 또는 GLB, 20k 삼각형 미만, 단일 재질 | check --target game-roblox; roblox-agent가 배치 |
| game-unity | GLB (glTFast) 또는 FBX --fbx-bake-axes | 프로젝트에서 임포트 테스트 (unity-agent) |
| game-unreal | FBX 또는 GLB; 밀도 높은 불투명 메시용 Nanite | 임포트 시 스케일 확인 |
| web-threejs | GLB, 그 다음 gltf-transform optimize in.glb out.glb --compress meshopt --texture-compress ktx2 --join-named false | gltf_validator; 페이지 확인 (threewright) |
| ar-usdz | convert in.glb out.usdz | usd-core 설치 시 usdchecker --arkit |
| video-blockout | 실제 스케일의 GLB 또는 .blend, 턴테이블 및 뎁스/법선 패스 (레시피) | 비디오 플러그인에 전달 (cinewright) |
| commerce-gltf | GLB, 실제 크기, 원점 하단 중앙, 삼각형만 | check --target commerce-gltf |
Smooth by Angle은 Blender 4.1 이상에서 Geometry Nodes 모디파이어입니다: 모디파이어가 적용된 상태로 내보내야 하며, 그렇지 않으면 하드 엣지가 부드럽게 처리되어 나옵니다(glTF, FBX, OBJ 모두 5.2.1에서 확인). 각 출력 기록: pw.py manifest <dir> --add-output out/<file> --target <t> --inspect.
유지보수
Evergreen 유닛, 등급 moderate. 동반 파일: RESEARCH.md, CHANGELOG.md, LEARNINGS.md, TESTS.md (evals/evals.json 포함), MAINTENANCE.md, 상태는 evergreen.json. 사용할 때마다 evergreen.json을 읽고, 갱신 시기가 되면 새로고침.