3d-renderlisted
Install: claude install-skill jsb4702-glitch/verification-harness
# 3d-render — 로컬 3D 렌더 파이프라인
전부 이 머신에서 실행: OCP 7.9(STEP 파서)·VTK 9.6(프리뷰)·Blender 4.3.2(`/Applications/Blender.app`)·trimesh. 모델 파일은 밖으로 안 나간다(텍스처 다운로드만 아웃바운드).
## 입력 경계 · 형상 신뢰
- **렌더 전 형상 검증 필수**: 삼각화 직후 preview.py로 실물 대조. 이상하면(고리/판 등 원본에 없는 형상) 트림 소실 의심 — 컨버터 산출 STEP(convert3d 등)에서 OCP STEPControl/XCAF 리더가 와이어를 잃는 사례 실측. ShapeFix로도 안 낫는다.
- **트림 소실 시 우회**: `node scripts/occt2stl.mjs in.stp out.stl` (occt-import-js WASM — 같은 파일을 정상 트림으로 삼각화, deflection 파라미터 내장). stp-analyzer 뷰어(포트 8742, stp-assets 허용트리에 파일 복사 후 fetch 주입)로 육안 교차확인 가능.
- **분리 저장 멀티바디**: 반쪽들이 이격 저장된 파일 존재(66mm 갭 실측) — trimesh split 후 접합면 z-이동 조립. 접합 전 컴포넌트 census(면적·bbox·중심) 필수, 저밀도 대형 시트=작도면이니 제외.
- 되는 것: STEP/IGES(OCP), STL/OBJ/PLY/GLB(trimesh/Blender 직import)
- 안 되는 것: SLDPRT/SLDASM, NX .prt, Parasolid x_t, JT → STEP 내보내기 요청할 것
## 파이프라인 (scripts/)
```
1. tessellate.py IN.step OUTDIR [--defl 0.12] [--ang 0.25] [--split-band]
→ model.stl (또는 model_main.stl + model_band.stl)
--split-band: z단면 폭이 전체의 35% 미만인 좁은 구간(기둥/샤프트)을 별도 STL로 분리 → 이중 재질용
2. rotate_stl.py in.stl out.stl [--up ux,uy] [--rotx/--roty/--rotz DEG]
자세 만들기. --up: 원좌표 xy평면의 (ux,uy)방향을 새 +Z로(원 Z축은 수평 +Y가 됨). 파트 여러 개면 같은 옵션 반복 적용.
3. preview.py out.png a.stl [b.stl] [--floor | --block XE,TOP] [--cam x,y,z]
VTK 오프스크린 ~5초. 자세·접지·블록 배치는 반드시 여기서 눈으로 확정 후 Cycles로.
4. quadview.py IN.step OUTDIR # 엔지니어링 4뷰 시트(등각+정면/평면/측면 정사영, XCAF 색상 지원)
5. studio_render.py (Blender로 실행):
/Applications/Blender.app/Contents/MacOS/Blender -b --python stud