TRENDSHIFT DAILY #2 · 2026-07-25 · IMG2THREEJS · 이미지 한 장을 "코드로 된 3D"로

hoainho/img2threejs 딥다이브
— 참조 이미지를 메시가 아니라 코드로 다시 짓는 절차적 Three.js 생성기

img2threejs는 참조 이미지 한 장 속 물체나 캐릭터를 코드로만(code-only) 재구성하는 AI 에이전트 스킬(skill)이다. 한 문장으로 말하면 "사진을 스캔해 폴리곤 덩어리를 뽑는 게 아니라, 사진을 보고 그 물체를 만드는 Three.js 코드를 작성하되, 그 코드가 원본과 얼마나 닮았는지를 기계가 채점해 통과할 때까지 고쳐 쓰는" 도구다. Claude Code 등에서 /img2threejs라고 부르기만 하면 된다.

이 프로젝트의 급소는 이것이다: "AI로 3D를 만든다"는 흔한 접근을, 결정론적 품질 게이트로 길들였다. 대부분의 이미지→3D 도구는 신경망이 메시를 통째로 뱉고 결과를 사람이 눈으로 검수한다. img2threejs는 반대로 "스크립트가 강제하고, 모델은 판단만 한다(Scripts enforce, the model judges)"는 원칙 위에 서서, 실루엣·색·구조가 기준 점수를 넘을 때까지 자동으로 반복 수정한다. 그리고 산출물은 바이너리가 아니라 git으로 diff되는 텍스트 코드다.

(저장소 hoainho/img2threejs · 툴링 Python 3.10+ (외부 의존성 0) · 산출물 TypeScript + Three.js · 버전 v1.3.0 · forge 엔진 약 12,000줄 · 문서(grimoire) 15편 · 테스트 20스위트 · 라이선스 Apache-2.0 · 저자 Hoài Nhớ(hoainho) · shallow clone 소스 직접 분석)
목차
  1. 프로젝트 한 줄 요약
  2. 왜 주목받는가 — AI 3D를 길들이는 법
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석 — 4단계 파이프라인
  5. 디렉토리 구조 해부
  6. 학습 포인트
  7. 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한 줄 요약

"사진을 스캔"하는 게 아니라 "사진을 보고 코드를 짓는다"

이미지 한 장을 3D로 바꾸는 도구는 이미 많다. 대부분은 신경망(neural network)이 사진을 삼켜 메시(mesh) — 수천~수십만 개의 삼각형 덩어리 — 를 통째로 토해낸다. 결과는 그럴듯해 보이지만, 열어보면 정체를 알 수 없는 폴리곤 수프다. 어느 삼각형이 손잡이인지 바퀴인지 코드가 알지 못하고, 애니메이션을 붙이려면 사람이 처음부터 뼈대를 다시 심어야 한다.

한 줄 비유

사진을 3D 스캐너에 넣는 대신, 실력 있는 모델러 옆에 앉혀 "이거 보고 똑같이 만들어봐"라고 시키는 것

기존 AI 3D 도구는 "석고 본을 떠서 복제하는 것"에 가깝다 — 겉모양은 같지만 속은 통짜라 손댈 수가 없다. img2threejs는 "숙련된 모델러에게 참조 사진을 주는 것"이다. 그는 상자·원기둥·회전체 같은 기본 도형을 조립해 물체를 짓고, 각 부품에 "이건 손잡이", "이건 경첩" 같은 이름과 관절을 붙인다. 그래서 결과물이 곧바로 움직일 준비가 된(animation-ready) 상태로 나온다.

img2threejs가 하는 일은 명확하다. 참조 이미지를 받아 → 물체를 뜯어보고(intake)부품·재질·관절 설계도를 JSON으로 쓰고(spec) → 그 설계도로 Three.js 코드를 생성하고(build)렌더한 뒤 원본과 비교해 채점하고(review) → 점수가 모자라면 다시 설계도/코드를 고쳐 이 과정을 반복한다. 핵심은 "AI가 알아서 잘하겠지"에 맡기지 않고, 기계적으로 측정 가능한 관문을 매 단계에 세워둔 것이다.

TERM
스킬 (skill, 에이전트 스킬)
Claude Code 같은 AI 코딩 에이전트에게 붙이는 "확장 기능 팩". 폴더 하나(SKILL.md + 스크립트 + 문서)로 되어 있고, 에이전트가 특정 작업을 만나면 그 지침과 도구를 불러 쓴다. img2threejs는 ~/.claude/skills/에 넣어두고 /img2threejs로 호출하는 스킬이다. 특정 회사 모델에 묶이지 않아 Codex·OpenCode 등에서도 동작한다(agent-agnostic).

