# GameNow 공통 에셋 크레딧

`lib.gamenow.us/assets/` 에서 내보내는 오픈소스 에셋 목록. CC-BY 는 표기가 의무다.

## model

- **KayKit Space Base Bits** — Kay Lousberg (KayKit, www.kaylousberg.com) · CC0-1.0 · <https://github.com/KayKit-Game-Assets/KayKit-Space-Base-Bits-1.0> (`kaykit-space-base/1/`, 34개)
  - KayKit Space Base Bits 1.0 의 glTF 중 화성 기지용 33개. 정적 소품: 노드 변환을 굽고 한 메시로 합침, 원점=바닥 중심, 원본 단위 유지(meta.bbox), meshopt. 모든 glb 가 그라디언트 아틀라스 한 장 spacebits-texture.webp(무손실 WebP, EXT_texture_webp)을 외부 uri 로 참조한다 — 같은 폴더에서 읽을 것(GLTFLoader 는 glb 주소 기준으로 찾는다). 앞쪽=+Z(원본 그대로 — 트럭 앞유리·착륙선·기지 모듈 문이 +Z). 움직일 부품(트럭 바퀴·풍차 날개·드릴·차고 문)이 있는 모델은 노드를 지켰다 — meta.parts 의 노드 이름(피벗은 원본 그대로, 축척 1)을 돌리거나 옮기면 된다. 원작자 표기는 의무 아님(권장: Kay Lousberg).
- **Car Kit** — Kenney (www.kenney.nl) · CC0-1.0 · <https://kenney.nl/assets/car-kit> (`kenney-car-kit/1/`, 30개)
  - Kenney Car Kit 의 GLB 중 30개(승용차·택시·경찰차·SUV·밴·트럭·배송차·구급차·소방차·쓰레기차·트랙터·경주차 + 라바콘·상자·부서진 차 조각). 탈것은 노드 구조를 지켰다: body + wheel-front-left·wheel-front-right·wheel-back-left·wheel-back-right(meta.wheels; 피벗 = 바퀴 중심, meta.wheelInfo 에 pivot·radius) + 차종별 부품(meta.parts — firetruck grill, garbage-truck arm·trash 등). 메시는 <노드>_mesh 자식이다. 바퀴는 노드 로컬 X 축 회전으로 굴리고(전진 시 +X 축 둘레 양의 각속도 = 바퀴 윗면이 +Z 로), 앞바퀴는 로컬 Y 회전으로 조향한다. 앞쪽 = +Z(원본 그대로, 돌리지 않음), 왼쪽 = +X, 원점 = 바닥 중심(바퀴 바닥 y=0). suv 의 뒤 보조 바퀴(wheel-back)는 굴러가는 바퀴가 아니라 부품이다. 축척: 원본 단위(meta.size) — 세단 길이 2.55 단위 ≈ 4.5 m 라 1 단위 ≈ 1.75 m(바퀴 반지름 0.3 ≈ 0.53 m, 장난감처럼 통통한 비율). Kenney City Kit(1 단위 ≈ 8 m)과 축척이 다르다 — 도시 키트 옆에 놓으려면 약 0.22 배. 텍스처: 공통 색표 colormap(512²)을 무손실 WebP 로 품음(EXT_texture_webp). meshopt(GLTFLoader.setMeshoptDecoder 필요). 처음 쓴 게임: VERDICT(verdict). 원작자 표기는 의무 아님(권장: Kenney). 만드는 법: node tools/models/kenney-car-kit.mjs fetch && node tools/models/kenney-car-kit.mjs build
- **City Kit (Commercial)** — Kenney (www.kenney.nl) · CC0-1.0 · <https://kenney.nl/assets/city-kit-commercial> (`kenney-city-commercial/1/`, 41개)
  - Kenney City Kit (Commercial) 2.1 의 GLB 중 41개(meta.role: commercial·skyscraper·prop). 원본 단위 그대로 — 게임이 meta.size 로 축척한다(Kenney City Kit 4종 공통 축척: 도로 타일 한 칸 = 1 단위 ≈ 8 m(2차선 폭). 출입문 높이 약 0.25·층고 약 0.4·가로등 0.6~0.68·라바콘 0.094 단위 — 사람(1.8 m)은 약 0.22 단위. 게임에서 1 = 1 m 로 쓰려면 8 배). 정적 모델: 노드 변환을 굽고 재질별로 합침(메시 하나), 원점=바닥 중심(bbox), meshopt(GLTFLoader.setMeshoptDecoder 필요). 원본 원점(격자 기준)은 새 좌표에서 meta.origin0 — 격자에 맞추려면 −origin0 만큼 옮긴다. 앞쪽=+Z(원본 그대로 — 출입문·차양·신호등 앞면). 텍스처: 키트 공통 색표 colormap(512²)을 무손실 WebP 로 glb 마다 품었다(EXT_texture_webp). lowDetail 표시 모델은 먼 배경(스카이라인)용. 처음 쓴 게임: VERDICT(verdict). 원작자 표기는 의무 아님(권장: Kenney). 만드는 법: node tools/models/kenney-city.mjs fetch kenney-city-commercial && node tools/models/kenney-city.mjs build kenney-city-commercial
- **City Kit (Industrial)** — Kenney (www.kenney.nl) · CC0-1.0 · <https://kenney.nl/assets/city-kit-industrial> (`kenney-city-industrial/1/`, 35개)
  - Kenney City Kit (Industrial) 2.0 의 GLB 중 35개(meta.role: industrial·prop). 원본 단위 그대로 — 게임이 meta.size 로 축척한다(Kenney City Kit 4종 공통 축척: 도로 타일 한 칸 = 1 단위 ≈ 8 m(2차선 폭). 출입문 높이 약 0.25·층고 약 0.4·가로등 0.6~0.68·라바콘 0.094 단위 — 사람(1.8 m)은 약 0.22 단위. 게임에서 1 = 1 m 로 쓰려면 8 배). 정적 모델: 노드 변환을 굽고 재질별로 합침(메시 하나), 원점=바닥 중심(bbox), meshopt(GLTFLoader.setMeshoptDecoder 필요). 원본 원점(격자 기준)은 새 좌표에서 meta.origin0 — 격자에 맞추려면 −origin0 만큼 옮긴다. 앞쪽=+Z(원본 그대로 — 출입문·차양·신호등 앞면). 텍스처: 키트 공통 색표 colormap(512²)을 무손실 WebP 로 glb 마다 품었다(EXT_texture_webp). lowDetail 표시 모델은 먼 배경(스카이라인)용. 처음 쓴 게임: VERDICT(verdict). 원작자 표기는 의무 아님(권장: Kenney). 만드는 법: node tools/models/kenney-city.mjs fetch kenney-city-industrial && node tools/models/kenney-city.mjs build kenney-city-industrial
- **City Kit (Roads)** — Kenney (www.kenney.nl) · CC0-1.0 · <https://kenney.nl/assets/city-kit-roads> (`kenney-city-roads/1/`, 45개)
  - Kenney City Kit (Roads) 의 GLB 중 45개(meta.role: prop·road). 원본 단위 그대로 — 게임이 meta.size 로 축척한다(Kenney City Kit 4종 공통 축척: 도로 타일 한 칸 = 1 단위 ≈ 8 m(2차선 폭). 출입문 높이 약 0.25·층고 약 0.4·가로등 0.6~0.68·라바콘 0.094 단위 — 사람(1.8 m)은 약 0.22 단위. 게임에서 1 = 1 m 로 쓰려면 8 배). 정적 모델: 노드 변환을 굽고 재질별로 합침(메시 하나), 원점=바닥 중심(bbox), meshopt(GLTFLoader.setMeshoptDecoder 필요). 원본 원점(격자 기준)은 새 좌표에서 meta.origin0 — 격자에 맞추려면 −origin0 만큼 옮긴다. 앞쪽=+Z(원본 그대로 — 출입문·차양·신호등 앞면). 텍스처: 키트 공통 색표 colormap(512²)을 무손실 WebP 로 glb 마다 품었다(EXT_texture_webp). lowDetail 표시 모델은 먼 배경(스카이라인)용. 처음 쓴 게임: VERDICT(verdict). 원작자 표기는 의무 아님(권장: Kenney). 만드는 법: node tools/models/kenney-city.mjs fetch kenney-city-roads && node tools/models/kenney-city.mjs build kenney-city-roads
- **City Kit (Suburban)** — Kenney (www.kenney.nl) · CC0-1.0 · <https://kenney.nl/assets/city-kit-suburban> (`kenney-city-suburban/1/`, 40개)
  - Kenney City Kit (Suburban) 2.0 의 GLB 중 40개(meta.role: house·prop·road). 원본 단위 그대로 — 게임이 meta.size 로 축척한다(Kenney City Kit 4종 공통 축척: 도로 타일 한 칸 = 1 단위 ≈ 8 m(2차선 폭). 출입문 높이 약 0.25·층고 약 0.4·가로등 0.6~0.68·라바콘 0.094 단위 — 사람(1.8 m)은 약 0.22 단위. 게임에서 1 = 1 m 로 쓰려면 8 배). 정적 모델: 노드 변환을 굽고 재질별로 합침(메시 하나), 원점=바닥 중심(bbox), meshopt(GLTFLoader.setMeshoptDecoder 필요). 원본 원점(격자 기준)은 새 좌표에서 meta.origin0 — 격자에 맞추려면 −origin0 만큼 옮긴다. 앞쪽=+Z(원본 그대로 — 출입문·차양·신호등 앞면). 텍스처: 키트 공통 색표 colormap(512²)을 무손실 WebP 로 glb 마다 품었다(EXT_texture_webp). lowDetail 표시 모델은 먼 배경(스카이라인)용. 처음 쓴 게임: VERDICT(verdict). 원작자 표기는 의무 아님(권장: Kenney). 만드는 법: node tools/models/kenney-city.mjs fetch kenney-city-suburban && node tools/models/kenney-city.mjs build kenney-city-suburban
