kidstoon — 작업 규칙
규칙만 둔다. 상태·진행은
handoff.md, 설계 결정·근거는design.md, 상세 정본은devplan/kidstoon.html.
🆕 신규
- 🔑2026-08-23 턴어라운드는 컷별로 받지 말고 「4컷 2x2 한 시트」로 받는다(페페 지시 ·
tools/gen_sheet_v4.py→tools/split_sheet.py). 컷을 따로 그리면 등신·전신높이가 표류한다(v3 실측 889/796/796/954 = 편차 16.5%) — 한 시트면 5.4% 로 떨어지고 나머지는--norm-height 880이 흡수한다. 참조 사진은 붙이지 마라(페페 지시, 텍스트 지시만) — 정체성은 팔레트·부위 규칙으로 재현된다(실측 게이트 0.8328 로 최고점). 분할기는 컷 간 높이 편차를 자동 계측하니 5% 초과면 시트를 다시 받아라. - 🔴2026-08-23 시트에서 팔이 몸통에 닿아 있으면 TRELLIS 가 팔을 몸통에 융합한다. 계측 = 전신 y 55~70% 가로줄의 전경 덩어리 개수(3 = 팔·몸통·팔 분리 · 1 = 붙음). 실측 v2 front
[1,3,13,3](분리) vs v3 front[1,1,1,5](붙음) → v3 GLB 는 팔이 몸통에 먹혔고 v2 기반 F0b 는 팔이 살아 있다. 시트는 A-포즈로 팔을 벌려 그려야 한다 — 같은 시트로 TRELLIS 를 다시 돌려봐야 융합은 그대로다(메시는 매번 달라져도). - ⚠2026-08-23 「orbit.mp4 는 멀쩡한데 GLB 는 이상하다」는 정상이다 —
orbit.mp4는 가우시안 렌더라 메시·UV·bake·GLB 를 안 거친다(8/23 규명). 납품물 판정은 GLB 직접 렌더(glb_cpu_render.py) 나gate-*.png로만 한다. 둘을 비교해 「바디는 옛것, 텍스처만 새것」이라고 읽으면 오진이다. - 🔴2026-08-23 게이트 마스터는 「현행 시트 판」이어야 한다.
gate_master.py가 v2 시트로 고정돼 있어 v3 모델이 0.6275 FAIL 로 찍혔다 — 닫힌 점프슈트·흰 배 패치 제거·머리 깊이 교정은 의도한 재설계인데 옛 마스터가 오차로 셌다. 같은 렌더를 v3 마스터로 재니 0.8136 PASS. 이제 판을 자동 선택한다(--master v2로 강제). 시트 판을 올리면 게이트 마스터도 같이 올린다. - 🔑2026-08-23 시트가 이상하면 프롬프트가 아니라
pepenyang_master.json의 모순을 먼저 봐라. 측면 2컷이 둘 다 그레이로 나온 건(드리프트①)views.*.must_show(치즈)와parts[*].views.*.color_rule(gray dominant)이 서로 반대였기 때문이고, GPT 는 부위 규칙 쪽을 따랐다. 색·치수 판정의 정본 =front.must_show(화면좌 gray = 해부학적 오른쪽). 뷰마다 「이 뷰의 모든 털은 X」 한 줄을 박아 두면 표류가 준다. - 2026-08-23 v3 전체 공정 =
tools/trellis_v3.bat한 방(cut_g/cut_h → deface 참조 → facedrop2 → TRELLIS). ⚠집PCD:\kidstoon\tools엔 py 도구가 안 올라가 있다 —gpubox.py push로 먼저 밀어라(cutout_alpha·deface_sheet·facedrop_sheet).facedrop_sheet.py는 자기 폴더 기준으로reference\turnaround를 찾으니D:\kidstoon\tools에서 돌려야 한다(D:\trellis 에서 돌리면 D:\reference 를 본다). - 🔑2026-08-23 시트 생성은 GPT PC 앱으로 한다 =
gptapp.py image(나노바나나 아님, 페페 지시). 앱은 그냥 ChatGPT 윈도우 앱(AppxOpenAI.Codex) — classic 아니다. 생성물을 놓쳤으면 재생성 말고gptapp.py grab <out.png>로 회수한다. 🔴함정 전집(webview 타깃·Enter 전송 불가·첨부 씹힘·naturalWidth0·첨부 뒤 스냅샷) =rules/tooling.md맨 위 한 곳에만 둔다. - ⚠2026-08-24 턴어라운드 생성엔
imagegen(strip_watermark=False)를 써라. 기본값 True 는 하단 15%를 통째로 잘라내는데 전신컷은 발이 그 밴드에 들어가 장화가 매번 잘린다(실측 2회). 워터마크는 우하단 구석뿐이라 그 사각만 배경색으로 덮으면 된다(gen_turnaround_v3.py). - 2026-08-24 캐릭터 시트 사양 정본 =
reference/spec/pepenyang_master.json. 전신높이 1.0 정규화, 부위 18·기준선 18·실루엣표본 10·검증규칙 30. 시트를 다시 뽑을 땐 이 JSON을 고치고gen_turnaround_v3.py가 프롬프트로 펼치게 한다 — 프롬프트를 직접 손대지 마라(v2가 그렇게 산문이 됐다). - 🔴2026-08-24
pythonw에선sys.stdout이 None 이다 — CLAUDE.md 규약대로 진입부에sys.stdout.reconfigure(...)를 넣으면 즉시 AttributeError 로 죽는다. 창이 없으니 흔적도 안 남고 「서버가 안 뜬다」로만 보인다(실측, 30분 태움). 상주 스크립트는if sys.stdout is None: sys.stdout = sys.stderr = open(<로그>, 'w', encoding='utf-8', buffering=1)로 갈라 쓴다. - 🔴2026-08-24 Windows 에서
TCPServer.allow_reuse_address = True는 남의 포트를 가로챈다. 리눅스의 TIME_WAIT 회피와 달리 Windows SO_REUSEADDR 는 이미 LISTENING 중인 포트에도 조용히 bind 된다 → 리스너가 2개가 되고 요청이 남의 서버로 샌다(실측: 8801 에 ai-study 서버가 있는데 겹쳐 붙어 302 로 남의 로그인 페이지가 나왔다). 켜지 마라 — 포트 충돌은 에러로 드러나는 게 맞다. - 2026-08-24 미니PC엔 3D 뷰어·Blender 가 없다(.glb 파일 연결 없음). GLB 육안은
PYTHONUTF8=1 python kidstoon/tools/glb_viewer.py --only <필터> --port 8811→http://127.0.0.1:8811/_viewer.html. model-viewer 로컬 사본이라 설치 0·오프라인 동작, 카메라 동기화 체크박스가 있어 여러 종을 같은 각도로 동시 비교한다. - 🔴2026-08-24 하이브리드에선 「민얼굴 베이스」를 만들 수 없다 — 가우시안이 눈을 갖고 있다. 시트에서 눈을 지우거나(deface) 알파를 파도(
cut_h_dropall) 가우시안 관측이 눈을 다시 칠한다(실측 홍채색 비율 D 0.485·E 0.486 = NATIVE 0.487 과 동일). R8 눈·입 스왑을 하려면 시트가 아니라 가우시안 렌더 쪽에서 얼굴을 지우거나 얼굴을 별도 파트로 분리해야 한다(경로 E). - ⚠2026-08-24 TRELLIS 는
--seed를 고정해도 메시가 매번 다르다. 같은 입력·같은 seed 10회에서 verts 12,590~13,129 로 전부 달랐다 → UV 가 매번 재배치돼 텍스처 선명도가 런마다 흔들린다. A/B 비교에서 변형 효과(픽셀차 1.0~1.6)가 이 런노이즈보다 작을 수 있다 — 시트 변형처럼 미세한 변수를 재려면 메시를 1회 생성해 고정하고 bake 만 반복해야 한다. - 🔴2026-08-24
deface_sheet.py는 눈을 못 지운다 — 밝은 홍채를 남긴다. 어두운 덩어리(눈꺼풀·동공)만 인페인팅해서 창백한 원형 잔상이 남는다(실측: cut_h vs cut_noface 측면 시트). 그 잔상이 bake 관측으로 들어가 볼에 유령 눈을 찍고, 민얼굴 베이스 위에 눈 패치를 얹으면 「얼굴이 이중으로 겹쳐 보인다」가 된다 — 현 테스트 영상의 그 증상이 이것이다. 관측에서 빼려면 인페인팅이 아니라 알파를 0으로 파야 한다(cut_h_eyedrop). ⚠단 알파를 파도 유령은 안 사라졌다 → 아래 항목. - 🔑2026-08-24 유령 눈·유령 선의 범인 = 측면 시트다(A/B 확정). 같은 조건(2048·TV off·가우시안 0)에서
cut_h(눈 4개) vscut_h_eyedrop(눈 2개) 로 갈렸다. 측면 원화의 눈은 「같은 눈을 옆에서 그린 2D 그림」이라 옆 카메라로 쏘면 광선이 머리 옆면(볼) 에 맞는다(메시의 진짜 눈은 앞면). 같은 원리로 측면 시트의 수염·주둥이선·머리 윤곽선이 얼굴을 가로지르는 곡선이 된다. 해법 =facedrop_sheet.py— 측면 시트의 눈에서 앞·아래 사분면(눈 크기 단위 직사각)을 알파 0 으로 판다.--no-edge로 윤곽선 띠까지 파야 얼굴 가로지르는 곡선까지 사라진다(실측:cut_h_facedrop2= F0b 가 최선). ⚠~~「원화 4뷰 단독 경로 종결」은 오판이었다~~ — ③b 를 1024+TV 로 돌려 다른 기준선과 비교한 탓. 경로는 살아 있다. - ⚠2026-08-24
facedrop_sheet.py에서 눈 위치를 색(hue)으로 찾지 마라 — 주황 털·재킷 트림이 같은 색상대라 가슴에 사각형을 판다(실측).cut_noface와의 RGB 차이 중 가장 큰 덩어리가 눈이다(입·코까지 포함한 전체 bbox 를 쓰면 실루엣 80%를 판다). - ⚠2026-08-24 ssh 로
set PYTHONUTF8=1 & <명령>을 보내지 마라 — 뒤 공백이 값에 들어가invalid PYTHONUTF8 environment variable value로 파이썬이 죽는다. 원격 실행은 .bat 로 보낸다. +Bash 도구 2분 타임아웃에 걸려 ssh 가 끊기면 원격 배치도 같이 죽는다 → 긴 배치는run_in_background. - 🔴2026-08-24
orbit.mp4는 납품물이 아니다 — TRELLIS 가우시안 렌더다.trellis_gen.py마지막 줄이render_utils.render_video(outputs["gaussian"][0])라 메시·UV·bake·GLB 를 한 바이트도 안 거친다. 그래서 모든 실행 폴더의 orbit.mp4 가 예외 없이 깨끗하다(final·final3·run1·cut1 전부) — 「final3 만 완벽」이 아니라 원래 다 완벽했다. 텍스처 판정은 반드시glb_cpu_render.py로 GLB 를 직접 렌더해서 한다. (같은 계열 함정 = 게이트 턴테이블 동어반복, §10) - 🔴2026-08-24 원화 4컷 직접 back-projection 은 유령 눈을 「원리적으로」 만든다. 측면 시트의 눈은 같은 눈을 옆에서 그린 2D 그림인데, 옆 카메라로 쏘면 그 광선은 머리 옆면(볼) 에 맞는다 → 정면에서 보면 눈이 4개. 앞섶처럼 4뷰 모두 스치듯 보는 면은 텍셀당 관측이 1~2개뿐이라 최적화가 미결정 → 체커 얼룩. texture_size·lambda-tv·simplify 로 못 고친다(1024+TV 는 증상만 옅게 한다). 3D 정합이 필요하면 관측을 가우시안 1000뷰(TRELLIS 기본
to_glb)로 바꾸는 것 말고 길이 없다 — 조사에서 나온 「디자이너는 턴어라운드를 눈 참조로만 쓴다」가 코드로 나타난 것이다. - 2026-08-24 집PC(gpubox)는 반복작업 동안 계속 켜둔다(페페 지시) — 「wake→실행→off」 1회 단위 규약은 kidstoon 반복작업엔 적용 안 한다. 작업 묶음이 끝났을 때만 off. 30분 유휴 백스톱이 있으니 켜둔 채 세션이 끊겨도 알아서 꺼진다.
- 2026-08-22 캐릭터는 전부 이족(bipedal)으로 설계한다. 4족이면 상업 가능한 모캡이 세상에 없어서(deskpet 확정) 애니를 전량 손으로 만들어야 한다. 이족이면 Mixamo 무료 클립 + 유니티 Humanoid 리타게팅이 그대로 붙는다. 치비 비율이어도 관절 구성은 인간형으로 유지해야 매핑된다. 네 발 존재가 필요하면 대사 없는 「마을 애완동물」로 격하한다.
- 2026-08-22 립싱크에 블렌드셰이프를 만들지 마라. Rhubarb는 원래 2D 만화 입 그림 교체용 도구고 출력이 A~H 8종 코드+타임코드다 → 입 쿼드 1장 + 8칸 텍스처 아틀라스의 UV 오프셋 스왑이면 끝난다. AI 생성 메시엔 셰이프키가 없어 캐릭터마다 입을 조각하는 게 이 파이프라인 최대의 숨은 비용인데, 그게 통째로 사라진다. 눈·눈썹(감정)도 같은 방식. ⚠Rhubarb 음소는 영어 기반이라 한국어는 근사 — 안 맞으면 uLipSync(음향 기반, 언어 무관)로 갈아탄다.
- 2026-08-22 환경(마을·소품)은 AI로 생성하지 않는다. Kenney CC0 / Synty 같은 에셋 키트 조립이 더 싸고 재현성 있다. AI 생성은 캐릭터와 컨셉 참조까지. 3D 생성 크레딧을 배경에 쓰면 캐스트를 못 뽑는다.
- 2026-08-22 이미지→3D 품질의 8할은 턴어라운드 시트 규격이 정한다. 정면/측면/후면 · A포즈 · 무지 배경 · 균일광 · 그림자 없음. 조명이 강하면 그림자가 텍스처에 구워져 들어와 어떤 조명 아래서도 안 지워진다.
- ~~2026-08-22 이 PC엔 외장 GPU가 없다(Radeon 780M)~~ → 🔄같은 날 저녁 폐기.
gpubox로 집PC(RTX 4070 Ti SUPER 16GB · Ryzen 9 9900X · 31GB)를 온디맨드로 쓴다. 로컬 3D 확산모델·오프라인 렌더 가능해졌다. 단 엔진 결론은 안 바뀐다 — 유니티를 쓰는 진짜 이유는 렌더가 아니라 자동 조립 API(Timeline·Cinemachine·Humanoid 리타게팅)이고, Cycles 로 5분물을 뽑으면 9,000프레임 × 20초 = 50시간/편이라 주 1편이 불가능하다. 근거 전문 =design.mdD8. - 2026-08-22 Unity Personal 라이선스는 Hub GUI 로그인이 유일한 경로다.
.alf/.ulf수동 활성화는 Personal 대상으로 폐지됐다(license.unity3d.com 이 명시: "Unity no longer supports manual activation of Personal licenses"). Hub CLI--headless에도 login/license 명령이 없다 → 헤드리스로 라이선스를 딸 수 없다. 새 머신에 Unity를 얹을 때마다 사람이 GUI 로그인 1회를 해야 한다. 여기에 시간 쓰지 말고 바로 사람에게 넘긴다. - 2026-08-22 집PC는 Windows 11 Home 이라 RDP 서버가 원천 없다.
fDenyTSConnections=0+ 방화벽 +TermService기동까지 다 해도 3389 리스너가 안 생긴다(설정 문제 아님, 에디션 문제). 원격 GUI 가 필요하면 AnyDesk 류 세션공유형이나 Pro 업그레이드뿐이다. 진단 =netstat | findstr :3389가 비었는데 서비스는 Running 이면 에디션부터 본다. - 2026-08-22 ✅게이트⑤ 통과 — Unity
-batchmode는 SSH(Session 0)에서 실제 GPU 렌더를 한다.schtasks /IT우회 불필요. 실측 =device=NVIDIA GeForce RTX 4070 Ti SUPER · api=Direct3D12 · vram=16063MB, 큐브+구+방향광 PNG 정상(육안 확인). 검증기 =GateCheck.cs. - 🔴2026-08-22 Unity batchmode 호출엔
-force-device-index 1을 항상 붙인다. 안 붙이면 9900X 내장 GPU(AMD Radeon Graphics)로 렌더한다 — 실측으로 그렇게 나왔다. 최악인 건 그래도 「성공」한다는 것이다(RESULT=PASS, PNG 정상). 에러도 경고도 없이 조용히 느려지므로 로그를 안 보면 영원히 모른다. 판정은SystemInfo.graphicsDeviceName한 줄 — 렌더 성공 여부로 판정하지 마라. 인덱스는Get-CimInstance Win32_VideoController순서(0=AMD 내장 · 1=4070). - 2026-08-22 winget 의 Unity Hub 매니페스트는 죽어 있다(설치 URL 404 → 종료코드 148). Unity 가 파일명을
UnityHubSetup.exe→UnityHubSetup-x64.exe로 바꿨다.winget install이 148 로 죽으면 Session 0 탓으로 오진하지 말고 매니페스트 URL 부터 의심하고 공식 CDN 에서 직접 받아/S로 깐다. - 2026-08-22 Mixamo에 의존하되 신뢰하지 마라. Adobe가 수년째 미유지보수(2025-06 다일 장애). 다운로드한 fbx는 로열티프리라 보관·사용 무제한이므로 P1에서 쓸 클립을 전량 로컬 미러링한 뒤 진행한다.
- 2026-08-22 캐릭터 승인은 눈대중 금지 — deskpet
compare_master.py게이트(≥0.80)를 재사용한다. 3D 결과가 컨셉 시트와 같은 캐릭터인지 수치로 판정한다. 새로 만들지 말고 그대로 가져다 쓴다. - 2026-08-22 어린이 콘텐츠는 YPP 단독 수익 전제로 설계하지 않는다. 유튜브가 2025-07 「반복」을 「비진정성 콘텐츠」로 개칭하고 대량양산 AI에 3진 아웃(경고→90일 정지→YPP 영구제외)을 적용 중이고, made-for-kids는 COPPA로 개인맞춤광고 금지·댓글 차단이라 CPM이 구조적으로 낮다. 브랜드·라이선싱·굿즈 병행을 전제로 기획한다. AI 사용 라벨은 성실히 표기한다.
- 2026-08-22 나노바나나에 「back」이라는 단어를 쓰지 마라 — 몸에 해골을 그린다. "back view"를 등뼈/골격으로 읽어 캐릭터 몸통에 뼈다귀를 그려 넣었다(실측). 뒷모습은
REAR VIEW+ 「카메라가 캐릭터 뒤에 있다」로 서술하고skeleton·bone·spine·x-ray를 네거티브로 박는다. - 2026-08-22 턴어라운드를 한 장에 3뷰로 요구하면 전부 정면으로 나온다. 컷 단위로 따로 생성해야 측면·후면이 실제로 돌아간다. 나노바나나는 직전 대화를 금방 잊으므로 매 컷마다 무늬·의상·스타일을 처음부터 전부 다시 기술한다(공유 상수로 강제 —
kidstoon/tools/gen_turnaround.py). - 2026-08-22 캐릭터 좌우는 「캐릭터 자신 기준」으로 정의하고 뷰마다 화면 어디에 오는지 따로 못박는다. 페페냥은 자기 오른쪽 얼굴 = 회색 태비 / 자기 왼쪽 얼굴 = 치즈 주황이라 정면에서는 화면상 좌우가 뒤집힌다. 「viewer's left」만 쓰면 측면·후면에서 반드시 어긋난다.
- 2026-08-22 페페 캐릭터 정본 =
kidstoon/reference/turnaround/pepe-sample.jpg(페페가 직접 뽑은 5뷰). 의상 = 올리브 작업 점프수트 + 주황 어깨 요크 + 앞 열림(흰 가슴·배 노출) + 가슴/허벅지/엉덩이 포켓 + 주황 고무장화. ⚠그 샘플의 라벨 「2.5 Head Chibi」와 길쭉한 몸은 잘못 나온 것(페페 확인) — 비율 정본은 3등신(머리 = 전신의 1/3)이다. - 🔴2026-08-22 나노바나나는 등신 비율 지시를 안 따른다 — 프롬프트로 풀려 하지 마라. 실패한 방식 다섯 가지(전부 실측 3.4~4.0등신) = ①문장 중간에 「3등신」 ②「머리:몸 = 1:2」 수치 ③「전신을 3등분하면 위 1/3이 머리」 ④「4등신은 틀렸다, 검산해라」 ⑤원본 그림을 주고 옷만 입히라는 편집 지시 ⑥업계 표준 프롬프트 기법(웹조사 반영 — 비율을 맨 앞에 명시 +
super deformed·SD character·q-version·3頭身장르 신호어를 선두 스타일 블록으로 + 해부 지시 분리). 여섯 번째까지 실패했으면 구조적 한계다 — 더 손보는 건 하루 생성량만 태운다. 📎참고 = 「3.5를 넘으면 모델이 chibi 가 아니라 「키 작은 애니 캐릭터」로 읽는다」(업계 통설). 우리 결과가 정확히 그 구간이었다. 표준 비율 = SD 2:1 · 클래식 치비 3:1 · 세미치비 4:1 · Q스타일 5:1. ✅현재 해법 = 후처리kidstoon/tools/fix_ratio.py— 머리는 두고 몸만 세로 압축. 턱 y좌표를 실루엣 가로폭 최소점으로 자동 검출하므로 인자 없이 돌리면 된다(수동 눈대중보다 정확했다: 눈대중 205 vs 실제 193 → 등신 오측정 3.35 vs 실제 3.71). 치비는 원래 다리가 짧아 압축이 형태상으로도 맞고 왜곡이 눈에 안 띈다. 원본은*-raw.png로 남긴다. 🔜근본 해법 = 로컬 ControlNet OpenPose — 스켈레톤 와이어프레임을 주면 비율·포즈가 구조적으로 강제된다(프롬프트 설득이 아니다). 나노바나나는 ControlNet 이 없어 원천 불가. 집PC GPU 에 TRELLIS 를 얹을 때 같은 스택(ComfyUI/PyTorch)으로 SDXL+ControlNet 도 함께 세우면 캐릭터 비율 문제가 통째로 사라진다. 제어강도 = SDXL 1.0 근처 · FLUX 0.6~0.8. - ✅2026-08-22
back금지어 우회가 실전 검증됐다.REAR VIEW+ 「카메라가 캐릭터 뒤에 있다」 +skeleton/bone/spine/x-ray네거티브 조합으로 해골 없이 정상 뒷모습이 나왔다. 얼굴도 완전히 가려졌다(눈·코·수염 0). 같은 조합을 다른 캐릭터에도 그대로 쓴다. - 2026-08-22 턴어라운드 생성 = 3컷 따로 + 매 컷 등신 자동보정이 한 세트다.
gen_turnaround.py {front|side|rear}가 생성 →fix_ratio.py자동 호출까지 한다(원본은*-raw.png, 확정본은*-3head.png). 세 컷 실측 원본이 3.44 / 3.66 / 3.71 등신으로 매번 달랐다 = 비율은 운이지 지시가 아니다. 2번째 컷부터는 확정된 1번 컷을 참조 정본으로 넣어야 의상·무늬가 일관된다. - 🔑2026-08-22 좌우 비대칭 캐릭터는 측면 시트가 2장이다 — 한 장으로 갈음하지 마라. 페페냥은 자기 왼쪽이 치즈·오른쪽이 태비라 두 측면이 사실상 다른 캐릭터다. 좌우반전으로 만들면 안 된다(반전하면 방향과 무늬가 동시에 뒤집혀 「왼쪽을 보는데 치즈 얼굴」 같은 모순이 된다 — 반전은 무늬는 맞는데 방향만 틀린 경우에만 유효하다). 컷 =
front·side(치즈면) ·side-tabby(태비면) ·rear. 🔧2026-08-23 방향 정정(실측) — 확정 시트를 열어 보면 치즈면이 화면 왼쪽, 태비면이 화면 오른쪽을 향한다(여기 적혀 있던 반대 기술은 틀렸다). handoff 의 ⚠「두 측면이 같은 방향(화면 왼쪽)을 향한다」도 사실이 아니다 — 두 컷은 서로 반대를 본다. 3D 투입 전 확인 항목이었고 해소됐다(페페 확인 불필요). 방향 판정 기준 = 꼬리(페페 지시). 꼬리가 있는 쪽이 뒤 · 코가 향한 쪽이 앞 → 캐릭터가 화면 오른쪽을 향하면 우리는 그 왼쪽 면을 본다. - 2026-08-22 등신 보정은 늘리는 방향도 한다. 컷마다 원본이 2.79~3.71 로 제각각이라(실측 4컷) 짧게 나온 컷은 늘려야 컷 간 비율이 맞는다. 3D 입력은 컷 간 비율 불일치가 곧 메시 왜곡이다.
fix_ratio.py가 양방향 정규화하고, 늘려서 이미지 밖으로 나가면 에러로 멈춘다(잘린 채 저장하지 않는다). - 🔑2026-08-23 이미지→3D 는 TRELLIS v1 이다 — TRELLIS.2 로 갈아타지 마라. TRELLIS.2(4B·PBR·1536³)가 화질은 위지만 입력이 단일 이미지뿐이고 공식 요구가 24GB(우리 카드 16GB)다. 페페냥은 좌우 얼굴이 다른 비대칭 캐릭터라 다중뷰 조건부가 화질보다 우선한다 — 단일 이미지로 넣으면 Tripo 가 뭉갠 그 실패로 곧장 돌아간다. v1 은 2~4장 다중이미지를 받는다.
- 2026-08-23 TRELLIS Windows 설치 =
IgorAherne/trellis-stable-projectorz+ 리포 안whl/. cp311·cu128 프리빌트 휠 6개(cumm·spconv·nvdiffrast·diffoctreerast·diff_gaussian_rasterization·kaolin)라 CUDA 툴킷도 컴파일도 필요 없다(집PC엔 nvcc 가 없는데 그대로 됐다). 🔴torch 는 2.7.0+cu128 로 고정한다 — 그 휠들이 그 ABI 로 빌드돼 있어 최신 torch 를 받으면 설치는 멀쩡히 되고 import 에서 죽는다. 설치기 =kidstoon/tools/trellis_install.bat. requirements.txt의spconv-cu118은 빼고 넣는다(같은spconv모듈을 cu128 휠과 다투게 된다). triton 없음 경고는 Windows xformers 정상 — 선택 의존성이다.- 🔴2026-08-23 가우시안 렌더의 알파는 검정·흰 두 배경으로 역산한다. 단색 배경 1회 렌더는 반투명 영역(특히 흰 가슴)에 배경색이 그대로 배어 들어가고, 게이트가 그 색을 캐릭터 색으로 세어 색분율이 통째로 틀어진다(마젠타 크로마키로 실측: 가슴·꼬리가 분홍으로 물들었다). 공식 =
a = 1 − (C_white − C_black)·C = C_black / a. 덤으로bg_color는 0~255 가 아니라 0~1 실수다(래스터라이저에 그대로 들어간다). - 🔑2026-08-23 TRELLIS 출력은 원화보다 균일하게 어둡다 — 알베도 정규화가 필수 공정이다. 실측 명도 중앙값 0.41 vs 마스터 0.53(약 −24%). 그림자를 텍스처에 구운 채 언리티 툰셰이딩에 넘기면 조명이 한 번 더 곱해져 탁해진다. 채널 균일 배율(색상·채도 불변, 명도만 이동)로 목표 medV 0.53 에 맞춘다 — 실측 gain 1.30. 게이트 0.7086 FAIL → 0.8441 PASS, 이 한 가지가 전부였다. ⚠정밀도·샘플러 모드·스텝 수는 지렛대가 아니다 — full/multidiffusion/25스텝 전부 0.66~0.71 로 오히려 half 기본값(0.71)보다 낮거나 같았다. 어둡기를 안 고치고 노브만 돌리면 시간만 태운다. VRAM 은 half 4.76GB · full 6.30GB 라 16GB 에선 어느 쪽도 여유다(생성 6~11초).
- 2026-08-23
compare_master.py를 재사용할 땐 마스터 파일명에left/right토큰을 넣어라.head_orange()가 파일명으로 머리가 화면 어느 쪽인지 판단한다 — 토큰이 없으면 무조건 오른쪽으로 보고 치즈면 볼을 반대쪽에서 재서master_l=0.0이 된다.gate_master.py가out/_gate/master-<side>.png로 복사해 넘긴다(리포 자산 이름은 안 건드린다). - 🔴2026-08-23 deskpet 게이트의
both_present는 kidstoon 에서 항상 False 다 — 그대로 두면 볼 비대칭 검사가 죽는다. 「양 볼 모두 주황 ≥1%」는 4족 페페냥 전제고, 2족 재설계는 태비면 머리 주황이 0.37%뿐이다 → 비대칭 항목이 상수 감점이 되고 정작 「AI 가 좌우를 대칭으로 뭉갠 얼굴」을 판별하지 못한다(가장 잡아야 할 실패인데).gate_master.rejudge_asymmetry()가 ①방향 일치 ②주황 있는 쪽을 마스터의 40% 이상 재현 으로 다시 매긴다. 자체검사 = 마스터를 렌더 자리에 넣으면 1.0000 이어야 한다(고치기 전엔 0.9175 로 천장이 막혀 있었다). - 🔴🔑2026-08-23
bake_texture에far를 반드시 넘겨라 — 기본값 10.0 이 우리 카메라(r=11.1)를 잘라낸다. 「구운 텍스처가 통째로 검다」의 정체가 이것이었다(반나절 태웠다). 원화가 정투영이라 fov 6도로 근사하면 카메라가 r≈11 로 멀어지는데,bake_texture(near=0.1, far=10.0)기본값이면 메시가 far plane 너머라 내부 래스터가 통째로 빈다 → 모든 픽셀이texture(0,0)한 점을 샘플링 → 그 한 점만 관측 평균색으로 수렴한다. 실측 = loss 0.507→0.14 로 멀쩡히 떨어지는데 텍스처 비검정 0.000004(=bilinear 이웃 4픽셀). 🔴우리 IoU 탐색 코드는far=100을 써서 0.817 이 나왔다 — 그래서 「정합은 맞는데 결과만 검다」는 모순이 생겨 카메라·상하규약·감면비율을 계속 의심하게 만든다.far=max(100.0, r*4)한 줄로 끝났다(비검정 0.000004 → 0.870). 📌일반화 = 렌더 파이프라인이 둘 이상이면 near/far 를 한 곳에서 정해 양쪽에 같이 넘겨라. 검증용 래스터와 실제 bake 가 다른 클립 평면을 쓰면 검증이 통과하는데 산출물만 틀어진다. - 2026-08-23 「loss 가 떨어졌다」는 bake 성공의 증거가 아니다. opt loss 는 카메라 투영 샘플의 L1 일 뿐이라 텍스처가 한 픽셀만 색을 가져도 관측 평균색 수준(0.14)까지 내려간다. 판정은 반드시 UV 아틀라스 감사 3값 —
coverage(UV raster 점유율) ·raw_nonblack(inpaint 이전) ·after. TRELLIS 소스는 안 건드리고cv2.inpaint를 가로채면 된다(trellis_gen.py). 값의 뜻 = coverage 0 이면 UV raster 실패(감면비율을 올린다) · coverage 정상인데 raw 0 이면 최적화가 색을 못 만든 것(카메라·클립평면·관측을 본다) · raw 는 큰데 after 0 이면 inpaint 가 지운 것. - 2026-08-23
simplify·texture_size는 검은 텍스처의 범인이 아니었다. 기준 성공조합(0.95/1024)에서도 똑같이 검게 나왔다(coverage 0.601 · raw 0.000004). 노브를 의심하기 전에 감사 3값부터 찍어라. 확정 조합 = simplify 0.90 / texture 2048 → faces 20,449(Unity LOD0 15~30k 예산에 그대로 들어간다) · 비검정 0.870 · 흰비율 0.234 · medV 0.514 · 게이트 0.8397 PASS. - 2026-08-23 cmd 한 줄에서
set한%VAR%는 같은 줄에서 안 풀린다(지연확장).gpubox run "set IMG=..& py --images %IMG%\a.png"는 인자가 조용히 빈 문자열로 들어간다. 여러 줄 명령은.bat로 빼서 push 한다(설치기·스윕기 둘 다 그래서 파일이다). - 🔴🔑2026-08-24 R3' 「Blender 가 텍스처를 섬 단위로 뒤섞는다」는 오진이었다 — 섬 배정은 정상, 아틀라스 「내용」이 표면 기준 상하 반전으로 칠해진 것이다.
bake_texture에 관측을np.flipud해서 넘긴 게 원인(머리 표면에 장화 색·발 표면에 얼굴 색). pre-flip 제거 한 줄로 끝났다(행프로파일 상관 as-is 0.287→0.926, Blender 임포트 렌더 정상). 이전 세션의 「pre-flip 은 맞다, 지우지 마라」(playbook §7-1 3번)가 틀린 규칙이었다 — 정정 완료. 📌지문 읽는 법 = 전역 UV 변환 8종 전부로 안 풀리면 그건 「UV 가 아니라 아틀라스 내용이 틀렸다」는 뜻이다. 임포터를 의심하는 방향으로 읽으면 하루를 태운다. 그리고 결과가 「깨진 그림」이 아니라 「말끔한 거꾸로 그림」이면 섬 배정은 무죄다(섬이 어긋나면 반드시 지저분해진다). - 🔴2026-08-24 게이트를 bake 와 같은 래스터로 그리면 그건 검증이 아니라 동어반복이다. 턴테이블이 bake 가 최적화한 그 경로로 아틀라스를 되비추므로 정의상 원화를 재현한다 → 아틀라스가 어떻게 칠해졌든 PASS. 실제로 R3' 은 게이트 0.828 PASS 상태로 납품물만 뒤집혀 흘러나갔고, 수정 후엔 GLB 가 정상이 되고 게이트 쪽이 거꾸로 나왔다(상관 as-is 0.243 / flip 0.914). 판정은 반드시 납품물(GLB)로 한다 —
trellis_gen.py는 이제 gate-{front,left,right} 를glb_cpu_render.py로 GLB 에서 직접 렌더한다. - ⚠2026-08-24 치비 실루엣은 상하가 거의 대칭이다 → 실루엣 IoU 를 상하 규약의 근거로 쓰지 마라. 실측 질량중심 0.514 vs 0.513, 상·하 25% 면적 차 1.5%(귀 2개 ↔ 장화 2개). 그래서 ①
trellis_gen의 flip 자동탐색이 상하를 못 가르고 ②「거꾸로 고양이」가 실루엣만 보면 정상으로 보인다. 상하를 봐야 하면 옆모습을 봐라 — 주둥이(상대높이 0.64)·꼬리(0.04)가 있어 잘 갈린다(IoU 0.976 vs 0.588). - 🔑2026-08-24 판정자부터 검증해라 — 파이프라인 규약을 하나도 공유하지 않는 독립 판정자를 하나 만들어 둔다.
kidstoon/tools/glb_cpu_render.py= trimesh·Blender·GPU 없이 GLB 바이트를 struct 파싱해 정투영 래스터하는 순수 numpy 렌더러. R3' 진단의 유일한 비순환 판정자였다. 쓰기 전에_selfcheck()(기하 +Y=위 · UV top-left)로 자기 규약을 먼저 증명한다 — 이걸 안 하면 판정자가 틀렸을 때 결론이 통째로 뒤집힌다(이번에 실제로 중간 판정 2개가 서로 모순됐다). - 🔴2026-08-24 Blender 5.x 함정 3개(영상 자동화). ①
action.fcurves가 없다(슬롯 액션으로 바뀜) → 키 보간을 바꾸려면 삽입 전에bpy.context.preferences.edit.keyframe_new_interpolation_type을 세운다. 텍스처 칸 교체는 반드시CONSTANT(BEZIER 면 칸 사이를 보간해 아틀라스가 밀린다). ②동영상 출력은image_settings.media_type='VIDEO'를 먼저 세워야 한다 — 5.1 에선file_format열거에FFMPEG가 아예 없다(TypeError 로 죽는다). ③기본 뷰 변환 AgX 가 툰 색을 통째로 탈색시킨다(실측: 초록 잔디가 회색으로 렌더). 툰은view_settings.view_transform="Standard"+ 낮은 라이트(sun 1.9·world 0.55)가 맞다. - 🔑2026-08-24 얼굴 패치는 눈 하나당 한 장으로 쪼갠다. 양쪽 눈을 한 장으로 넓게 깔면 측면(90°)에서 패치가 주둥이를 가로질러 뜬다(실측). 좌·우 각각 폭 0.122(머리폭의 ~35%)로 나누면 프로필에서도 자연스럽다. 눈 아트는 원화에서 실제 눈을 잘라 쓴다(
make_eye_atlas.py) — 직접 그리면 캐릭터와 안 닮는다(실측: 「고글」처럼 보였다). 잘라올 때 주변 털을 알파로 깎아야 한다(안 깎으면 회색 얼굴 쪽 눈에 주황 털이 붙는다). 좌우 비대칭이라 반대쪽은 칸별 좌우반전본을 따로 만든다. - 2026-08-24 한국어 립싱크는 음향 기반으로 간다. Rhubarb 음소는 영어 기반이라 한국어가 근사가 된다. 프레임별 RMS(말함/다뭄) + 스펙트럼 무게중심(O/A/E 배정) 만으로 20초 테스트에선 충분했다(
make_voice.py). 음성 = edge-ttsko-KR-SunHiNeural(무료·설치만·상업이용 가능), 치비는rate +8% / pitch +18Hz가 어울린다. - 🔴🔑2026-08-24 TRELLIS 산출 GLB 엔 NORMAL 이 없다 → 조명 켜면 「텍스처가 깨진 것처럼」 보인다. glTF 규약상 NORMAL 이 없으면 클라이언트가 평면 노멀을 만든다 → 20k 삼각형이 전부 각져 얼룩덜룩해진다. 🔴무광 렌더에선 안 보인다 — 게이트(CPU 무광)·orbit.mp4(가우시안)는 멀쩡한데 Blender/Unity 에서만 터지므로 「orbit 은 잘 나왔는데 영상만 깨진다」로 나타난다(페페 지적 그대로). 수정 = export 전에
_ = glb.vertex_normals한 줄(trimesh 는 접근해야 계산·캐시하고 그때 실린다). 기존 GLB 는tools/glb_add_normals.py로 넣는다(기하·UV·텍스처 불변, 라운드트립 후 행프로파일 상관 1.000 확인). - 🔴🔑2026-08-24
texture_size는 화질 노브가 아니라 「관측 표본 대비 미지수 개수」다. 2048² 은 점유 텍셀 ≈250만인데 관측은 4장×1024² 라 메시가 덮는 샘플이 ≈140만 — 텍셀당 1개도 안 온다 → 최적화가 미결정(under-determined)이 되어 체커보드·무지개 점 노이즈가 남는다. inpaint 는 「한 번이라도 닿은」 텍셀을 안 건드려서 이걸 못 지운다. 실측 = 2048 스펙클 6.82%(심한 것 2.54%) → 1024 로 2.83%(0.92%) → 1024+--lambda-tv 0.01로 1.94%(0.60%), 태비 줄무늬는 보존됐다. 기본을 1024 + lambda_tv 0.01 로 본다. 지표 = 3×3 중앙값과 40 이상 어긋난 텍셀 비율. - 🔴2026-08-24 Blender 키프레임 보간을 환경설정으로 바꾸려 하지 마라 — 조용히 실패한다.
preferences.edit.keyframe_new_interpolation_type = "CONSTANT"를 걸어도keyframe_insert()로 넣은 키는 BEZIER 로 남았다(실측 143개). 그러면 텍스처 칸 교체가 칸 사이를 보간해 아틀라스가 좌우로 미끄러진다 — 「입이 얼굴 하단 가운데가 아니고 좌우로 움직인다」의 정체가 이것이다. 수정 = 삽입 후 슬롯 액션 채널백을 직접 순회해kp.interpolation="CONSTANT"강제(5.x 는action.fcurves가 없어action.layers[*].strips[*].channelbag(slot).fcurves로 들어간다). 강제한 개수를 찍고 0 이면 assert 로 죽인다. - 🔑2026-08-24 얼굴 패치 붙이는 법 — 함정 4개를 다 피해야 한다. ①shrinkwrap = PROJECT +
use_negative_direction=False. 켜두면 앞면을 못 맞힌 정점이 뒷통수에 붙어 패치가 머리를 관통하고(실측 깊이 0.267 vs 정상 0.09), 그 판이 얼굴을 덮어 눈까지 가린다. ②NEAREST_SURFACEPOINT 는 대안이 아니다 — 판을 멀리 두면 최근접점이 주둥이 한 점으로 몰려 패치가 쪼그라들고(눈 폭 0.105→0.038), 가까이 둬도 곡면을 감아 텍스처가 늘어난다. ③판은 그 패치가 덮을 국소 표면 바로 앞(0.02)에 놓는다(얼굴 최전방 기준으로 멀리 두지 마라). ④Head 본 강체 패런팅 금지 — 머리 메시는 자동웨이트로 Neck 과 섞여 덜 움직이는데 패치는 본을 100% 따라가 고개 돌릴 때 어긋난다. 몸통 웨이트를 KDTree 최근접으로 전사하고 Armature 모디파이어를 달아 같은 스키닝으로 움직인다(Blender 5.x 는data_transfer인자가 바뀌어 연산자를 못 쓴다). 띄우는 값offset은 0.012(0.004 면 스키닝 차이로 프레임마다 표면 밑에 잠겨 눈이 깜빡이듯 사라진다). - 2026-08-24 패치 위치는 상수로 박지 말고 실측해라(
face_landmarks.py) — 원화 정면 시트에서 눈 간격·크기·입 폭을 재고 모델 bbox 로 환산한다(시트는 880px 정규화, 모델 높이 1.0 이라 비율이 그대로 대응). ⚠단 입 「높이」는 원화(2D) 값을 쓰면 안 된다 — 3D 주둥이보다 낮게 나와 턱 아래 곡면에 걸리고 패치가 45°로 누워 쪼그라든다(실측 0.669 vs 코 0.736). 메시의 코 높이(머리 최전방 정점 평균) − 0.035 로 잡는다.