이름은 img2threejs(image → three.js)이지만, 진짜 핵심어는 "reconstruction-by-code(코드에 의한 재구성)"다. 사진측량(photogrammetry)도, 메시 추출도, 아트 에셋 다운로드도 아니다. 사람이 읽고 고칠 수 있는 코드로 물체를 짓는다는 점이 이 도구의 정체성이자, 이 문서에서 배울 것의 전부를 관통하는 열쇠다.

2왜 주목받는가

"AI가 3D 만들어줌"이 흔해진 시대에, 품질을 숫자로 보증하는 접근

2026년, "이미지 넣으면 3D 나옴" 서비스는 흔하다(Meshy, Tripo, Rodin 등). 그런데 다들 같은 약점을 공유한다 — 결과가 복불복이고, 왜 이렇게 나왔는지 설명이 안 되며, 나온 메시를 사람이 손보기 어렵다. img2threejs가 트렌딩에 오른 이유는 이 지점을 정면으로 공략하기 때문이다. "AI의 창의성"이 아니라 "엔지니어링의 규율"로 3D 품질 문제를 푼다.

차별점 ① — "스크립트가 강제하고, 모델은 판단한다"

이 프로젝트의 설계 철학이 통째로 이 한 문장에 담겨 있다. 검증·게이팅·패키징처럼 정답이 정해진 일은 전부 결정론적(deterministic) 파이썬 스크립트가 처리한다. 값비싼 LLM 토큰은 오직 "이 비교 시트를 보니 원본과 닮았는가? 통과/실패"라는 판단 한 곳에만 쓴다. 덕분에 토큰이 절약되고, 무엇보다 "운이 좋아서 통과"가 원천 차단된다 — 실루엣이 안 맞으면 모델이 아무리 "괜찮다"고 해도 스크립트가 거부한다.

TERM
결정론적 (deterministic)
같은 입력을 넣으면 언제나 같은 출력이 나오는 성질. LLM은 같은 질문에도 답이 흔들리지만(비결정론적), 파이썬으로 짠 "실루엣 겹침 85% 미만이면 실패" 같은 규칙은 몇 번을 돌려도 결과가 같다. img2threejs는 "흔들리면 안 되는 판정"을 전부 결정론 스크립트에 맡겨 품질을 재현 가능하게 만든다.

차별점 ② — 산출물이 "diff되는 텍스트"다

신경망이 뱉은 .glb 메시는 열어봐도 사람이 이해할 수 없는 바이너리다. img2threejs의 결과는 TypeScript 팩토리 함수(createObjectNameModel(spec, options))와 JSON 설계도다. 즉 버전관리(git)에 올려 "어제 모델과 오늘 모델이 코드 몇 줄 달라졌는지"를 그대로 볼 수 있고, 부품 하나의 색을 바꾸고 싶으면 해당 줄만 고치면 된다. AI 산출물을 협업 가능한 자산으로 만든 것이다.

차별점 ③ — 외부 의존성이 0이다

파이프라인 엔진(forge/)은 파이썬 표준 라이브러리만 쓴다. PNG를 읽고 쓰는 것도 struct+zlib로 직접, 색 차이 계산(CIEDE2000)도 순수 파이썬 구현이다. NumPy도, OpenCV도, PIL도, Playwright도 없다. requirements.txt에 아예 "NO third-party dependencies"라고 못박아 뒀다. 설치가 가볍고 어디서든 돌아가며, 공급망 보안 사고 위험도 없다.

GOOD
왜 이 조합이 강력한가

재현 가능한 품질(결정론 게이트), 고칠 수 있는 산출물(코드+JSON), 부담 없는 설치(의존성 0), 그리고 곧바로 움직이는 결과물(관절·소켓 내장). 여기에 라이브 데모 갤러리로 "정말 되네"를 눈으로 보여주기까지 한다. "AI 3D는 장난감"이라는 인식을 "AI 3D도 엔지니어링이다"로 바꾸려는 시도가 트렌딩의 진짜 동력이다.

3기술 스택 전체 지도

두 개의 세계 — "만드는 파이썬"과 "만들어지는 타입스크립트"

img2threejs를 처음 보면 헷갈린다. 파이썬 프로젝트인가, 타입스크립트 프로젝트인가? 답은 "둘 다이되, 역할이 다르다"이다. 파이썬은 공장의 기계(파이프라인 엔진)이고, 타입스크립트는 그 공장이 찍어내는 제품(3D 모델 코드)이다. 이 둘을 구분하는 순간 전체 그림이 선명해진다.