- **Cube Pets** — Kenney (www.kenney.nl) · CC0-1.0 · <https://kenney.nl/assets/cube-pets> (`kenney-cube-pets/1/`, 24개)
  - Kenney Cube Pets 2.0 의 동물 24마리(정육면체 몸통 저폴리, 마리당 422~951 삼각형). 뼈대 없이 노드 TRS 애니메이션: static·idle·walk·run·eat·dance·gesture-positive·gesture-negative(static 0.1s, idle 1s, walk·eat·dance 0.5s, run·gesture-* 0.25s, 선형 보간, 루프용). 클립이 root 를 포함한 모든 노드의 T·R·S 를 쓰므로 게임이 클립과 코드 애니메이션을 섞을 때는 클립을 끄거나(또는 해당 트랙을 빼고) 노드를 돌린다. 노드 이름·계층·피벗은 원본 그대로: <animal-이름> → root → body·leg-front-left/right·leg-back-left/right (+ body 아래 tail·wing-left/right·Group). 다리 노드 원점이 엉덩이 피벗(몸통 밑면, 예: leg-front-left (0.25,0.3,0.25)) — 다리는 X 축으로 돌리면 걷는다. 두 발 동물(chick·parrot·penguin)은 leg-front-left/right 만(z=0), fish 는 다리 없음, elephant 의 tail 노드는 앞쪽 코(trunk), Group 은 코·주둥이·볏·집게 같은 장식. meta.parts 에 노드별 피벗. 앞쪽=+Z(원본 그대로 — 얼굴이 +Z, 왼쪽 다리가 +X), Y 위, 원점=바닥(y=0)·몸통 중심(원본 그대로, 몸통은 x·z ±0.625 의 1.25 정육면체, 키 약 1.4~1.7). 텍스처: 원본 colormap.png(512², 32px 너비 칸마다 세로 그라데이션 — 색 1829개)를 무손실 WebP 로 glb 안에 품었다(EXT_texture_webp, three.js GLTFLoader 기본 지원). UV 가 칸 안쪽을 가리켜 NearestFilter 로 바꿔도 색이 같다(먼 거리 밉맵에서 옆 칸이 번지면 minFilter 를 NearestFilter/LinearFilter(밉맵 없음)로). meshopt 는 쓰지 않았다(애니메이션 노드에 양자화 보정 변환을 넣을 수 없고 파일이 작다). 원작자 표기는 의무 아님(권장: Kenney).
- **Platformer Kit** — Kenney (www.kenney.nl) · CC0-1.0 · <https://kenney.nl/assets/platformer-kit> (`kenney-platformer-kit/1/`, 52개)
  - Kenney Platformer Kit 4.1 의 GLB 중 52개(관·문·깃발·나무·꽃·풀·바위·울타리·표지판·사다리·상자·통·폭탄·톱·가시 함정·스프링·레버·버튼·동전·별·하트·보석·보물상자·발판·잔디/눈 블록·캐릭터 oobi). 원본 단위 그대로(1 = 블록 한 칸, block-grass 는 1×1×1) — 게임이 meta.bbox/size 로 축척한다. 텍스처: 모든 모델이 같은 색표 colormap(512², 32px 너비 칸마다 세로 그라데이션 — 색 2015개)을 무손실 WebP 로 glb 마다 품었다(EXT_texture_webp, 약 3KB). UV 가 칸 안쪽을 가리켜 NearestFilter 로 바꿔도 색이 같다. 정적 소품: 노드 변환을 굽고 재질별로 합침, 원점=바닥 중심(bbox), meshopt. 원본 원점(타일 격자 기준)은 새 좌표에서 meta.origin0 에 있다 — 격자에 맞추려면 모델을 −origin0 만큼 옮긴다. 앞쪽=+Z(원본 그대로 — 캐릭터 얼굴·표지판 앞면이 +Z). 움직일 부품은 노드를 지켰다(meta.parts: node·pivot·motion, 메시는 <node>_mesh 자식): chest lid, lever handle, button-round button, trap-spikes* spikes, spring platform·coil(원본 이름 spring 이 둘이라 자식을 coil 로), door-rotate* door(원본 클립 그대로). 원본이 한 메시인 saw 는 blade 노드(톱날 중심 피벗, 로컬 Z 로 돌림), flag 는 pole·cloth 노드(천 피벗 = 깃대 축)로 나눴다. door-open·door-large-open 은 문짝 없는 문틀(아치)이다 — 문짝이 열리는 문이 필요하면 door-rotate·door-rotate-large. pipe 는 위가 뚫린 관(1×0.56×1). character-oobi 는 뼈대 캐릭터(클립 25개, 원점 발밑 그대로). 원작자 표기는 의무 아님(권장: Kenney).
- **Space Kit** — Kenney (www.kenney.nl) · CC0-1.0 · <https://kenney.nl/assets/space-kit> (`kenney-space-kit/1/`, 33개)
  - Kenney Space Kit 2.0 의 GLTF(glb) 중 33개(바위·크레이터·운석·포탑·위성 접시·격납고·구조물·발전기·탈것·우주인). 메크는 이 키트에 없다. 텍스처 없음 — 이름 붙은 단색 재질(dark·metal·metalDark·metalRed 등, meta.materials)이라 게임이 재질 이름으로 색을 바꿀 수 있다. 정적 소품: 노드 변환을 굽고 재질별로 합침, 원점=바닥 중심, 원본 단위 유지(meta.bbox), meshopt. 앞쪽=+Z(원본 −Z 를 Y 축 180° 돌림 — 우주선 기수·포신·우주인 얼굴이 +Z). 움직일 부품(포탑 turret·barrel, 격납고 gate_1/2, 우주인 팔다리)은 노드를 지켰다 — meta.parts 의 노드를 돌리면 된다(피벗 원본 그대로, 축척 1). 원작자 표기는 의무 아님(권장: Kenney).
- **Science Lab Props (Poly Pizza: CreativeTrio · Kenney · Quaternius · Google Poly 외)** — 여러 저작자 — 파일별 meta.author/license/source (Colonel Cthulu, MilkAndBanana, Poly by Google, Quaternius, Ryan Donaldson, Gabriel Valdivia, Zoe XR, iPoly3D, CreativeTrio, Kenney, William Murphy, Ali12, jeremy, hat_my_guy, Nick Slough, Jarlan Perez, GameNow 절차 생성) · CC-BY-3.0 · <https://poly.pizza> (`lab-props/1/`, 35개)
  - EUREKA LAB(과학 퍼즐) 실험실 소품: 실험대·의자·칠판·책장 같은 배경 소품과 현미경·비커·플라스크·전구·자석·화분 같은 탁상 소품. Poly Pizza 의 로우폴리 모델(CC0: MilkAndBanana, Quaternius, iPoly3D, CreativeTrio, Kenney, hat_my_guy / CC-BY 3.0: Colonel Cthulu, Poly by Google, Ryan Donaldson, Gabriel Valdivia, Zoe XR, William Murphy, Ali12, jeremy, Nick Slough, Jarlan Perez). 라이선스가 섞여 있다 — 팩 license 는 가장 제약이 큰 CC-BY-3.0, 파일별 meta.license 를 따른다. CC-BY 파일(microscope, erlenmeyer-flask, test-tube-rack, magnifier, dna-model, clipboard, lab-table, lab-bench, chalkboard, light-bulb, magnet, plant-sprout, bell, balloon, basket)은 게임 크레딧에 meta.attribution(제목·저자·라이선스·출처)을 표시해야 한다. 알맞은 공개 모델이 없던 atom-model, bunsen-burner 은 이 저장소가 단순 도형으로 직접 만들었다(CC0, meta.author 'GameNow', licenses/lab-props/GENERATED-CC0.txt). 정적 모델: 원점 = 바닥 중심(경계 상자 아래 가운데), 앞쪽 +Z(원본이 다른 쪽을 보던 것은 meta.rotatedY 만큼 돌렸다). 축척은 실제 크기에 맞췄다 — 1 단위 = 1 m(실험대 높이 0.9, 현미경 0.35, 비커 0.12 …; meta.size, 원본 대비 배율 meta.scaled). 게임이 보기 좋게 키워 쓴다. 텍스처는 WebP(최대 512), meshopt 압축(GLTFLoader.setMeshoptDecoder 필요). 만드는 법: node tools/models/lab-props.mjs fetch && node tools/models/lab-props.mjs build
