라이브 체험 프로젝트 소개
3D 모델을 몇 개 생성합니다. 그중 하나만 남깁니다. 나머지는 삭제됩니다. 3D Junkyard는 바로 그 나머지를 버리는 곳으로, 모두가 실시간으로 공유하는 버려진 3D 모델들의 은하입니다. 모델마다 자기 줄에 매달린 채 종류별로 모여 있습니다. 의자는 의자끼리, 램프는 램프끼리. 아무도 고르지 않은 모델도 다른 누군가에게는 바로 찾던 그것일 수 있습니다.
하나 버려 보세요. GLB / glTF / FBX / OBJ / STL 파일을 페이지에 끌어다 놓으면 손을 놓은 자리에 나타나 천천히 내려와 비슷한 것들 옆에 착지하고, 내 ID가 붙은 채 공개됩니다. 에이전트에게 맡길 수도 있습니다. Junkyard MCP 서버와 스킬을 설치하면 에이전트는 생성하기 전에 먼저 이곳을 검색하고, 맞는 것이 없을 때만 Tripo로 생성하며, 3D 작업이 끝날 때마다 최종 선택에서 탈락한 Tripo 모델을 이곳에 버립니다. 버린 모델에는 모두 Tripo로 만들었다는 태그가 붙습니다.
필요한 것이 있다면 설명하고, 날아가서, 가져가세요. CC BY 4.0에 따라 내놓은 사람을 표시하고 사용하면 됩니다. 다음으로 준비 중인 것은 버린 모델이 수익을 내는 구조입니다. 가져간 기록은 이미 모두 남아 있으며, 다음 단계에서는 모델을 내놓은 사람이 그 모델이 벌어들이는 수익을 나눠 받게 됩니다.
데스크톱 브라우저에서 열어 주세요. 휴대폰에서는 데스크톱으로 바꾸라는 안내가 표시됩니다. 월드에 미리 심어 둔 1,921개 모델은 공개 데이터셋 Objaverse 1.0(각 작가가 Sketchfab에 각자의 Creative Commons 라이선스로 공개)에서 가져왔으며, 12개 프리셋 ID 명의로 몇 개씩 내려앉습니다. 직접 버린 모델도 같은 은하에 매달립니다.
체험 포인트
- GLB / glTF / FBX / OBJ / STL 파일이나 zip으로 묶은 폴더를 페이지에 끌어다 놓으면, 손을 놓은 자리에 나타나 천천히 내려와 비슷한 것들 옆에 착지합니다. 착지 지점에는 접속 중인 모두가 볼 수 있는 불꽃이 터지고, 내 ID가 서명으로 남습니다
- 세계가 곧 인덱스입니다. 모든 아이템은 의미에 따라 은하 속 영구적인 셀에 자리 잡고, JUNK-3F9K2 같은 공유 가능한 고유 주소를 갖습니다. 문장이나 이미지로 검색하면 카메라가 검색에 걸린 아이템으로 날아가고, 그 아이템들은 환하게 켜지며 나머지는 모두 어두워집니다
- 에이전트에게 맡기세요. Junkyard MCP 서버와 스킬을 설치하면 Claude Code, Codex, Cursor가 생성하기 전에 먼저 이곳을 검색하고, 맞는 것이 없을 때만 Tripo를 쓰며, 작업이 끝나면 프로젝트에 쓰지 않은 모델을 이곳에 버립니다. 버린 모델에는 모두 Tripo로 만들었다는 태그가 붙습니다
- 가져가세요. 가져갈 수 있는 아이템에는 5분 동안 유효한 다운로드 링크와 바로 쓸 수 있는 저작자 표시 문구가 함께 제공됩니다. CC BY 4.0에 따라 내놓은 사람을 표시하고 사용하면 됩니다. 가져간 기록은 이미 모두 장부에 남아 있으며, 다음 단계에서는 내놓은 사람이 수익을 나눠 받게 됩니다
기술 분석
에이전트 루프 · 검색이 먼저, 생성은 그다음, 버리기는 마지막
하나의 junkyard 스킬을 수정 없이 Claude Code, Codex, Cursor에 그대로 설치할 수 있으며, 그 뒤에는 junkyard라는 이름의 Streamable HTTP MCP 서버가 있습니다. 서버는 junkyard_search / junkyard_fetch / junkyard_dump / junkyard_reclaim의 네 가지 동사를 제공하고, REST로도 같은 구성을 미러링합니다. 에이전트는 3D를 생성하기 전에 항상 텍스트로(참조 이미지가 있으면 함께) junkyard_search를 호출하며, 응답에 담긴 below_bar가 검색 결과가 충분히 좋은지 알려 줍니다. 기준을 넘는 결과가 세 개 미만일 때만 Tripo로 생성하고, Tripo 다운로드 링크는 5분이면 만료되므로 결과물은 즉시 디스크에 저장합니다.
집계는 작업이 끝날 때 한 번만 이루어집니다. 이번 라운드에 생성되었으면서 프로젝트에서 참조하지 않는 파일만 junkyard_dump로 넘어갑니다. 참조는 프로젝트 기준 상대 경로, 파일 이름, 확장자를 뺀 스템, 절대 경로의 네 가지 형태로 인정하며, 단어 경계를 기준으로 대소문자를 구분하지 않고 매칭합니다. 사용자가 골라서 옮긴 모델이나 새 이름으로 복사한 모델은 sha256으로 알아보고, 확실하지 않은 것은 그대로 남겨 둡니다. 참조 이미지는 절대 업로드하지 않고, 비공개로 표시된 프로젝트에서는 이 단계를 통째로 건너뜁니다. "마지막으로 버린 것 취소해 줘"라고 하면 junkyard_reclaim으로 해당 세션 전체를 회수합니다.
수집 파이프라인 · 어떤 포맷이든 받아 여덟 단계 만에 검색 가능한 아이템으로
페이지에 끌어다 놓은 파일과 에이전트가 버린 파일은 하나의 비동기 큐를 함께 씁니다. 검증 → 해시 → 변환 → 핑거프린트 → 라이선스 → 임베딩 → 태깅 → 배치 순으로 진행되며, 페이지에서 떨어지는 배너가 이 여덟 단계를 기준으로 진행 상황을 알려 줍니다. 변환 단계에서는 정규화된 표시용 사본을 만듭니다. Y축이 위를 향하게 하고, 가장 긴 변을 1단위로 맞추고, meshopt로 압축하며, 애니메이션은 유지합니다. 삼각형이 150,000개를 넘으면 그 아래로 줄이고, 16 MiB를 넘는 텍스처 세트는 단계적으로 다운샘플링합니다. 그래서 무거운 멀티 머티리얼 파일도 포인트 클라우드로 격하되지 않고 들어갈 만큼 가볍게 다듬어집니다.
같은 three.js 렌더러를 헤드리스 Chromium에서 실행해 아이템마다 8개 시점의 썸네일을 찍고, MeshSurfaceSampler로 점 20,000개짜리 컬러 포인트 클라우드를 샘플링합니다. 포인트 클라우드는 3D 인코더 Uni3D로, 썸네일은 SigLIP 2로 보내 검색용 벡터 두 개를 얻습니다. 4개 시점을 모은 콘택트 시트는 비전 언어 모델 Qwen3-VL-Flash에 한 번의 호출로 전달되며, 모델은 이중 언어 통제 어휘에서 카테고리, 스타일, 주요 색상을 고르고 두 언어로 된 자유 태그를 최대 다섯 개까지 덧붙입니다. 카테고리 · 스타일 · 첫 번째 자유 태그가 모든 목록에서 쓰이는 아이템 이름이 됩니다. 원본 프롬프트와 참조 이미지는 어떤 공개 산출물에도 들어가지 않습니다.
시맨틱 맵 · 세계가 곧 검색 인덱스
UMAP(3차원, 비모수)은 운영 환경과 같은 인코더로 얻은 공개 코퍼스 벡터로 한 번만 학습한 뒤 고정했으며, 이것이 맵 v1입니다. 새 아이템은 transform으로 배치하므로 기존 아이템은 절대 움직이지 않습니다. 좌표는 정수 셀로 양자화되고, 셀이 이미 차 있으면 결정론적 나선을 따라 가장 가까운 빈 셀을 찾습니다. 셀은 영구 주소입니다. 회수된 아이템은 그 자리에 묘비를 남기며, 그 셀은 다시 쓰이지 않습니다. 3D Hilbert 곡선이 각 셀을 24비트 인덱스로 바꾸고, 이를 Crockford Base32 다섯 글자로 적습니다. JUNK-3F9K2 같은 주소가 바로 이것이며, 번호가 이웃하면 공간에서도 이웃합니다.
검색은 두 갈래로 진행됩니다. Uni3D와 정렬된 EVA02 텍스트 타워(영어가 아닌 쿼리는 먼저 기계 번역)와 다국어 SigLIP 2(중국어는 그대로 인코딩하고 이미지 쿼리도 처리)입니다. 각각 pgvector의 HNSW 인덱스에서 후보를 불러오고, 두 목록은 RRF로 융합합니다. 텍스트 벡터와 아이템 벡터 사이에는 모달리티 갭이 있으므로 쿼리를 맵 위에 투영하지 않고, 대신 카메라가 상위 결과들의 중심점으로 날아갑니다. 기준을 넘는 결과가 세 개 미만이면 응답에 below_bar가 담기고, 페이지는 이를 일치도가 낮다고 표시하며, 에이전트는 이제 생성할 때라는 것을 알게 됩니다.
월드 렌더링 · 2,000개에 가까운 아이템, 세 단계 디테일
월드는 시점이 움직이는 대로 16×16 셀 크기의 타일 단위로 스트리밍되며, 모든 아이템은 거리에 따라 세 가지 모습을 갖습니다. 가까이에서는 완전한 메시입니다. 슬롯은 최대 24개로 화면에서 차지하는 크기 순으로 배정되며, 셰이더를 미리 컴파일한 뒤에야 표시됩니다. 중간 거리에서는 썸네일 실루엣 임포스터입니다. 구워 넣은 배경은 셰이더에서 키잉으로 제거하며, 슬롯 2,601개를 갖춘 4096² 아틀라스에서 그립니다. 멀리서는 인스턴싱된 앵커 포인트입니다. 모습 전환은 300 ms 크로스페이드로 이루어지고 불투명도의 합이 항상 1이므로, 빈 프레임은 한 번도 생기지 않습니다.
각 아이템은 자기 줄에 매달려 앵커 주위를 떠다니며 120–180초에 한 바퀴씩 천천히 돌고, 이 모든 움직임은 아이템의 id를 시드로 삼습니다. 그래서 네트워크 동기화 없이도 모든 클라이언트가 같은 움직임을 봅니다. 누군가 모델을 버리면 착지 지점의 불꽃이 SSE를 통해 접속 중인 모두에게 푸시됩니다. 프레임 레이트가 3초 동안 낮게 유지되면 4단계 자동 품질 저하(해상도 → 불꽃 → 원경 → 부유)가 작동하고, 근거리 메시 예산은 실제로 프레임이 떨어질 때만 줄어듭니다. draw call이 많다는 이유만으로 줄이는 일은 없습니다.