세계 A — 파이프라인 엔진 (forge/, Python)

"forge(대장간)"라는 이름 그대로, 물체를 제련하는 스크립트 뭉치다. 놀라운 점은 외부 라이브러리를 하나도 안 쓴다는 것.

계층기술역할
런타임Python 3.10+ (표준 라이브러리 only)파이프라인 전 단계를 서브프로세스로 실행 — 토큰을 거의 안 씀
이미지 I/Ostruct + zlibPNG를 직접 파싱·인코딩. PIL/OpenCV 없이 픽셀을 다룸
색 수학순수 파이썬 CIEDE2000sRGB→CIELAB 변환 + 색차 계산(Sharma 테스트 검증)으로 "색이 얼마나 틀어졌나" 측정
이미지 지문pHash(퍼셉추얼 해시)원본과 렌더의 구조적 유사도를 해밍 거리로 비교
쓰는 stdlibjson·argparse·math·pathlib·subprocess·colorsys설계도 직렬화·인자 파싱·기하 계산 등 전부 기본 모듈로
테스트순수 stdlib 20 스위트VLM 호출은 stub(가짜 함수)로 주입해 오프라인 검증
비유

요즘 파이썬 이미지 도구는 "라이브러리 뷔페"를 차린다 — NumPy·PIL·OpenCV·scikit-image를 다 깔아야 겨우 돈다. img2threejs는 맨손으로 요리하는 백반집이다. PNG 디코딩부터 색차 공식까지 손으로 다 짰다. 무겁지 않고, 설치가 실패할 일이 없고, "이 숫자가 어디서 나왔는지"를 전부 코드로 추적할 수 있다.

세계 B — 산출물 (Three.js 팩토리, TypeScript)

공장이 찍어내는 제품은 순수 Three.js 코드다(래퍼 프레임워크 없음). 브라우저 WebGL 위에서 도는 THREE.Group 하나를 반환하는 팩토리 함수다.

요소사용 기술쓰임
기본 도형Box·Sphere·Cylinder·Cone·Torus 등 15종물체를 이 프리미티브(primitive) 조합으로 표현
곡면·회전체ExtrudeGeometry·LatheGeometry·TubeGeometry병·그릇(회전체), 케이블(관), 압출 형상 생성
재질MeshPhysicalMaterial (PBR)metalness·roughness·clearcoat·transmission으로 금속·유리·플라스틱 표현
반복 부품InstancedMesh톱니·나사·바퀴살을 단일 draw call로 — 성능 최적화
조명HemisphereLight 등기본 3점 조명 셋업 내장
런타임 메타root.userData.sculptRuntime노드·소켓·콜라이더 맵을 노출해 애니메이션 준비

세계 C — 눈(vision)은 어디서 오나

img2threejs 소스에는 OpenAI/Anthropic API 키도, 모델 호출 코드도 없다. 이미지를 "보는" 능력(VLM, Vision-Language Model)은 이 스킬을 실행하는 호스트 에이전트가 제공한다(Claude Code의 네이티브 이미지 리딩, 브라우저 MCP, 사용자 스크린샷 등). 스크립트 쪽 vlm_gate.py는 VLM을 주입형 콜러블(callable)로 받아, 그 판단을 결정론 규칙에 종속시켜 게이팅만 한다. 그래서 어떤 에이전트에 붙여도 동작하는 agent-agnostic 설계가 가능하다.

TERM
PBR (Physically Based Rendering)
"빛이 실제 물리처럼 반사되게" 재질을 표현하는 방식. 색 하나가 아니라 metalness(금속성)·roughness(거칠기)·clearcoat(코팅)·transmission(투과) 같은 물리 계수로 표면을 기술한다. img2threejs는 참조 사진에서 이 계수들을 추론(inference)MeshPhysicalMaterial에 채워 넣는다. "역렌더링(inverse rendering)"이 아니라 근거 기반 추정이라, 신뢰도가 낮으면 아예 값을 안 쓴다.

4아키텍처 심화 분석

4단계 파이프라인 — 이 도구의 심장이자 배울 것의 8할

img2threejs의 모든 것은 "어떻게 나쁜 결과를 코드 생성 전에 걸러내고, 나온 결과를 어떻게 자동으로 고칠 것인가"로 귀결된다. 그래서 파이프라인이 intake → spec → build → review 네 단계로 나뉘고, 각 단계 사이마다 게이트(관문)가 서 있다. 폴더 이름 접두사(stage1_~stage4_)가 그대로 이 순서를 보여준다.