- **Mech Character Model (Pioneer)** — Colorado Stark (OpenGameArt uploader) · CC0-1.0 · <https://opengameart.org/content/mech-character-model> (`mech-pioneer/1/`, 3개)
  - 원작자 이름이 페이지에 따로 없어 OpenGameArt 업로더 이름을 적었다. FBX(3ds Max Biped) → glb. 정규화: 키 1.0(발바닥 y=0·머리 꼭대기 y=1), 원점 = 두 발 사이 바닥, 앞쪽 +Z, Y 위 — 축척은 뼈대·정점·inverse bind 에 구워서 노드에 scale 이 없다. 애니메이션 없음(원본 Take 001 은 T자세 정지라 버림) — 게임이 Bip001_* 뼈대를 코드로 움직인다. 노드 44개 중 스킨 조인트 39개. 텍스처는 glb 안(EXT_texture_webp, meshopt — GLTFLoader.setMeshoptDecoder 필요): baseColor 1024(sRGB), normal 1024(glTF 규약으로 변환: 원본 OpenGL Y+ → 이미지 뒤집기 + G 반전), metallicRoughness 1024(G = 원본 스페큘러를 뒤집은 roughness 0.35~0.95, B = 1, metallicFactor 0.45 — 게임이 factor 로 조절). pioneer-paintmask.webp = 파란 도장 부분 흰색(색상 185~235°·채도>0.2·명도>0.12, 녹·흠집 제외, 경계 흐림). glb 텍스처와 같은 glTF 방향이라 TextureLoader 로 읽으면 flipY=false, UV 는 map 과 같다. pioneer-lod1.glb = 삼각형 약 35%·텍스처 512(스킨 유지).
- **Low-poly Firearms (Quaternius · Pichuliru, Poly Pizza)** — Quaternius; Pichuliru (소음기) — 파일별 meta.creator · CC0-1.0 · <https://poly.pizza/u/Quaternius> (`quaternius-guns/1/`, 12개)
  - Quaternius 의 저폴리 총기(poly.pizza, CC0) 10종 — 저격총 2·돌격소총 2·기관단총 2·권총 2·리볼버·산탄총 — 과 Pichuliru 소음기(CC0), 그리고 둘을 합친 소음 권총. 단색 재질만(텍스처 없음, meta.materials). 앞쪽 = +Z(총구), 위 = +Y — 원본(총구 +X)을 Y 축 −90° 돌렸다. 원점 = 오른손이 쥐는 손잡이 어림(meta.gripU: 개머리 끝에서 길이의 그 비율 자리, 높이는 그 단면의 가장 낮은 점과 총열 높이 사이 — 총열에서 40% 아래). meta.muzzle = 원점 기준 총구 끝(총열 높이·가장 앞)이라 총구 불꽃·탄 시작점·소음기 붙일 자리로 쓴다. 축척은 원본 단위 그대로인데 Quaternius 총은 모델마다 제각각이라(권총 ≈1.8, 저격총 ≈6.3 단위) 실제 길이 어림 meta.suggestedLength(m) 와 suggestedScale(= suggestedLength / size[2])을 적었다 — 1 단위 = 1 m 세계에서 손에 들리려면 모델을 suggestedScale 배로. 소음기(suppressor.glb)만 원본이 미터 단위(길이 0.14 m)이고 원점이 뒤 끝 — 총 모델의 자식으로 붙이려면 총의 muzzle 위치에 두고 축척 1/총 suggestedScale. pistol-silenced 는 그렇게 미리 합친 것(소음기 노드 이름 suppressor). meshopt(GLTFLoader.setMeshoptDecoder 필요). 원작자 표기는 의무 아님(권장: Quaternius).
- **Animated Mechs (Quaternius, Poly Pizza)** — Quaternius · CC0-1.0 · <https://poly.pizza/u/Quaternius> (`quaternius-mechs/1/`, 4개)
  - Quaternius 의 애니메이션 메크 4종(Poly Pizza 배포 glb). 조종석에 동물 조종사가 앉은 다리 넷 메크. 애니메이션 17개 유지(키프레임 resample, 클립 이름의 RobotArmature| 접두사는 뗐다 — Idle·Walk·Run·Shoot_Big …). 원점·축척은 원본 그대로(발 아래 원점, 키 약 3) — meta.bbox 참고. 앞쪽 +Z. 텍스처 아틀라스 1장 WebP, meshopt(GLTFLoader.setMeshoptDecoder 필요).
- **Animated People (Quaternius, Poly Pizza)** — Quaternius · CC0-1.0 · <https://poly.pizza/u/Quaternius> (`quaternius-people/1/`, 10개)
  - Quaternius 의 애니메이션 사람 10명(Poly Pizza 배포 glb — 정장 보스·SWAT 경비·펑크 남녀·작업자·시민 남녀 셋·후드티·두건 쓴 잠입자). 모두 같은 뼈대(CharacterArmature, 뼈 62개 — 이름까지 같다)와 같은 클립 24개: Death, Gun_Shoot, HitRecieve, HitRecieve_2, Idle, Idle_Gun, Idle_Gun_Pointing, Idle_Gun_Shoot, Idle_Neutral, Idle_Sword, Interact, Kick_Left, Kick_Right, Punch_Left, Punch_Right, Roll, Run, Run_Back, Run_Left, Run_Right, Run_Shoot, Sword_Slash, Walk, Wave. 한 파일의 AnimationClip 을 다른 캐릭터의 AnimationMixer 에 그대로 쓸 수 있다. 클립 이름의 CharacterArmature| 접두사는 뗐다. 쓸 만한 대응: 대기 Idle(무기 없이 Idle_Neutral), 걷기 Walk, 뛰기 Run(+Run_Back/Left/Right), 죽음 Death, 총 쏘기 Gun_Shoot·Idle_Gun_Shoot·Run_Shoot, 조준 Idle_Gun_Pointing·Idle_Gun, 주먹 Punch_Left/Right, 발차기 Kick_Left/Right, 근접 베기(칼 제압) Sword_Slash, 피격 HitRecieve·HitRecieve_2, 구르기 Roll, 조작(해킹·줍기) Interact, 손 흔들기 Wave. 웅크리기·살금살금·점프 클립은 이 계열에 없다 — 게임이 Walk 를 느리게 + 엉덩이(Hips) 높이를 낮추는 식으로 만든다. 총 메시는 없다 — 손 뼈(meta 없음, 이름 Wrist.R/Fist.R 등)에 붙인다. 원점·축척 원본 그대로(발밑 y=0, 키 약 1.8 — 1 단위 = 1 m), 앞쪽 +Z. 텍스처 없음 — 단색 재질(meta.materials, 예: hoodie 의 Purple 을 검게 칠하면 어두운 후드). hooded-rogue 는 손에 Sword 노드(뼈에 붙은 정적 메시, meta.props)가 있다 — visible=false 로 숨길 수 있다. 키프레임 resample, meshopt(GLTFLoader.setMeshoptDecoder 필요). 처음 쓴 게임: VERDICT(verdict). 만드는 법: node tools/models/quaternius-people.mjs fetch && node tools/models/quaternius-people.mjs build
- **Sci-fi Vehicles, Base & Props (Quaternius · Kenney, Poly Pizza)** — Quaternius; Kenney (파일별 meta.creator) · CC0-1.0 · <https://poly.pizza/u/Quaternius> (`quaternius-scifi/1/`, 53개)
  - Poly Pizza 에 올라온 Quaternius·Kenney 의 CC0 소품(파일별 meta.creator·title·publicID). 정적 모델은 원점 = 바닥 중심(경계 상자 아래 가운데), 애니메이션 모델(로봇·탱크 4종)은 노드 구조·애니메이션을 원본 그대로 두고(클립 이름의 …Armature| 접두사만 뗌) 원점도 원본(이미 바닥)이다. 앞쪽은 모두 +Z — 원본이 −X 를 보던 탱크 1·2·4·5 는 Y 축 +90° 회전 루트 노드(<이름>_forward)를 더했다. 축척은 원본 단위(meta.bbox·size 참고 — 모델마다 다르니 게임이 맞춘다. 탱크는 길이 약 15, 로버 약 4). 재질 대부분은 단색(텍스처 없음)이라 게임이 재질 색으로 칠할 수 있다. 텍스처는 WebP(최대 512), meshopt 압축(GLTFLoader.setMeshoptDecoder 필요).
- **Ancient Ruins & Jungle Kit** — Quaternius; Kenney; reyshapes; CircuitZ (파일별 meta.creator) · CC0-1.0 · <https://poly.pizza/m/F2LAK03B0r> (`ruins-kit/1/`, 59개)
  - 고대 유적·사원·정글 키트(전부 CC0). 돌 유적 조각(기둥·아치·벽·계단·바닥·돌덩이·석상·횃불·항아리·촛불·해골)은 Quaternius "Modular Ruins Pack"(poly.pizza, 한 장면에 늘어선 조각을 노드별로 떼어 냄), 우상 머리·오벨리스크·부서진 기둥·돌고리는 Kenney Nature Kit, 제단·단지는 Kenney Graveyard Kit, 야자수·큰 나무·고사리·덤불·이끼 바위/통나무·받침대는 Quaternius(poly.pizza), 큰 잎 식물은 reyshapes, 화덕은 CircuitZ. 서 있는 화로(brazier)는 쓸 만한 CC0 원본이 없어 벽 횃불(torch-wall)·화덕(fire-pit)으로 대신한다 — 불꽃·빛은 게임이 더한다. Kenney 조각은 밝은 회색 단색 재질이라 Quaternius 돌(올리브빛 회색)과 색이 다르다(게임이 재질 색을 맞춰도 된다). meta.role: ruin(구조물) · plant · rock · prop. 정적 모델: 노드 변환을 굽고 재질별로 합침, 원점 = 바닥 중심(경계 상자 아래 가운데), 앞쪽 +Z(벽·아치는 X 로 길고 겉면이 ±Z), 텍스처 WebP(최대 512), meshopt(GLTFLoader.setMeshoptDecoder 필요). 축척은 원본 단위 그대로 — 원본마다 다르다: Quaternius 유적 조각은 1 단위 ≈ 1 m(벽 2×2, 기둥 4, 아치 3.5), Kenney 조각은 작고(석상 머리 1, 제단 1.04 폭) Quaternius 나무·바위도 제각각이라 meta.suggestedHeight(m)·suggestedScale 을 적었다 — 1 단위 = 1 m 세계에 놓으려면 모델을 suggestedScale 배로. 벽·바닥은 2 단위 격자(Wall 2×2, Floor 2×2, 큰 벽 4×4)라 suggestedScale 1 이면 그대로 맞물린다. 원작자 표기는 의무 아님(권장: Quaternius, Kenney).
- **Fighter jets & missiles (Sketchfab, via DOGFIGHT)** — dwsd, Usman Zia, andertan, AIRMAN Magazine, NETRUNNER_pl, Savy, rickslash, Mustafa Garip · CC-BY-4.0 · <https://sketchfab.com (파일마다 meta.source)> (`skf-aircraft/1/`, 26개)
  - 전투기 12종(F-14·F-15·F-16·F/A-18·F-22·A-10·MiG-21·MiG-29·MiG-31·Su-27·Su-35·Su-57)과 미사일 2종(AIM-9·AIM-54). dogfight 의 build-models.mjs 가 규격화: 기수 −Z(주의: 다른 팩은 +Z), 위 +Y, 오른쪽 날개 +X, 원점 = 경계 상자 중심, 실제 전장(m). 전투기는 <id>.lod1.glb(먼 거리용 2~3천 삼각형·64px 텍스처)가 따로 있다. 실제 기종 모양 — 게임 안 이름 표기는 각 게임이 정한다. 원본: Sketchfab(CC Attribution 4.0 — 파일마다 meta.author·source 를 크레딧에 표시). 만드는 법: ../dogfight 에서 node tools/build-models.mjs 한 뒤 node tools/models/dogfight-aircraft.mjs
- **Asian Themed Low Poly Night City Buildings** — 99.Miles · CC-BY-4.0 · <https://sketchfab.com/3d-models/asian-themed-low-poly-night-city-buildings-9f0343aff4814b758dc6e905aba5b5e0> (`skf-asian-night-towers/1/`, 1개)
  - 아시아 야경 고층 건물 23채(창 발광 텍스처 — 밤 지도용). 원본 단위 m, 24~90 m 폭, 55~300 m 높이. 플레어 노드는 뺐다. 높이순 tower-NN. 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-asian-night-towers
- **Asian Shop Pack (game ready)** — abhayexe · CC-BY-4.0 · <https://sketchfab.com/3d-models/asian-shop-pack-free-gameready-2f603ad8d5c640f7b9794f6916f9fbdd> (`skf-asian-shops/1/`, 1개)
  - 아시아 골목 상점 정면 13칸(간판 발광, 폭 2.4~7.2 m, 높이 3.6 m, 깊이 1.3 m)과 노점 3개. 밤 지도(네온 야시장)용. 원본 3 m 높이를 1.2 배. 정면 +Z(preview 로 확인). 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-asian-shops
- **Atlanta Corporate Office Building** — 99.Miles · CC-BY-4.0 · <https://sketchfab.com/3d-models/free-atlanta-corperate-office-building-d96380fb001345cca9a9be121f3e43d5> (`skf-atlanta-tower/1/`, 1개)
  - 유리 외벽 사무 타워 1채(로비 내부·광고판 발광). 원본 단위 m, 61×212×97 — 필지에는 0.45~0.55 배로. 37k 삼각형이라 지도당 한두 채만. 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-atlanta-tower
- **Buildings Front (brownstone facades)** — Zambur · CC-BY-4.0 · <https://sketchfab.com/3d-models/buildings-front-75876ad5f6bf4a30baa71673c303213d> (`skf-brownstone-fronts/1/`, 1개)
  - 정면만 있는 브라운스톤 외벽 4장(PBR, 18~28 m 폭, 20~28 m 높이, 2~10 m 깊이). 절차 건물 앞면에 붙이는 용도. 원본은 폭이 z 축이라 90° 돌려 폭을 x 로 맞췄다(정면 +Z — preview 로 확인). 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-brownstone-fronts
- **CCity Building Set 1** — neberkenezer · CC-BY-4.0 · <https://sketchfab.com/3d-models/ccity-building-set-1-a2d5c7bfcc2148fb8994864c43dfcc97> (`skf-ccity-set/1/`, 1개)
  - 범죄 도시 느낌의 저층 상가·주택(극장·주류점·클리닉·빨래방·총포상·전당포·생선 공장·임대 아파트·주택·농구장·가로등·신호등). 원본 cm → 0.01. 18~54 m 폭, 9~32 m 높이. 창 발광 텍스처. 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-ccity-set
- **Realistic Chicago Buildings** — 99.Miles · CC-BY-4.0 · <https://sketchfab.com/3d-models/realistic-chicago-buildings-c4a3993ef1e84e6d9d5a15c78da88aae> (`skf-chicago-buildings/1/`, 1개)
  - 시카고풍 블록 건물 2채(검은 극장 건물 + 전광 마키, 벽돌 사무 건물). 원본 단위 m — 78×71×55, 90×62×53 로 커서 필지(58 m)에 맞추려면 0.6~0.7 배로 줄인다(창이 조금 작아 보여도 괜찮다). 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-chicago-buildings
- **City Props (warehouse, light pole, trash)** — Lucas Presoto (LucasPresoto) · CC-BY-4.0 · <https://sketchfab.com/3d-models/city-props-4d3a3cc4cb41493f9a584ea3e6c998be> (`skf-city-props/1/`, 1개)
  - 창고 건물(15×8×16.5 m, 공업 지구용)·가로등·펜던트 등·쓰레기통·쓰레기봉투·상자·철창·문 달린 벽·벽. 원본 단위 m. 바닥 노드는 뺐다. 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-city-props
- **Civil & trainer aircraft (A320neo, P-51, low-poly F-16) — via flightEarth** — dursoalfio, James Jackaman, bohmerang (파일마다 meta.author) · CC-BY-4.0 · <https://sketchfab.com · https://opengameart.org (파일마다 meta.source)> (`skf-civil-aircraft/1/`, 3개)
  - 여객기 A320neo(37.6 m)·P-51 머스탱(9.8 m, 프로펠러 노드)·저폴리 F-16(15.1 m). flightEarth 가 쓰던 모델을 공용으로. 규격은 skf-aircraft 와 같다: 기수 −Z, 위 +Y, 원점 = 경계 상자 중심(p51 은 원본 무게중심), 실제 전장 m. 노드 이름 유지(랜딩기어·프로펠러·도장 부위). P-51 은 CC-BY-3.0(저자 표기). Cessna 172 는 CC-BY-ND 라 넣지 않았다. 만드는 법: node tools/models/flightearth-aircraft.mjs
- **Downtown Buildings Set (Low Poly)** — Daniel Zhabotinsky (DanielZhabotinsky) · CC-BY-4.0 · <https://sketchfab.com/3d-models/downtown-buildings-set-low-poly-model-7378e7fb9c914c39880d9913a6f4e1d6> (`skf-downtown-buildings/1/`, 1개)
  - 텍스처가 입혀진 도심 건물 18채(플랫아이언·아르데코·브루탈리즘·현대 오피스·브라운스톤·주택·쇼핑몰·관공서). 원본 단위 m, 10~57 m 폭, 18~102 m 높이. 한 glb 안에 부품 노드(meta.parts). 역할: 높이 50 m 이상 tower, 나머지 commercial. 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-downtown-buildings
- **Sketchfab game-ready guns (silenced pistol, sniper rifles)** — matthall (pistol), AlexFinsher (SV-98M), D.Acee (LRX-24) · CC-BY-4.0 · <https://sketchfab.com/3d-models/cyberpunk-pistol-with-silencer-free-b08c33f6d67e446fa54ad443e01c7cdd , https://sketchfab.com/3d-models/sv-98m-sniper-rifle-bf79b7f1d4304123823bb345848de80f , https://sketchfab.com/3d-models/lrx-24-tactical-sniper-rifle-game-ready-4k-pbr-286c006a312d46d29bf26374cc441d2c> (`skf-guns/1/`, 3개)
  - 소음기 권총(사이버펑크, 0.4 m)·SV-98M 저격총(1.2 m)·LRX-24 저격총(1.06 m). PBR 텍스처. 원점 = 경계 상자 가운데, 총구 +Z(meta.muzzle = 총구 위치 m). 게임은 손목 위치에 두고 몸 방향으로 돌린다. 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-guns