참조 이미지 1장 │ ▼ ┌───────────────────┐ suitability 게이트 ┌───────────────────────┐ │ ① INTAKE (흡수) │ ──(부적합이면 즉시 거부)─▶│ 디테일 인벤토리 · PBR │ │ 물체를 뜯어본다 │ │ 증거 · 랜드마크 추출 │ └─────────┬─────────┘ └───────────────────────┘ ▼ ┌───────────────────┐ strict-quality 검증 (얕은 설계도는 코드 생성 전에 탈락) │ ② SPEC (설계도) │ ───────────────────────▶ ObjectSculptSpec (JSON) │ 부품·재질·소켓 │ 부품 / 재질 / 관절을 선언 └─────────┬─────────┘ ▼ ┌───────────────────┐ 잠긴 빌드 패스 순서대로 (이전 패스 통과해야 다음이 열림) │ ③ BUILD (조립) │ ───────────────────────▶ Three.js 팩토리 (.ts) 생성 │ "현재 패스"만 생성 │ — 매 반복 전체 재생성 안 함(토큰↓) └─────────┬─────────┘ ▼ ┌───────────────────┐ 렌더 → 원본과 비교 시트 ┌────────────────────────┐ │ ④ REVIEW (심사) │ ──────────────────────────▶│ Divine Eye 결정론 채점 │ │ 채점하고 라우팅 │ ◀─ 점수<기준: 재수정 ──── │ + (필요시) 에이전트 │ └─────────┬─────────┘ (spec/코드 고쳐서 ③로) │ 비전(VLM) 판단 │ ▼ 점수 ≥ 기준 └────────────────────────┘ 애니메이션 준비된 Three.js 모델 ✓

③ 빌드 — "잠긴 패스"라는 아이디어

물체를 한 번에 완성하지 않는다. orchestrate_passes.py가 정한 순서대로 패스(pass)를 하나씩 잠금 해제한다.

blockout → structural-pass → form-refinement → material-pass → surface-pass → lighting-pass → interaction-pass → optimization-pass (optimization을 뺀 전부가 "시각 리뷰 필수" 패스. 캐릭터면 proportion-lock· feature-placement 패스가 앞에 추가됨)

코드 생성기는 지금 열린 패스만 코드로 뽑는다. 미래 패스를 미리 요청하면 "이전 패스가 아직 리뷰를 통과 안 했다"며 실패시킨다. 매 반복마다 모델 전체를 다시 그리지 않으니 토큰이 절약되고, 큰 형태가 틀린 채로 디테일에 힘 빼는 낭비를 막는다. 반복 부품은 InstancedMesh 하나로 묶어 성능까지 챙긴다.

// 반복 부품(톱니·나사·바퀴살)을 InstancedMesh 하나 = draw call 하나로
const cluster = new THREE.InstancedMesh(geo, mat, count);
for (let i = 0; i < count; i++) {
  /* 방사형/축 배치 행렬을 계산해서 */
  cluster.setMatrixAt(i, _m);
}

④ 리뷰 — "Divine Eye"라는 결정론 채점기

핵심 중의 핵심. divine_eye.py토큰을 한 개도 안 쓰는 결정론 멀티시그널 채점기다. 두 층으로 작동한다.

층 1 — HARD 게이트 (평균으로 못 덮는 치명적 실패)

# 아래 둘 중 하나라도 걸리면, 다른 점수가 아무리 좋아도 즉시 REJECT if silhouette_iou < 0.85: reject # 실루엣(외곽선) 겹침이 85% 미만 if scale_delta > 0.08: reject # 크기 비율이 8% 넘게 어긋남

층 2 — SOFT 신호 (가중 앙상블)

여러 각도의 유사도 신호를 가중 평균해 최종 fidelity(충실도, 목표 0.85)를 낸다. 신호가 서로 크게 엇갈리면(spread > 0.35) "확신이 없다"고 보고 probe(추가 확인)로 보낸다.

신호가중무엇을 보나
objectness1.5"같은 물체인가"(OSIM-lite) — 가장 강한 신호
SSIM1.5구조적 유사도(밝기·대비·구조)
proportion / pHash / edgeOverlap / tonalParity1.0비율·지문·엣지 겹침·명암 일치
blowoutParity / flatRegion0.8과노출·평평한 영역 일치
symmetry-parity0.5좌우 대칭성 일치
hueZoneParity / specularWash0 (관찰용)"보라가 파랑으로 렌더됨" 같은 색 오류 탐지(아직 캘리브레이션 전)