- **Low-poly City Buildings (textured towers)** — smooth998 · CC-BY-4.0 · <https://sketchfab.com/3d-models/low-poly-city-buildings-e0209ac5bb684d2d85e5ade96c92d2ff> (`skf-lowpoly-towers/1/`, 1개)
  - 맨해튼풍 고층 건물 21채(엠파이어·크라이슬러 느낌 포함), 한 아틀라스. 원본은 작은 디오라마(가장 높은 건물 2.7 단위)라 40배 해 56~107 m 로 맞췄다. 폭 6~21 m 로 좁아 필지 한 칸에 두세 채가 들어간다. 노드 이름이 깨져 있어 높이순 tower-NN 으로 이름 지었다. 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-lowpoly-towers
- **Free Low Poly Vehicles Pack** — rgsdev · CC-BY-4.0 · <https://sketchfab.com/3d-models/free-low-poly-vehicles-pack-cb7640039e7a40679a53be705ebff50e> (`skf-lowpoly-vehicles/1/`, 21개)
  - 차 21종(세단·해치백·SUV·픽업·밴·택시·스포츠·로드스터·머슬 2종·리무진·경찰 4종·구급차·버스·트럭·트레일러 트럭·소방차·몬스터 트럭). 단색 재질(텍스처 없음), 바퀴 노드 분리(wheel-front-left …, 원점이 바퀴 중심이라 돌릴 수 있다). 원본 단위 m, 앞쪽 +Z 로 맞췄다. 길이 5~14 m. 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-lowpoly-vehicles
- **Military ground & naval (Sketchfab, via DOGFIGHT)** — Mr. The Rich, Muhamad Mirza Arrafi, 42manako · CC-BY-4.0 · <https://sketchfab.com (파일마다 meta.source)> (`skf-military-ground/1/`, 4개)
  - 전차 2(T-72 저폴리·T-90AM)·지대공 미사일 차량(Sevom Khordad)·항공모함(CVN-69, 333 m). 규격은 skf-aircraft 와 같다(앞 −Z, 원점 가운데, 실제 크기 m). 원본: Sketchfab(CC Attribution 4.0 — 파일마다 meta.author·source 를 크레딧에 표시). 만드는 법: ../dogfight 에서 node tools/build-models.mjs 한 뒤 node tools/models/dogfight-aircraft.mjs
- **PBR Street Props Pack (Game Ready)** — MadeByYeshe · CC-BY-4.0 · <https://sketchfab.com/3d-models/pbr-street-props-pack-game-ready-8013d8e6af4645d1a7c3d5b24054bfc8> (`skf-pbr-street-props/1/`, 1개)
  - 거리 소품(소화전·대형 쓰레기통·가로등 4 m·쓰레기통·콘·벤치·상자·쓰레기봉투·델리네이터·우체통·볼라드 3종·콘크리트 방벽·바퀴 달린 쓰레기통). 원본 단위 m. 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-pbr-street-props
- **Mixamo-rigged people & animation clips (Sketchfab)** — gbarzu, ustoopia, qsardor57913, jayb3e, Tim0, 00amza, Agor_, NABEEL619, trevBeat, Loves_Art, enzinogenie, Karthiknaidu97 · CC-BY-4.0 · <https://sketchfab.com (파일마다 meta.source → sources/skf-people.json)> (`skf-people/1/`, 20개)
  - Mixamo 리그 사람 14명(주인공 후보·경찰·경비·군인·깡패 2·시민 6·정장·기본 2)과 클립 파일 6개(권총·소총 대기/걷기/뛰기/조준, 주먹·발차기, 점프, 죽음, 앉기, 문 열기·훔치기·줍기·버튼, 근접 공격 등 46개). 뼈 이름은 Mixamo 표준(Hips, Spine, Spine1, Spine2, Neck, Head, Left/RightShoulder·Arm·ForeArm·Hand(+손가락), Left/RightUpLeg·Leg·Foot·ToeBase). 아마추어 변환을 Hips·메시에 구워 Hips 트랙 좌표계를 통일(Y 위, m). 키 meta.height, 발바닥 y=0, 앞 +Z. 클립은 아무 캐릭터에나 건다 — 캐릭터에 없는 뼈의 트랙은 걸러 내고, Hips position 은 hipsY 비율로 곱한다. 텍스처 WebP(주인공 768, 나머지 512 — 군중은 게임이 아틀라스로 묶는다), meshopt. 실제 사람 얼굴·경찰 제복 등은 각 게임이 맥락에 맞게 쓴다.
- **Mixamo-rigged people & animation clips (Sketchfab)** — gbarzu, sanaullahrais, ustoopia, qsardor57913, jayb3e, Tim0, 00amza, Agor_, NABEEL619, trevBeat, Loves_Art, enzinogenie, Karthiknaidu97 · CC-BY-4.0 · <https://sketchfab.com (파일마다 meta.source → sources/skf-people.json)> (`skf-people/2/`, 21개)
  - Mixamo 리그 사람 15명(주인공 후보 2(girl-suit·emma)·경찰·경비·군인·깡패 2·시민 6·정장·기본 2)과 클립 파일 6개(권총·소총 대기/걷기/뛰기/조준, 주먹·발차기, 점프, 죽음, 앉기, 문 열기·훔치기·줍기·버튼, 근접 공격 등 46개). 뼈 이름은 Mixamo 표준(Hips, Spine, Spine1, Spine2, Neck, Head, Left/RightShoulder·Arm·ForeArm·Hand(+손가락), Left/RightUpLeg·Leg·Foot·ToeBase). 아마추어 변환을 Hips·메시에 구워 Hips 트랙 좌표계를 통일(Y 위, m). 키 meta.height, 발바닥 y=0, 앞 +Z. 클립은 아무 캐릭터에나 건다 — 캐릭터에 없는 뼈의 트랙은 걸러 내고, Hips position 은 hipsY 비율로 곱한다. 텍스처 WebP(주인공 768, 나머지 512 — 군중은 게임이 아틀라스로 묶는다), meshopt. 실제 사람 얼굴·경찰 제복 등은 각 게임이 맥락에 맞게 쓴다.
- **slowpoly textured cars (BMW E46, Tesla Model S, Lancer Evo)** — slowpoly · CC-BY-4.0 · <https://sketchfab.com/3d-models/bmw-e46-1998-ecc42a37c7e2409b9fd05665512843ce , https://sketchfab.com/3d-models/tesla-model-s-plaid-2023-aec912ed367b4aebacc8676922f42beb , https://sketchfab.com/3d-models/mitsubishi-lancer-evolution-1997-7558ef08987d4a22bd317ac1fae12c1f> (`skf-slowpoly-cars/1/`, 3개)
  - 텍스처를 구운 1.4~1.5k 삼각형 승용차 3대(BMW E46 1998, Tesla Model S Plaid 2023, Mitsubishi Lancer Evolution 1997). 메시 하나(바퀴 안 돎) — 주차·배경 차량용. 실제 길이(m)에 맞췄고 길이 축을 z 로, 앞쪽 +Z 로 돌렸다(preview 로 확인). 실제 차 모양이라 상표 주의 — 게임 안 이름은 쓰지 않는다. 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-slowpoly-cars
- **Street Asset Pack** — vmatthew · CC-BY-4.0 · <https://sketchfab.com/3d-models/street-asset-pack-f3eb47d02e2e4ab290e66752fa354b48> (`skf-street-props/1/`, 1개)
  - 거리 소품(철제 바리케이드·콘크리트 방벽·빨간 방벽·콘·쓰레기통·드럼통·쓰레기봉투·상자·표지판 4종·볼라드). 원본이 실물의 약 2.4 배라 0.42 배(콘 0.7 m, 정지 표지 2.5 m). 소화전(9.7k 삼각형)·병·컵은 뺐다. 작은 소품이라 텍스처 512(부품 19개가 각자 PBR 4장을 가져 1024 면 11MB). 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-street-props
- **Trees & palms (Sketchfab, 4 packs)** — 99.Miles (forest), evan4129 (palms, snow pines), c3posw01 (Scots pines) · CC-BY-4.0 · <https://sketchfab.com/3d-models/low-poly-forest-tree-pack-5ff5a51e74324845a4e4905f182dfb2b , https://sketchfab.com/3d-models/palm-tree-pack-lowpoly-fd439b0f82c34497aabb21c68ad2fb34 , https://sketchfab.com/3d-models/snow-pine-tree-and-bush-pack-lowpoly-7afc4ca23dd84adea90dc0ba8506c500 , https://sketchfab.com/3d-models/scots-pine-trees-set-422b961ff3d14e7baa7e9077572b2247> (`skf-trees/1/`, 1개)
  - 도시 둘레·공원·현장용 나무: 활엽·침엽 숲 나무 4종 + 배경용 아틀라스 나무 6종(99.Miles Low Poly Forest Tree Pack), 야자 3종(evan4129), 눈 덮인 소나무 3종·마른 덤불(evan4129), 스코틀랜드 소나무 9종(c3posw01, 실제 수관 텍스처). 모두 m 단위·바닥 중심·library 부품. 높이 meta.size[1]. 잎은 alphaMode 가 있는 재질이면 alphaTest 로 쓰는 것이 빠르다. 2026-10-12: 사용자가 "도시 끝 나무가 이상하다"(ruins-kit 저폴리 나무를 2배로 키운 것)고 해서 만들었다. 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-trees
- **Truck/Van Pack** — Batuhan13 · CC-BY-4.0 · <https://sketchfab.com/3d-models/truckvan-pack-badbf04a75d6469ebcd5477ad39b0d4e> (`skf-vans/1/`, 6개)
  - 배달 밴 6색(그래피티 포함), 7.6k 삼각형, PBR 텍스처. 바퀴 노드 분리(원점이 바퀴 중심). 길이 5.5 m 로 맞췄고 앞쪽 +Z(앞바퀴가 +Z 쪽). 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-vans
- **Zhiguli Soviet Cars** — spacelynxcanfly · CC-BY-4.0 · <https://sketchfab.com/3d-models/zhiguli-soviet-cars-7c3f4bee5d37401d853d2206dc7859fc> (`skf-zhiguli-cars/1/`, 4개)
  - 낡은 소련 세단 4색(회색·파랑·초록·빨강), 약 1천 삼각형, PBR 텍스처 한 장. 바퀴가 몸체와 한 메시라 돌지 않는다 — 주차 차·배경 차량용. 원본 단위 m, 앞쪽 +Z 로 맞췄다(preview 로 확인). 원본: Sketchfab(CC Attribution 4.0 — 크레딧에 저자·주소 표시). 만드는 법: node tools/models/sketchfab.mjs fetch <uid> && node tools/models/sketchfab-packs.mjs build skf-zhiguli-cars

## texture

- **ambientCG City Ground Materials** — ambientCG (Lennart Demes) · CC0-1.0 · <https://ambientcg.com/> (`ambientcg-city/1/`, 29개)
  - 도시 지면용 ambientCG PBR 재질 8종(아스팔트·땜질 도로·콘크리트·판석·잔디·눈·진흙·숲 바닥). 모두 이음매 없이 반복(tileable). color 는 sRGB, normal(OpenGL 규약, +Y 위)·roughness·ao 는 선형. meta.tile_m 은 한 장이 덮는 실제 크기(m). 넓은 땅에 반복해 깔리므로 normal 은 512(ambientcg-mars 와 같은 이유). 처음 쓴 게임: VERDICT(verdict) — 절차 캔버스 지면 텍스처를 대체. 원본: asphalt=Asphalt010, road-patched=Road006, concrete=Concrete034, paving=PavingStones138, grass=Grass004, snow=Snow006, dirt=Ground054, forest-ground=Ground037.
- **ambientCG Mars Ground Materials** — ambientCG (Lennart Demes) · CC0-1.0 · <https://ambientcg.com/> (`ambientcg-mars/1/`, 16개)
  - 화성 지면용 ambientCG 사진측량 PBR 재질 4종(붉은 모래·바위 지면·자갈·절벽 바위). 모두 이음매 없이 반복(tileable). color 는 sRGB(three: colorSpace = SRGBColorSpace), normal·roughness·ao 는 선형. normal 은 OpenGL 규약(+Y 위, three 기본과 같음 — NormalGL 원본). meta.tile_m 은 원본 한 장이 덮는 실제 크기(m, ambientCG 가 밝힌 것만). WebP: color·roughness·ao 손실 q85, normal 은 near-lossless(40) — 손실 WebP 는 색차 4:2:0 이라 사진측량 노멀의 잔결이 뭉개져서(측정 각도 오차 평균 9~11°) near-lossless 를 쓰되, 지형에 반복해 깔리는 지면 노멀은 512 로 줄였다(장당 약 0.3MB). 색은 원본 그대로이며 게임이 필요하면 color 에 색을 곱해 쓴다. ao 는 aoMap 용(three r151+ 는 기본 uv 를 쓴다). 원본: red-sand=Ground026, rock-ground=Rocks011, gravel=Gravel025, cliff-rock=Rock029.
- **ambientCG Mars Ground Materials — lite** — ambientCG (Lennart Demes) · CC0-1.0 · <https://ambientcg.com/> (`ambientcg-mars-lite/1/`, 8개)
  - ambientcg-mars/1 에서 만든 가벼운 사본(tools/models/ambientcg-lite.mjs). <재질>-luma: color 의 선형 밝기(0.3R+0.59G+0.11B)를 sRGB 회색조로 — SRGBColorSpace 로 읽어 밝기만 쓰는 셰이더(MECH MARS 지형)용, 512. <재질>-normal-256: 노멀 256, near-lossless(40)(OpenGL 규약 +Y 위). 색이 필요하면 원본 팩의 color 를 쓴다. 처음 쓴 게임: MECH MARS(휴대폰 첫 로딩).
- **ambientCG Metal Materials** — ambientCG (Lennart Demes) · CC0-1.0 · <https://ambientcg.com/> (`ambientcg-metal/1/`, 9개)
  - 기체·기지용 ambientCG PBR 금속 재질 2종(벗겨지고 녹슨 흰 도장 금속, 리벳 박힌 금속 판). 이음매 없이 반복(tileable). color 는 sRGB, normal(OpenGL 규약, +Y 위)·roughness·metalness(·ao) 는 선형. 흰 도장은 게임이 color 에 색을 곱해 도색을 바꾸기 좋다. painted-metal-metalness 는 원본 그대로 전부 0(도장·녹 모두 비금속 — metalness=0 상수로 써도 같다), metal-plate-metalness 는 판=1·이음선=낮음. WebP: color·roughness·metalness·ao 손실 q85, normal near-lossless(40). 원본: painted-metal=PaintedMetal010, metal-plate=MetalPlates003.
- **Poly Haven HDRIs (sunset harbor, overcast city, city night)** — Poly Haven (Greg Zaal 외 — 파일마다 meta.authors) · CC0-1.0 · <https://polyhaven.com/hdris> (`polyhaven-hdri/1/`, 4개)
  - 장면 환경광·반사용 1k Radiance HDR 4장(각 1.1~1.5MB). three.js: RGBELoader 로 읽어 PMREMGenerator.fromEquirectangular → scene.environment(배경은 게임의 절차 하늘을 그대로 두고 반사·간접광만). equirect 가로 1024. 1k 는 반사·조명용이지 배경으로 크게 보이면 흐리다. 테마 대응: harbor-sunset=dusk, overcast-city=winter, city-night=neon, sunset-sky=예비. 만드는 법: node tools/models/polyhaven-hdri.mjs

## audio

- **City & Wilds Ambience** — 여러 저작자 — 파일별 meta.author (IgnasD, Kresiek The Furry, rubberduck, Wolfgang_, aquinn, Aj_, LokiF, isaiah658, bart, RandomMind, Rango Mango, Kenney, JaggedStone, Ogrebane, Vehicle, GameNow 합성) · CC0-1.0 · <https://opengameart.org> (`amb-city/1/`, 5개)
  - VERDICT(game_id verdict, ~/SRC/globalShadow — 어두운 영웅의 잠입·저격·탐험 액션) 용으로 만들었지만 어느 게임이든 쓸 수 있다. 환경음 루프 5종: 도시 낮(큰길 차 소리)·도시 밤(귀뚜라미·먼 차·먼 사이렌)·정글(늪·새·벌레·개구리)·항구 공업지대(물결·증기 기계·갈매기·먼 금속 쿵·배 고동)·동굴/유적(지하 공기·물방울·낮은 웅웅). 스테레오 mp3 128kbps, -20 LUFS 안팎·피크 -1.5 dBFS(배경에 깔도록 작게). OpenGameArt 의 CC0 현장 녹음을 길게 크로스페이드해 루프로 만들고(2초 등전력), 한 번씩 나는 소리(갈매기·사이렌·물방울 등)는 루프 안에 감아 넣어 이음매가 없다. 모자란 저역 웅웅·배 고동만 합성(meta.method). 루프는 meta.loopStart/loopEnd. 만드는 법: python3 -I tools/audio/build-audio-verdict.py amb-city
- **Mars Ambience** — 여러 저작자 — 파일별 meta.author (Luke.RUSTLTD, aquinn, sketchman3, gmason, mieki256, rubberduck, NenadSimic, pauliuw, GameNow 합성) · CC0-1.0 · <https://opengameart.org> (`amb-mars/1/`, 5개)
  - 화성 환경음(바람 약·강, 모래 폭풍, 먼 우르릉). 스테레오 mp3 128kbps, -18 LUFS 안팎·피크 -1.5 dBFS. 바람·폭풍 루프는 원본 녹음의 스펙트럼을 가진 원형 잡음과 주기 변조로 만들어 이음매가 원리상 없다(meta.loopStart/loopEnd). 옅은 대기 느낌으로 고역을 눌렀다. 합성 조합·가공물은 CC0. 만드는 법: python3 -I tools/audio/build-audio.py amb-mars