똑똑한 장치가 하나 있다. 사진과 절차적 렌더는 프레이밍이 달라 실루엣 IoU만으로 억울하게 탈락할 수 있다. 그래서 objectness가 "같은 물체(≥0.48)"라고 말하면, 확신에 찬 reject를 probe로 강등해 재확인 기회를 준다. 단, 자동 통과는 절대 안 시킨다 — 충실한 재구성을 살리되 기준은 안 낮춘다.

VLM은 "종속 계층"이다

모델의 눈(VLM)이 개입하는 유일한 곳이 vlm_gate.py인데, 규칙이 엄격하다.

if hard_failures:   # 규칙 1: HARD 게이트 실패 땐 VLM을 아예 호출조차 안 함
    return {"verdict":"reject", "action":"refine-code", "ranVlm":False}

N번 샘플링해 중앙값 투표를 하고, 의견이 흩어지면(spread > 0.20) probe로 보낸다. 그리고 VLM은 기하학적 HARD 실패를 절대 통과시킬 수 없다. "모델이 좋다고 우겨서 넘어가는" 사고를 구조적으로 막은 것이다.

수정 루프 — "무한 반복"을 원천 봉쇄

점수가 모자라면 고쳐서 다시 도는데, 자칫 영원히 돌 수 있다. correction_loop.py종료를 수학적으로 보장하는 우선순위 상태머신이다.

# 위에서부터 순서대로 검사, 걸리면 그 즉시 멈춤 EMPTY → SUCCESS → REPEATED_DEFECT → OSCILLATION → PLATEAU → HARD_CEILING (비었음) (목표달성) (같은 결함 2연속) (되돌리기 2회) (개선 미미) (최대 반복 도달) # HARD_CEILING: len(history) >= max_iter(기본 6) 이면 어떤 상태든 무조건 정지 # → 어떤 경로로도 무한 루프가 불가능
설계 패턴 · 핵심 3가지

이 코드에서 배울 만한 설계 결정

① 판단과 실행의 분리: "정답이 있는 일"(검증·측정·게이팅)은 결정론 스크립트, "취향·인지가 필요한 일"(닮았나?)만 LLM. 이 경계선을 명확히 그은 것이 재현성과 토큰 효율을 동시에 잡은 비결이다.

② HARD/SOFT 2단 게이트: 치명적 실패(실루엣·크기)는 평균으로 덮이지 않게 하드 컷으로, 나머지는 가중 앙상블로. "좋은 점수 몇 개로 나쁜 점수 하나를 가리는" 흔한 함정을 구조로 막았다.

③ 종료 보장 상태머신: 반복 최적화 루프에 HARD_CEILING을 최우선 안전장치로 둬, 어떤 입력에도 반드시 끝나게 했다. 자율 에이전트 루프를 짤 때 그대로 훔쳐 쓸 수 있는 패턴이다.

5디렉토리 구조 해부

forge(대장간·스크립트)와 grimoire(마법서·루브릭)로 나뉜 89개 파일

폴더 이름이 재밌다. 실행되는 스크립트는 forge(대장간)에, 그 스크립트가 기준으로 삼는 규칙 문서grimoire(마법서)에 나눠 담았다. "기계는 forge에서 만들고, 판단 기준은 grimoire에서 읽는다"는 구조다.