- **Agent Action SFX** — 여러 저작자 — 파일별 meta.author (EmoPreben, Kenney, bart, Ben Jaszczak, et al. (submitted by bart), NenadSimic, SpringySpringo, qubodup, rubberduck, artisticdude, Vehicle, Macro, Cough-E, EZduzziteh, GGBotNet, mikeask, looneybits, Rocha57, bonebrah, themightyglider, mieki256, FacadeGaikan, GameNow 합성) · CC0-1.0 · <https://opengameart.org> (`sfx-agent/1/`, 63개)
  - VERDICT(game_id verdict, ~/SRC/globalShadow — 어두운 영웅의 잠입·저격·탐험 액션) 용으로 만들었지만 어느 게임이든 쓸 수 있다. 잠입·저격 액션 효과음: 소음기 권총·권총·저격총(크게, 긴 메아리)·노리쇠·재장전·소총·기관단총 연사, 몸/콘크리트 피탄, 주먹·제압·쓰러짐·휘두름, 발소리(콘크리트 4·풀 2·흙 1)·점프·착지, 문·자물쇠·장치 딸깍, 키패드·해킹 진행/성공/실패, 경보 루프 2종, 자동차(시동·공회전/고회전 루프·급가속·문·경적·타이어 끽·충돌), 퍼즐 돌 끌림(한 번·루프)·돌 쿵, 유리 깨짐, 심장 박동 루프 2종(조준경 집중), 카메라 셔터(증거 사진). 무전(radio-beep·radio-squelch·radio-static-loop)은 sfx-ui 팩에 이미 있어 넣지 않았다. 모노 mp3, 0.4초 미만은 피크 -1.5 dBFS 기준(LUFS 상한), 나머지는 -16~-21 LUFS(meta.lufs). 앞 무음 없음 — 발사·타격이 0초에 시작한다. 총성은 The Free Firearm Sound Library(CC0, 실제 총 녹음: Mosin Nagant·AR-15·PPSh·Walther PPQ), 소음기는 EmoPreben·bart 녹음. 엔진·타이어 끽·키패드·클랙슨 등 마땅한 CC0 녹음이 없는 것은 numpy 합성(meta.method — 엔진은 실제 엔진 녹음의 스펙트럼을 질감으로 섞었다). 루프는 meta.loopStart/loopEnd(초, 디코딩 기준)로 AudioBufferSourceNode 에 넣는다. 엔진 루프는 playbackRate 로 회전수를 바꿔 쓰면 된다(idle 850rpm·rev 3600rpm). 원본은 전부 CC0(파일별 meta.author/source), 합성음·가공물도 CC0. 만드는 법: python3 -I tools/audio/build-audio-verdict.py sfx-agent
- **Agent Action SFX** — 여러 저작자 — 파일별 meta.author (Ben Jaszczak, et al. (submitted by bart), Kenney, NenadSimic, SpringySpringo, qubodup, rubberduck, artisticdude, Vehicle, Macro, Cough-E, EZduzziteh, GGBotNet, mikeask, looneybits, Rocha57, bonebrah, themightyglider, mieki256, bart, FacadeGaikan, GameNow 합성) · CC0-1.0 · <https://opengameart.org> (`sfx-agent/2/`, 63개)
  - VERDICT(game_id verdict, ~/SRC/globalShadow — 어두운 영웅의 잠입·저격·탐험 액션) 용으로 만들었지만 어느 게임이든 쓸 수 있다. 잠입·저격 액션 효과음: 소음기 권총·권총·저격총(크게, 긴 메아리)·노리쇠·재장전·소총·기관단총 연사, 몸/콘크리트 피탄, 주먹·제압·쓰러짐·휘두름, 발소리(콘크리트 4·풀 2·흙 1)·점프·착지, 문·자물쇠·장치 딸깍, 키패드·해킹 진행/성공/실패, 경보 루프 2종, 자동차(시동·공회전/고회전 루프·급가속·문·경적·타이어 끽·충돌), 퍼즐 돌 끌림(한 번·루프)·돌 쿵, 유리 깨짐, 심장 박동 루프 2종(조준경 집중), 카메라 셔터(증거 사진). 무전(radio-beep·radio-squelch·radio-static-loop)은 sfx-ui 팩에 이미 있어 넣지 않았다. 모노 mp3, 0.4초 미만은 피크 -1.5 dBFS 기준(LUFS 상한), 나머지는 -16~-21 LUFS(meta.lufs). 앞 무음 없음 — 발사·타격이 0초에 시작한다. 총성은 The Free Firearm Sound Library(CC0, 실제 총 녹음: Mosin Nagant·AR-15·PPSh·Walther PPQ), 소음기 권총(v2)은 실총 근접 녹음을 저역 통과·단축해 소음기처럼 만들었다(v1 의 EmoPreben·bart 실린서 녹음은 숨소리 같아 뺐다). 엔진·타이어 끽·키패드·클랙슨 등 마땅한 CC0 녹음이 없는 것은 numpy 합성(meta.method — 엔진은 실제 엔진 녹음의 스펙트럼을 질감으로 섞었다). 루프는 meta.loopStart/loopEnd(초, 디코딩 기준)로 AudioBufferSourceNode 에 넣는다. 엔진 루프는 playbackRate 로 회전수를 바꿔 쓰면 된다(idle 850rpm·rev 3600rpm). 원본은 전부 CC0(파일별 meta.author/source), 합성음·가공물도 CC0. 만드는 법: python3 -I tools/audio/build-audio-verdict.py sfx-agent
- **Critter SFX** — 여러 저작자 — 파일별 meta.author (cogitollc, EZduzziteh, rubberduck, Kenney, PWL, artisticdude, Vehicle, StarNinjas, bart, qubodup, Fupi, fvcalderan, MintoDog, GameNow 합성) · CC0-1.0 · <https://opengameart.org> (`sfx-critters/1/`, 43개)
  - PET PARADE 용 귀여운 만화 효과음(관에서 튀어나옴·명령 대답 삑·집 도착 딩·길 잃음 퐁·물·쿵·파기·뚫기·다리 놓기·폭탄·우산·벽 타기·호루라기·출구 딩동·UI·출발 3-2-1-GO·완료/실패 징글·별 1~3·경주 승리/패배·빨리 감기 루프). 아이용 — 폭력적인 소리 없음. 모노 mp3(징글은 스테레오), 0.4초 미만은 피크 -1.5 dBFS 기준(LUFS 상한), 나머지는 -16~-20 LUFS. 앞 무음 없음. 원본은 전부 CC0(Kenney·rubberduck·OpenGameArt 작가들, 파일별 meta.author/source), 원본이 없는 성분(호루라기·초읽기 삑·연기 퍼프 등)은 numpy 합성(meta.method). 가공물·합성음은 CC0. 루프는 meta.loopStart/loopEnd(초, 디코딩 기준). 만드는 법: python3 -I tools/audio/build-audio-petparade.py sfx-critters
- **Science Lab Puzzle SFX** — 여러 저작자 — 파일별 meta.author (Kenney, cogitollc, CleytonKauffman, BMacZero, rubberduck, Vehicle, AntumDeluge (Freesound CC0 sources: d.n.audio.uk, Gniffelbaf), OO, EZduzziteh, GameNow 합성) · CC0-1.0 · <https://opengameart.org> (`sfx-lab/1/`, 28개)
  - EUREKA LAB(과학 퍼즐) 효과음: 부품 놓기·돌리기·빼기, 실행 스위치, 레이저(지속음·닿음·갈라짐·센서), 전기(웅·합선·전구 켜짐/터짐·부저·모터), 구슬(구르기·튀김·부딪힘·스프링·벨·컵), 화학(액체 흐름·보글보글·탄산·풍선·유리·버너), 성공 스팅어·힌트. 모노 mp3 96kbps. 한 번 소리 목표 -16~-19 LUFS(작은 틱·딸깍·힌트는 -19~-20), 0.4초 미만 짧은 소리는 피크 -1.5 dBFS 기준(1.6초로 채워 잰 LUFS 라 -20~-30 으로 낮게 나오지만 들리는 크기는 비슷), 크레스트가 큰 소리(종·유리·거품)는 리미터 한계(4 dB) 때문에 목표보다 1~3 dB 낮다. 지속음 루프는 -20 LUFS(배경으로 깔리게). 피크 -1.5 dBFS 아래, 앞 무음 없음. 루프(*-loop)는 meta.loopStart/loopEnd(초, 디코딩 기준)를 AudioBufferSourceNode.loopStart/loopEnd 에 넣는다. 원본은 전부 CC0(Kenney·rubberduck·BMacZero·CleytonKauffman·OO·AntumDeluge·Vehicle·PWL·EZduzziteh 등 OpenGameArt 작가들, 파일별 meta.author/source). 원본이 없는 성분(레이저·전기 웅, 모터, 부저, 탄산, 아르페지오 등)은 numpy 로 합성(meta.method). 가공물·합성음은 CC0. sfx-ui(ui-click/confirm/back/error)·sfx-critters(pop·splash·countdown·clear/fail 징글·star)와 겹치지 않게 실험실 고유 소리만 담았다. 만드는 법: python3 -I tools/audio/build-audio-eureka.py sfx-lab
- **Mech Body SFX** — 여러 저작자 — 파일별 meta.author (hc, Thimras, Kenney, rubberduck, 0new4y, qubodup (sources: Ferdinger, John Sipos, klankbeeld), qubodup, EZduzziteh, Cough-E, Spring Spring, Kresiek The Furry, GameNow 합성) · CC0-1.0 · <https://opengameart.org> (`sfx-mech/1/`, 21개)
  - 메크 몸 소리(발소리·착지·서보·유압·점프 제트·부스트·경보·셧다운/재기동·록온·부위 파괴). 모노 mp3, -16 LUFS 안팎·피크 -1.5 dBFS, 앞 무음 없음. 루프는 meta.loopStart/loopEnd(초, 디코딩 기준)로 AudioBufferSourceNode 에 넣는다. CC0 원본(Kenney·qubodup·Thimras·hc 등)을 잘라 겹치고, 마땅한 원본이 없는 성분은 numpy 로 합성했다(meta.method). 합성음과 가공물은 이 저장소가 CC0 로 낸다. 만드는 법: python3 -I tools/audio/build-audio.py sfx-mech
- **Military UI SFX** — 여러 저작자 — 파일별 meta.author (Kenney, wobbleboxx, NenadSimic, Kresiek The Furry, GameNow 합성) · CC0-1.0 · <https://opengameart.org> (`sfx-ui/1/`, 11개)
  - 메뉴·HUD 소리(클릭·포커스·확인·뒤로·오류·해금 징글·임무 완수/실패 스팅어·무전). 모노 mp3. 아주 짧은 소리는 피크 -1.5 dBFS 기준, 나머지는 -16~-18 LUFS. 무전 잡음 루프는 실제 무전기 잡음(8kHz 녹음)이라 대역이 좁다. 합성음·가공물은 CC0. 만드는 법: python3 -I tools/audio/build-audio.py sfx-ui
- **Mech Weapons SFX** — 여러 저작자 — 파일별 meta.author (Ben Jaszczak, et al. (submitted by bart), qubodup, Kenney, mikeask, rubberduck, EZduzziteh, Thimras, BMacZero, yd, joth, Spring Spring, GameNow 합성) · CC0-1.0 · <https://opengameart.org> (`sfx-weapons/1/`, 23개)
  - 메크 무기 소리(오토캐논·펄스 레이저·레일건·산탄포·미사일·로켓·박격포·금속 피격·도탄·폭발 소/중/대·파편). 모노 mp3, -16 LUFS 안팎·피크 -1.5 dBFS. 총성은 The Free Firearm Sound Library(CC0)를 느리게(무겁게) 하고 저역 쿵을 합성해 얹었다. 레일건 충전 루프는 끝없이 올라가는 셰퍼드-리셋 음이라 충전 시간과 상관없이 이어 틀 수 있다. 합성음·가공물은 CC0. 만드는 법: python3 -I tools/audio/build-audio.py sfx-weapons

## music

- **Frontier War Music** — 여러 저작자 — 파일별 meta.author (mrpoly, Emma_MA, cynicmusic, sperrylion (remix of "Predynastic Dawn" by Bobjt), vitalezzz, iamoneabe, nene, CleytonKauffman) · CC0-1.0 · <https://opengameart.org> (`music-frontier/1/`, 9개)
  - 배경음악(메뉴 1·전투 5·보스 1·승리/패배 스팅어). 전부 OpenGameArt 의 CC0 곡. 스테레오 mp3 128kbps, -18 LUFS 안팎·피크 -1.5 dBFS. 루프 곡은 meta.loopStart/loopEnd(초, 디코딩 기준)로 이어 튼다(원본이 루프인 곡은 통째로, 끝 이음매가 튀는 곡은 짧게 크로스페이드). 만드는 법: python3 -I tools/audio/build-audio.py music-frontier
- **Lab Puzzle Music** — 여러 저작자 — 파일별 meta.author (CleytonKauffman, Brandon75689, Ruskerdax, isaiah658) · CC0-1.0 · <https://opengameart.org> (`music-lab/1/`, 4개)
  - EUREKA LAB 배경음악(메뉴·실험 1·실험 2·온라인 경주). 전부 OpenGameArt 의 CC0 곡(파일별 meta.title/author/source). 잔잔하고 호기심 어린 분위기 — 보사노바(메뉴), 마림바·피아노(실험 1), DX-7 전자 피아노 퍼즐곡(실험 2), 밝고 빠른 곡(경주). 스테레오 mp3 128kbps, -16 LUFS 안팎·피크 -1.5 dBFS. 모두 루프 — meta.loopStart/loopEnd(초, 디코딩 기준)로 AudioBufferSourceNode 에 넣는다. 곡 안에서 같은 박자 자리 두 점(특징 유사도로 찾고 파형 상관으로 샘플 단위 정렬)을 골라 그 사이만 잘라 짧게 크로스페이드했다(인트로·아웃트로 뺌, meta.description). 만드는 법: python3 -I tools/audio/build-audio-eureka.py music-lab
- **Meadow Music** — 여러 저작자 — 파일별 meta.author (cynicmusic, CleytonKauffman, Emma_MA, Spring Spring, Zane Little Music) · CC0-1.0 · <https://opengameart.org> (`music-meadow/1/`, 6개)
  - PET PARADE 배경음악(메뉴·풀밭·동굴·눈·용암·온라인 경주). 전부 OpenGameArt 의 CC0 곡(파일별 meta.title/author/source). 스테레오 mp3 128kbps(용암은 원곡이 모노), -16 LUFS 안팎·피크 -1.5 dBFS. 모두 루프 — meta.loopStart/loopEnd(초, 디코딩 기준)로 AudioBufferSourceNode 에 넣는다. 원곡이 루프인 곡은 통째로, 끝이 잦아드는 곡은 박자로 자르고 꼬리를 처음에 겹쳤고, 긴 곡은 같은 자리 두 점 사이만 잘라 짧게 크로스페이드했다(meta.description). 만드는 법: python3 -I tools/audio/build-audio-petparade.py music-meadow
- **Shadow Noir Music** — 여러 저작자 — 파일별 meta.author (Ruskerdax, Lisboa, Umplix, Samza, Sudocolon, sperrylion, qubodup (remix of "Shrine" by yd), SterlingRay, Joth, Kresiek The Furry, Kenney) · CC0-1.0 · <https://opengameart.org> (`music-shadow/1/`, 12개)
  - VERDICT(game_id verdict, ~/SRC/globalShadow — 어두운 영웅의 잠입·저격·탐험 액션) 용으로 만들었지만 어느 게임이든 쓸 수 있다. 배경음악: 누아르 재즈 메뉴, 잠입 2곡, 추격, 전투(어두운 액션), 유적 2곡 + 스팅어(승리·실패·불길한 발견·짧은 색소폰 실패/단서). 전부 CC0(OpenGameArt 작곡가들·Kenney — 파일별 meta.title/author/source). 스테레오 mp3 128kbps(잠입 1은 112kbps, 잠입 2는 원곡 클리핑 때문에 160kbps), -17 LUFS 안팎(잔잔한 곡·스팅어 -18~-19)·피크 -1.5 dBFS. 루프 곡은 meta.loopStart/loopEnd(초, 디코딩 기준)로 이어 튼다: 원곡이 루프인 곡은 통째로, 긴 곡은 곡 안에서 가장 닮은 두 점 사이만 잘라 짧게 크로스페이드했다(meta.description 에 원곡 구간). 스팅어는 루프가 아니다. 만드는 법: python3 -I tools/audio/build-audio-verdict.py music-shadow
- **Moonlake Fishing Audio** — CleytonKauffman, RandomMind, jcpmcdonald · CC0-1.0 · <https://opengameart.org> (`fishing-audio/1/`, 4개)
  - Moonlake 낚시 BGM, 호수 환경음, 물 효과음. 원본 및 파일별 저작자는 gamenow-assets/sources/fishing-audio.json 에 기록.
- **Animated Fish Pack Models** — Quaternius · CC0-1.0 · <https://opengameart.org/content/animated-fish> (`fishing-models/1/`, 5개)
  - Moonlake 어종별 3D 물고기와 가오리·상어. 원본 OBJ/MTL, 라이선스 및 변환 내역은 gamenow-assets/sources/fishing-models.json 에 기록.

- **Table Curling Impacts** — Kenney · CC0-1.0 · <https://kenney.nl/assets/impact-sounds> (`sfx-curling/1/`, 5개)
  - Selected, filtered and level-adjusted samples from Impact Sounds 1.0. Three collision variants, a soft release and an end bell. No synthesized fallback. Listening acceptance pending.

- **Curling Stone** — ADMA200 · CC-BY-4.0 · <https://sketchfab.com/3d-models/curling-cartoon-tiger-and-ball-382f4534a1c24b4dacd011378a2a6359> (`curling-stone/1/`, 3개)
  - Static Body/Handle geometry from the attributed ShenMian/curling mirror at e8d002daeeb7ce9a93de640153e501a364f24afe. Original materials replaced with solid PBR; normalized to 0.29 m diameter. No source textures or embedded scripts retained.