img2threejs/ ├── SKILL.md ← 스킬 매니페스트(YAML frontmatter) + 파이프라인 지침 ★핵심 ├── README.md ← 사용법 + mermaid 파이프라인도 + 라이브 데모 표 ├── CHANGELOG / ROADMAP / CONTRIBUTING / LICENSE(Apache-2.0) ├── assets/ ← 데모 GIF 7개 + 로고 (crown-chest, sony, shotgun, knife…) ├── docs/ │ ├── UPGRADE_PLAN.md ← 343줄 기술 스펙(v1.1~1.5) │ └── TOKEN_COST.md ← 스테이지별 토큰 비용 모델 │ ├── forge/ ← ★ 파이프라인 엔진 (스테이지 접두사로 순서 표현) │ ├── requirements.txt ← "NO third-party dependencies" 선언문 │ ├── _shared/ ← image_hash(pHash) · color_metrics(CIEDE2000) │ │ · feature_acceptance_policy · artifact_cache │ ├── stage1_intake/ ← probe_image · check_reference_admission │ │ · build_detail_inventory · extract_pbr_evidence │ │ · extract_landmarks · solve_camera_pose · delight_albedo │ ├── stage2_spec/ ← new_sculpt_spec(1142줄) · validate_sculpt_spec(1912줄) │ │ · derive_geometry │ ├── stage3_build/ ← orchestrate_passes(562줄, 패스 게이트) │ │ · generate_threejs_factory(1364줄, 코드 생성기) │ │ · bake_projected_texture │ ├── stage4_review/ ← ★ divine_eye(431줄) · vlm_gate · correction_loop │ │ · diagnose_render · objectness · make_comparison_sheet │ └── tests/ ← 20개 테스트 스위트(전부 stdlib) │ └── grimoire/ ← ★ 게이트가 적용하는 상세 루브릭(마크다운 지식베이스) ├── intake/ ← validation_rubric · quality_contract · surface_topology ├── build/ ← geometry_patterns(138줄) · threejs_texture_reference ├── feedback/ ← shading_realism · render_capture ├── readiness/ ← action_rigging · joint_attachment (← 애니메이션 준비성) ├── character/ ← reconstruction · likeness_maximization ├── review/ ← self_correction └── glossary/ ← 3d_vocabulary

구조가 말해주는 이야기는 분명하다. 진짜 무게중심은 stage2_spec(설계도 검증 1912줄)과 stage4_review(채점)에 있다. "어떻게 그리느냐"(stage3_build)보다 "어떻게 나쁜 걸 걸러내느냐"에 코드가 훨씬 많이 쏠려 있다는 뜻이다. 이건 이 프로젝트의 정체성 — "생성"이 아니라 "품질 관리"가 본질 — 을 그대로 반영한다.

비유

도자기 공방을 떠올리면 된다. 물레(build)에서 형태를 빚는 시간보다, 검수대(spec 검증 + review)에서 "이건 대칭이 틀어졌어", "유약 색이 안 맞아" 하며 깨고 다시 빚는 시간이 훨씬 길다. img2threejs의 코드 분포가 정확히 그 공방을 닮았다.

6학습 포인트

이 레포 하나로 배우는 것 — 3D 그래픽스 + AI 파이프라인 설계가 한자리에

배울 것 ① — 절차적 3D 지오메트리(Three.js)

"3D 모델 = 무거운 메시"라는 통념을, generate_threejs_factory.py가 깬다. Box·Sphere·Lathe·Tube·Extrude 같은 기본 도형을 코드로 조립해 어떻게 복잡한 물체를 표현하는지, 반복 부품을 InstancedMesh로 어떻게 성능 최적화하는지를 실물 코드로 볼 수 있다. Three.js 지오메트리 API의 좋은 교재다.

배울 것 ② — "판단"과 "실행"을 가르는 AI 시스템 설계

요즘 AI 앱의 최대 난제는 "어디까지 LLM에 맡기고 어디부터 코드로 강제할까"다. img2threejs는 이 경계선의 모범 답안이다 — 측정 가능한 건 전부 스크립트, 인지가 필요한 판단만 모델. LLM 파이프라인을 짜는 개발자라면 vlm_gate.py의 "종속 계층" 설계 하나만으로도 배울 게 많다.

배울 것 ③ — 결정론 이미지 품질 측정

divine_eye.py라이브러리 없이 실루엣 IoU, SSIM, pHash, CIEDE2000 색차, objectness를 구현해 앙상블한다. "두 이미지가 얼마나 닮았나"를 숫자 하나로 만드는 컴퓨터 비전의 고전 기법들을, 순수 파이썬 구현으로 정독할 수 있다. 무거운 딥러닝 없이도 이런 측정이 가능하다는 걸 배운다.

배울 것 ④ — 종료가 보장되는 자율 루프

"AI가 알아서 반복 개선"은 멋지지만, 실무에선 무한 루프·토큰 폭발이 공포다. correction_loop.py의 우선순위 상태머신(EMPTY→…→HARD_CEILING)은 "어떤 경우에도 반드시 끝난다"를 코드로 증명하는 법을 보여준다. 자율 에이전트를 안전하게 짜는 실전 패턴.

배울 것 ⑤ — PBR·색 이론의 실전 적용

extract_pbr_evidence.py(834줄)는 사진에서 albedo·roughness·normal·AO를 추론하되, 신뢰도가 0.7 미만이면 값을 거부한다. "AI가 자신 없으면 조용히 넘어가지 말고 명시적으로 거부하라"는 태도, 그리고 MeshPhysicalMaterial 계수로 재질을 표현하는 실전 지식을 얻는다.

주의
만능이 아니다 — 저자가 스스로 밝히는 한계

단일 이미지로는 숨은 면과 정확한 치수를 보장할 수 없다. 보이는 면을 미러링해 추론하므로 결과는 "근사적/양식화(stylized)"이며, 특히 캐릭터는 포토리얼이 아니라 스타일라이즈드 재구성이다. 저자는 문서 곳곳에서 "단일 이미지로 100% 닮음은 불가능"임을 반복해 명시한다. "이 이미지로는 요청한 충실도에 도달 불가"라는 결론조차 유효한 결과로 취급하는 정직함이 오히려 이 도구의 신뢰도를 높인다.

7시스템 요구사항

엔진은 깃털처럼 가볍고, 무거운 건 "눈"과 "렌더" 쪽
항목요구사항
파이프라인 실행Python 3.10 이상 · 외부 의존성 0(표준 라이브러리만)
호스트 에이전트이미지를 볼 수 있는 VLM 지원 에이전트 — Claude Code · Codex · OpenCode 등
설치~/.claude/skills/img2threejs에 clone 후 /img2threejs로 호출
산출물 확인Three.js 코드를 렌더할 브라우저(WebGL) — 뷰어/showcase에서 확인
입력물체·캐릭터가 담긴 참조 이미지 1장(선명할수록 좋음)
토큰 예산(추정)물체 1개 풀 재구성 ~80k–180k 토큰 · 캐릭터 ~150k–350k(사이클 수에 비례)
라이선스Apache-2.0 — 상업적 이용·수정·배포 자유(특허 조항 포함)

주목할 점은 "무거움의 위치"다. 엔진 자체는 서브프로세스라 토큰을 거의 안 쓴다. 비용은 전부 모델이 이미지를 보고 판단하는 render-review 루프(패스당 비교 시트 ~2–3k 토큰, 5–8 사이클)에서 발생한다. 그래서 "패스를 잠그고 현재 것만 생성", "HARD 게이트로 조기 탈락", "VLM은 필요할 때만 호출" 같은 설계가 전부 토큰 절감 장치로 맞물려 있다. 아키텍처와 비용 구조가 한 몸인 셈이다.

8직접 해볼 수 있는 실습 과제

난이도별 5개 — 읽지만 말고 직접 물체를 재구성해 보기
난이도 ★ · 입문

1. 스킬 설치하고 간단한 물체 하나 재구성

~/.claude/skills/img2threejs에 저장소를 clone하고, Claude Code에서 단순한 물체(머그컵·주사위·망치 같은 hard-surface)를 찍은 사진 한 장으로 /img2threejs를 돌려본다. 파이프라인이 intake→spec→build→review를 거쳐 Three.js 코드를 뽑아내는 전 과정을 눈으로 따라가는 게 목표. 나온 .ts를 브라우저에서 렌더해 원본과 비교해 본다.

난이도 ★★ · 초급

2. 생성된 설계도(JSON)와 코드 읽기

산출된 ObjectSculptSpec(JSON)을 열어 components·materials·sockets가 어떻게 선언됐는지, 그리고 그게 .ts 코드의 어느 THREE.BoxGeometry/LatheGeometry로 옮겨졌는지 1:1로 대응시켜 본다. "설계도 → 코드" 변환을 이해하면 이 도구의 절반을 이해한 것.

난이도 ★★★ · 중급

3. Divine Eye로 "닮음 점수" 직접 매겨보기

forge/stage4_review/divine_eye.py를 원본 이미지 + 렌더 이미지 두 장에 직접 돌려(--reference … --render … --json) silhouette IoU·SSIM·pHash·fidelity 숫자를 확인한다. 렌더를 일부러 틀어놓고 점수가 어떻게 떨어지는지, 어느 신호가 먼저 반응하는지 실험. "이미지 유사도를 수치화하는 법"을 손으로 익힌다.

난이도 ★★★★ · 중상급

4. 새 geometry 패턴 추가로 확장하기

grimoire/build/geometry_patterns.md의 물체종류→프리미티브 매핑 규칙을 읽고, generate_threejs_factory.py가 지원하는 15종 프리미티브 중 하나(예: curve-sweep)를 골라 실제로 어떤 Three.js 코드로 emit되는지 추적한다. 그런 다음 간단한 새 형상 헬퍼를 하나 얹어 본다. 코드 생성기(codegen)를 읽고 고치는 훈련.

난이도 ★★★★★ · 고급

5. 종료 보장 루프를 내 프로젝트로 이식

correction_loop.py의 우선순위 상태머신(EMPTY→SUCCESS→REPEATED_DEFECT→OSCILLATION→PLATEAU→HARD_CEILING)을 뜯어, "측정 가능한 메트릭을 반복 개선하되 반드시 종료되는" 범용 루프로 추상화해 본다. 그리고 자신의 다른 최적화 문제(프롬프트 튜닝·하이퍼파라미터 탐색 등)에 붙여 무한 루프 없이 자동 개선되게 만든다. 이 레포에서 가장 재사용 가치가 큰 패턴.

9관련 기술 심화 학습 로드맵

img2threejs를 완전히 소화하기 위한 4주 코스
주차주제학습 내용
1주차Three.js 기초씬·카메라·렌더러 / 지오메트리(Box·Sphere·Lathe·Tube·Extrude) / MeshPhysicalMaterial(PBR) / InstancedMesh. 도구: three.js 공식 문서 + editor
2주차컴퓨터 비전 유사도실루엣 IoU / SSIM / 퍼셉추얼 해시(pHash) / 색공간(sRGB·CIELAB)과 CIEDE2000. divine_eye.py·color_metrics.py 정독
3주차AI 파이프라인 설계결정론 게이트 vs LLM 판단 분리 / 주입형 콜러블로 VLM 종속시키기 / HARD·SOFT 2단 게이트 / 종료 보장 상태머신. vlm_gate.py·correction_loop.py 분석
4주차PBR·리깅·캐릭터albedo·roughness·normal·AO 추론 / de-lighting / 카메라 포즈 추정 / 소켓·콜라이더·관절(action_rigging) / SMPL-X·FLAME 개념. extract_pbr_evidence.py·grimoire/readiness/

이 순서를 밟으면 img2threejs는 단순한 "AI 3D 생성기"가 아니라 3D 그래픽스·컴퓨터 비전·AI 시스템 설계를 잇는 살아있는 교과서가 된다. 각 주차 개념이 정확히 어느 소스 파일에 구현돼 있어, "이론 → 실제 코드" 왕복 학습이 가능하다.

10핵심 키워드 사전

이 레포를 읽을 때 걸려 넘어지는 용어를 한 번에
용어의미
reconstruction-by-code메시 추출·스캔이 아니라 코드를 작성해 물체를 재구성하는 것. 이 도구의 정체성
스킬(skill)AI 에이전트에 붙이는 확장 기능 팩. SKILL.md+스크립트+문서 폴더 하나
agent-agnostic특정 회사 모델에 안 묶임. Claude·Codex·OpenCode 어디서든 동작
procedural(절차적)기본 도형과 규칙(코드)으로 형태를 생성. 결정론 시드로 재현 가능
primitive(프리미티브)Box·Sphere·Cylinder 등 기본 도형. 이들을 조립해 물체를 만듦
ObjectSculptSpec부품·재질·소켓을 선언한 JSON 설계도. 코드 생성의 입력
pass(패스)빌드 단계(blockout→…→optimization). 이전 패스 통과해야 다음이 열림
Divine Eye토큰 0의 결정론 채점기. 여러 유사도 신호를 앙상블해 fidelity 산출
silhouette IoU원본과 렌더의 외곽선 겹침 비율. 0.85 미만이면 HARD 탈락
SSIM구조적 유사도 지수. 밝기·대비·구조를 함께 비교
pHash퍼셉추얼 해시. 이미지를 짧은 지문으로 만들어 유사도 비교
CIEDE2000사람 눈에 맞춘 색차(色差) 공식. "색이 얼마나 틀어졌나" 측정
objectness"이게 같은 물체인가"를 보는 신호(OSIM-lite). 앙상블 최강 가중
fidelity(충실도)SOFT 신호 가중 평균으로 낸 최종 닮음 점수(목표 0.85)
VLMVision-Language Model. 이미지를 보고 판단하는 모델(호스트가 제공)
probe확신이 없을 때(신호가 엇갈릴 때) 추가 확인으로 보내는 판정
correction loop점수 미달 시 spec/코드를 고쳐 재시도하는 루프. 종료 보장
PBR물리 기반 렌더링. metalness·roughness 등 물리 계수로 재질 표현
InstancedMesh같은 형상을 여러 개 그릴 때 draw call 하나로 묶는 최적화
socket / rig부품에 붙는 부착점·관절. 애니메이션 준비성을 만드는 요소

11참고 링크

원문으로 더 파고들기