아트 디렉션 - kyhsa93/karda GitHub Wiki

아트 디렉션

작성: 아트 디렉터(AD), 2026-10-03. 최종본(디렉터 조율 3라운드 반영, 12장 조율 상태). 기준 코드 4e4fd93(~/workspace/hg-directors, main 4dc02f4와 같은 코드). 근거 화면은 이번 라운드에 헤드리스 Chromium(SwiftShader, 소프트웨어 렌더)으로 직접 찍었다. ?debug의 window.__flight로 sim을 멈추고 스텝해 장면을 만들었다. 데스크톱 1280×720, 모바일 844×390(hasTouch). 원본은 조율 폴더 shots-ad/, 작게 줄인 근거는 이 위키 images/hg-ad-*.png. "(계산)"은 투영 공식으로 낸 값이고, "(추정)"은 측정 근거가 없는 값이다.


1. 요약

  1. 표식이 꺼지면 피아를 구별할 수 없다. 100m, 조준(ADS) 상태에서 연합·VPA 분대와 전차를 나란히 세워도 색과 모양이 같게 읽힌다(그림 3). 300m에서는 보병이 4px(데스크톱 ADS), 1.4px(모바일 비조준)다(계산). 두 군복은 명도가 거의 같고(L* 43 vs 46), 차이의 대부분이 적-녹 축(a*)이라 적록색약에게는 남는 차이가 없다.
  2. 설계에 있는 피아 모양 구분이 구현되지 않았다. 12장의 어깨 표식(■/▲), 4.5절의 VPA 전차 코드 부품이 코드에 없다. 헬멧/모자 차이는 120m 안(근거리 LOD)에서만 보인다.
  3. 색 체계가 둘이다. HUD는 상대색(아군 시안 #4cc9f0, 적 주황 #ff9f1c)을 쓰고, 3D 깃발은 절대색(연합 파랑 #3d7bd9, VPA 빨강 #d94b3d)을 쓴다. VPA로 하면 내 거점 깃발이 빨갛다.
  4. 보병 1인칭에서 가장 무거운 덩어리는 내 소총이다. 검은 블록 소총이 화면의 약 3.7%를 거의 검은색(휘도 < 45)으로 덮는다. 같은 구도에서 소총이 없으면 2.4%, 있으면 6.1%다. 조종석(그림 5)과의 품질 차이가 가장 크게 보이는 곳이다.
  5. 라이선스 고지가 셋 빠져 있다(위반 소지). 빌드에 three.js·React(MIT) 저작권 고지가 없고, 글꼴(OFL) 서브셋에서 라이선스 이름 레코드(name ID 13·14)가 지워졌으며 OFL 전문도 함께 배포되지 않는다. CC-BY 3.0 모델 4개는 크레딧에 라이선스 URI가 없다. 외부 에셋 출처 자체는 깨끗하다. 7장 참고.
  6. 이름과 입구. 홈 화면 이름 "헬기 조종", 아이콘은 헬기장 "H", 타이틀은 큰 글자 "아파치"다. AD는 **"카르다 전선"**에 동의한다. 아이콘에는 글자도 헬기도 넣지 않는다. 9장 참고.

2. 읽혀야 하는 순서

전장의 한 프레임에서 눈이 가야 하는 순서는 다음과 같다. 앞의 것일수록 더 밝고, 더 채도가 높고, 더 움직이고, 더 가운데에 있어야 한다.

순서 무엇 왜 이 순서인가 시각 수단
1 위협: 나를 쏜 방향, 나를 겨눈 미사일, 시야 안 가까운 적 1초 안에 반응해야 하고, 늦으면 생애가 끝난다(P4′) 위협 전용색 #ef476f(다른 곳에 쓰지 않는다), 화면 가운데 둘레, 움직임
2 피아: 저것이 우리 편인가 쏘기 전에 판단해야 한다. 표식이 없을 때도(P3′) 가까운 거리에서는 외형으로 답해야 한다 근거리는 외형 명도와 실루엣, 원거리는 발견 표식(◆)만
3 거점과 전선: 어디로 가야 하나, 누가 밀고 있나 게임의 동사가 "전선을 민다"다(브리프 2.1) 깃발, 지면 경계, 거점 라벨(■▲○×)
4 내 상태: 체력, 탄, 자세, 티켓 위협을 본 다음에 확인한다. 항상 같은 자리에 둔다 모서리, 낮은 대비, 위험할 때만 강조
5 세계: 하늘, 원경, 소품 분위기를 만들지만 정보와 경쟁하면 안 된다 낮은 채도, 안개

지금 화면의 실제 순서 (픽셀 기준)

  • 데스크톱 보병(그림 1): ① 화면 오른쪽 아래의 검은 소총(가장 크고 어두운 덩어리), ② 노란 테두리의 코치 상자, ③ 주황 거점 라벨 "G 3.3km". 적은 발견 표식이 없으면 순위에 들지 못한다. 위협(붉은 호)은 맞았을 때만 1.5초 나타난다.
  • 모바일 보병(그림 2): ① 빨간 발사 버튼, ② 노란 이동 스틱, ③ 상단 노란 코치 상자. 채도가 가장 높은 세 요소가 모두 조작 UI다. 세계와 위협보다 버튼이 먼저 읽힌다.
  • 조종석(그림 5): 초록 IHADSS 기호가 가장 먼저 읽히고, 다음이 MPD다. 조종석은 위계가 정리되어 있다. 캠페인 시절 다듬은 결과다.

3. 피아·위협·거점의 시각 언어 (브리프 AD 질문 2)

3.1 지금 규칙 (코드 기준)

요소 색 모양 출처
HUD 아군/적 시안 #4cc9f0 / 주황 #ff9f1c (상대: 내 편이 시안) 거점 ■ 연합 · ▲ VPA · ○ 중립 · × 교전 (절대) ui/battle/hud/symbols.ts
아군 표식 시안 ▼, 탈것 3km·보병 200m 안 분대(유닛)당 하나, 머리 위 BattleHud.tsx
적 표식 주황 ◆, 발견된 것만(P3′) spotting.markers
3D 깃발 연합 파랑 #3d7bd9 / VPA 빨강 #d94b3d (절대) 연합 사각 · VPA 삼각 render/battle/flags.ts
군복 연합 올리브 #5d6b3e·장비 #3f4a2b / VPA 회갈 #7a6a55·장비 #4d4234 근거리 LOD: 연합 헬멧 · VPA 모자. 중·원거리 LOD는 같은 상자 render/battle/uniform.ts, puppets.ts
차량 같은 GLB에 인스턴스 색을 곱한다: 연합 (1.35, 1.2, 0.95) / VPA (0.9, 0.92, 0.88) 같은 모델 render/unitRenderer.ts
피격 방향 #ef476f 호 BattleHud.tsx
모바일 발사 버튼 #ef476f 반투명 styles.css .tbtn.fire

3.2 측정: 표식 없이 구별되나

대상의 화면 크기 (계산). 보병 1인칭 카메라의 세로 시야는 비조준 80°, 조준 55°다(viewmodel.ts). 키 1.8m인 보병과 길이 약 7m인 전차(추정)를 기준으로 했다.

거리 보병 · 데스크톱 비조준 보병 · 데스크톱 조준 보병 · 모바일 비조준 보병 · 모바일 조준 전차 길이 · 데스크톱 조준
100m 7.7px 12.4px 4.2px 6.7px 48px
300m 2.6px 4.1px 1.4px 2.2px 16px
600m 1.3px 2.1px 0.7px 1.1px 8px

스크린샷. 같은 지면에 연합 분대·전차(왼쪽)와 VPA 분대·전차(오른쪽)를 100·300·600m에 세우고 찍었다.

100m 조준: 왼쪽 연합, 오른쪽 VPA 그림 3. 100m, 데스크톱 조준(55°), 가운데를 3배 확대. 시안 ▼가 붙은 쪽이 아군이다. 표식을 가리면 두 분대와 두 전차는 같은 어두운 막대와 덩어리로 보인다.

300m 조준 그림 4. 300m, 같은 조건. 보병은 몇 픽셀짜리 어두운 눈금이고, 전차는 어두운 얼룩이다. 색으로는 구별되지 않는다.

색 차이 (계산, CIELAB). 두 군복의 ΔE76은 19다. 그러나 명도 L*는 43 대 46으로 거의 같고, 차이는 a*(−13.5 대 +2.9, 녹-적 축)에 몰려 있다. 그래서 다음 세 경우에 차이가 사라진다.

  • 작은 픽셀: 몇 픽셀짜리 대상은 색상보다 명도로 읽힌다.
  • 안개·역광: 색상이 먼저 빠진다.
  • 적록색약(남성의 약 8%, 일반 통계): a* 축 차이를 못 본다.

모양 차이. 헬멧(반구)과 모자(상자+챙)의 차이는 근거리 LOD(< 120m)에만 있다. 위 표에서 100m 조준 상태의 머리는 약 2px다. 12장 12.7의 "어깨 표식 사각/삼각"과 4장 4.5의 "VPA 전차 포탑 위 코드 부품", "VPA 장갑차 측면 장갑판"은 코드에 없다(puppets.ts 부위 목록, unitRenderer.ts). 지금 차량의 피아 차이는 색 곱셈뿐이다.

판정. 300m 이상에서는 외형으로 피아를 가르는 것이 화면 해상도상 불가능하다. P3′(발견해야 표식이 붙는다)가 그 거리를 맡는 것이 맞다. 문제는 100m 안이다. 이 거리는 보병이 실제로 교전하는 거리인데, 지금은 표식이 없으면 아군을 쏘게 된다.

3.3 규칙 (제안)

  1. 색은 상대, 모양은 절대. 색은 "우리 편/적"(시안/주황)을 말하고, 모양은 "어느 진영"(■ 연합 / ▲ VPA)을 말한다. HUD는 이미 이렇게 한다(08장 8.3 거점 기호). 3D 깃발도 상대색으로 바꾼다(모양은 사각/삼각 그대로). VPA 플레이어에게 내 깃발이 빨간 문제가 사라지고, 빨강 계열을 위협 전용으로 비워 둘 수 있다.
  2. 외형의 피아는 명도로 가른다. 두 군복의 L* 차이를 15 이상으로 벌린다. 예: 연합은 어두운 올리브(L* 약 35), VPA는 밝은 모래색(L* 약 55). 차량 인스턴스 색도 같은 방향(연합 어둡게, VPA 밝게)으로 맞춘다. 명도는 작은 픽셀, 안개, 색약에서도 남는다. D8(수치 대칭, 외형만 다름)과 충돌하지 않는다. 다만 밝은 쪽이 배경에서 더 잘 보일 수 있어 은폐에 비대칭이 생긴다. 이것은 하니스로 볼 수 없다. 봇의 탐지는 색을 보지 않는다(TD 확인). 그래서 **사람 관문(11장 5번)**에서 확인한다. 색을 고를 때는 두 색과 하레크 지면 평균 명도의 차이가 같아지도록 맞추는 것을 목표로 하고, 고른 값을 숫자로 남긴다. 사람 관문에서 비대칭이 보고되면 명도 차를 줄이고 머리 모양·어깨 표식 쪽으로 무게를 옮긴다(CD·AD 합의).
  3. 실루엣 하나를 중거리까지 유지한다. 머리 모양(헬멧/모자)을 중거리 LOD(120500m)의 midHead까지 내린다. 어깨 표식은 설계대로 근거리에 넣는다. 전차·장갑차의 VPA 코드 부품은 4.5절대로 넣는다. 부품은 유형별 인스턴스 메시 1개로 만들고, 머리 모양은 기존 LOD 부위에서 분기한다. 드로우콜은 합계 +34다(TD 추정).
  4. 원거리(300m 이상)는 외형 식별을 약속하지 않는다. 그 거리는 발견 표식(◆)의 몫이라고 문서에 명시한다. 그래야 아무도 원거리 외형에 예산을 쓰지 않는다. 같은 이유로 모바일 low에서 원거리 LOD 인형(500~1500m)을 끄는 것(TD-7 대안)에 동의한다. 모바일 비조준에서 600m 보병은 0.7px다. 참고로 지금 렌더러에는 그림자 맵 패스가 없어(shadowMap·castShadow 0건) "그림자 끔"으로 줄일 비용은 없다.
  5. 위협색은 하나만 쓴다. #ef476f는 피격 방향, 미사일 경고, 위험 체력에만 쓴다. 모바일 발사 버튼에서는 뺀다(중립 반투명 + 흰 테두리). 지금은 화면에서 가장 붉은 것이 늘 내 버튼이라 위협 신호가 묻힌다.
  6. 아군 표식은 사람 단위로 보이지 않아도 된다. 대신 분대의 위치와 맞아야 한다. ▼가 분대 중심 머리 위 한 점이라, 흩어진 분대에서는 표식 없는 대원이 생긴다. 근거리(< 50m)에서는 대원마다 작은 표식을 붙이는 것을 검토한다(드로우콜이 아니라 2D 캔버스 비용).

3.4 거점 (CD-5 응답)

  • 지금 거점은 깃발 하나와 2D 라벨이다. 지면에 원 경계가 없다. 보병 1인칭에서는 "원 안에 들어왔다"를 화면으로 알 수 없고, 코치 문장만 알려 준다.
  • 지면 링만으로는 부족하다(라운드 2에서 고침). 눈높이 1.6m에서 150m 떨어진 땅은 수평선 아래 약 4.6px에 붙어 보이고, 폭 1m 링의 화면 두께는 0.03px다(계산, 데스크톱 비조준 429px/rad). CD-5의 기준("원 밖 150m에서 경계가 읽힐 것")을 지면 그림으로는 지킬 수 없다.
  • 제안: 원 둘레 약 15m 간격으로 높이 1.2m 경계 말뚝을 세우고 상대색 띠를 두른다. 150m에서 말뚝 하나는 약 3.4px 높이이고, 줄지어 서면 경계로 읽힌다(계산). 깃발 기둥 인스턴스를 재사용해 드로우콜 +1로 만든다. 지면 링은 40m 안에서만 보조로 쓴다. 깃발 높이는 이미 점령 진행을 나타낸다(flags.ts lift).
  • HUD: 점령 바 안에 내 몫을 내 색 칸으로 따로 칠하고 그 위에 플레이어 표식 하나를 둔다. 원 안 아군 분대 수는 ▼ + 숫자로 쓴다. 자동 집중 거점(CD-3)이 걸리면 미니맵의 아군 화살표가 1.5초 깜박인다.
  • 지명(CD 7.2): 화면 표식은 두 진영 모두 거점 문자 + 모양으로 같게 둔다. 지명은 무전과 경기 끝 화면에서만, 처음 나올 때 문자를 붙여 쓴다(예: "레이더 고지(D)").

3.5 소음: 지형 점선

지형 이음새 그림 6. 경사면의 삼각형 모서리를 따라 어두운 점선이 보이고, 도로에는 가로 띠가 보인다. 3배 확대.

이 점들은 300600m에 있는 보병과 크기와 색이 같다(12px, 어두움). 실제로 생긴다면 피아 식별 이전에 "사람인가 아닌가"부터 흐려진다. TD 판정(AD-2)으로 둘로 나뉘었다.

  • 도로 가로 띠는 기하 문제다. 도로 삼각형 6,912개 중 23.2%에서 지형이 도로 위로 솟고, 최대 2.37m다(TD 실측). 실제 GPU에서도 생긴다. 고치는 방법은 TD가 고른다. AD 완료 조건은 100m 앞 도로가 끊김 없는 한 줄로 보이는 것이다. 도로는 길을 고르는 단서(P2)다.
  • 경사면 점선은 로그 깊이 버퍼를 끈 헤드리스 재촬영과 소유자 기기 스크린샷 한 장(#101 때)으로 확정한다. 소유자 기기에서 안 보이면 헤드리스 전용으로 기록한다. #182도 같은 방법으로 분리한다.

4. 스타일과 팔레트

4.1 스타일 (유지)

"단색 저폴리, 질감은 지면에만." 10장 10.1의 기준(사진 질감·치비·장난감 색감 제외)을 그대로 유지한다. 근거는 셋이다. 채택 모델(KolosStudios·Quaternius)이 이미 이 스타일이고, 코드 모델과 섞어도 티가 나지 않으며, 무캐시 PWA라 질감 한 장이 매 실행 비용이 된다.

4.2 팔레트 토큰

토큰 값 쓰는 곳 쓰지 않는 곳
작전실 바탕 #0b1320 메뉴, 패널 바탕, 아이콘 바탕 3D 세계
강조 #ffd166 메뉴의 주 버튼, 타이틀 부제, 코치 테두리 진영·위협
아군 #4cc9f0 아군 표식, 내 거점, 내 티켓, 3D 깃발(제안) 조작 버튼
적 #ff9f1c 발견된 적, 적 거점, 적 티켓, 3D 깃발(제안) 조작 버튼
중립 #e8eef7 중립 거점, 일반 글자
위협 #ef476f 피격 호, 미사일 경고, 위험 체력 발사 버튼(제안: 뺀다), 진영
조종석 기호 IHADSS 초록 아파치 조종석 안 그 밖

규칙: 채도가 높은 색은 정보에만 쓴다. 조작 UI는 무채색 반투명으로 둔다. 코치 문장 안의 "■ 아군"은 지금 강조색(노랑)으로 그려지는데, 아군색(시안)으로 그려야 한다(그림 1·2의 코치 상자).

4.2a 지형 색은 통행을 말한다

경사에 따라 바위색을 칠하는 지형 셰이더(terrainChunks.ts)는 정점 색 기준 약 31°부터 섞여 약 46°에서 완전한 바위가 되고, 디테일 맵 기준 약 26°→46°다. 지금 보병 한계는 35°(movement.ts)라 그 경사의 바위 비중이 정점 색 약 25%, 디테일 맵 약 36%다. 즉 풀처럼 보이는데 못 오르는 경사가 있다. TD의 #187 옵션 (a) 45°에서는 정점 색 약 92%, 디테일 맵 거의 100%라 "바위 = 못 오름"이 화면과 맞는다(계산). 규칙: 못 가는 곳은 바위·절벽 색이어야 한다. 맵 쪽에서 막는 구간도 같은 규칙으로 칠한다(풀 색의 보이지 않는 벽 금지).

4.3 탈것 6종과 전투기의 스타일 규칙 (브리프 AD 질문 3, TD-5·TD-7 응답)

  1. 형태. 상자·원기둥·쐐기로 만든 블록 저폴리, 평면 셰이딩, 질감 없음. 비례는 채택 KolosStudios 전차·트럭에 맞춘다. 같은 장면에서 섞이기 때문이다.
  2. 재질은 모델당 2개 이하(차체와 어두운 부품). 진영 색은 재질이 아니라 인스턴스 색으로 칠한다. TD-7을 받아들인다.
  3. 실루엣 우선. 분류끼리는 측면 실루엣이 달라야 한다(포신 길이, 포탑 유무, 바퀴/궤도, 차고). 진영끼리는 부품 하나와 명도 차이(3.3의 2)로 구분한다. 모델을 하나 만들 때마다 검사로 측면 실루엣 6종을 한 장에 나란히 렌더해 눈으로 확인한다.
  4. 안에서 보는 것은 코드로 만든다(5장). 조종석과 뷰모델은 그 탈것의 지연 청크에 함께 넣는다. 전투기·수송 헬기의 조종석은 프레임과 게임식 HUD(D3)까지만 만든다. 아파치 수준의 계기는 만들지 않는다.
  5. 채택 GLB와 섞을 때. 로드한 뒤 공용 재질로 바꾸고(10.8의 5), 질감은 버리거나 128px 이하로 줄인다. GLB가 없거나 로드에 실패하면 같은 실루엣의 코드 모델로 폴백한다.
  6. 용량. 코드 모델은 모델당 3KB gzip 이하를 목표로 하고(TD-5), 탈것별 지연 청크에 넣는다. 그러면 첫 출격 비용이 0이다. GLB는 경기당 지연 에셋 예산에서 쓴다. 어느 쪽이든 첫 출격 경로에는 넣지 않는다.

5. 아파치가 빠진 뒤 "자기 기체는 코드로" 결정의 의미

원래 결정(10장 10.2, 2026-09-29). 자기 기체 아파치의 외형·조종석·계기는 코드로 만든다. 이유는 셋이었다.

  • 조종석 안에서 보이는 날개·무장·로터가 외형과 일치해야 한다.
  • 쓸 수 있는 아파치 조종석 모델이 없다.
  • 깨끗해 보이는 아파치 모델 다수가 게임 추출물이었다(42manako, thomas333 등. 10장 "쓰면 안 되는 것").

지금(D13 이후). 아파치 콘텐츠는 빠졌지만 기체는 탈것 8종 중 하나로 남았다. 플레이어의 "자기 몸"은 이제 하나가 아니다. 돌격병, 아파치, 그리고 B3~B7에 들어올 병과·탈것이 모두 자기 몸이다. 결정의 핵심 이유인 "안에서 보이는 것과 밖의 모습이 일치해야 한다"는 그대로 유효하다. 그래서 결정을 이렇게 일반화하는 것을 제안한다.

플레이어가 1인칭으로 "안에서" 보는 것(무기 뷰모델, 조종석, 계기, 조준경 화면)은 코드로 만든다. "밖에서" 보는 외형은 플레이어가 타든 봇이 타든 같은 모델을 쓰고, 채택 GLB여도 된다.

이 일반화가 뜻하는 것은 다섯 가지다.

  1. 보병 뷰모델 4종(소총·기관총·저격소총·로켓 발사기)은 코드로 만든다. 16장의 "1인칭 무기 뷰모델 외부 에셋(선택)"은 내려놓는 것을 권한다. 무기를 쥔 손과 소매가 진영 색 인형(uniform.ts)과 일치해야 하기 때문이다.
  2. 아파치 외형은 플레이어 기체와 봇·아군 기체가 같은 코드 모델을 쓴다(M5-4 윙맨 결정의 연장). A5(Sketchfab 쓰지 않음) 아래에서는 바꿀 이유가 없다.
  3. 아파치 조종석은 이 게임에서 가장 비싼 그림이다. TD 실측으로 아파치 전용 코드는 원본 약 85KB이고, 연합에서 헬기를 고른 사람만 본다. 이 수준을 다른 탈것의 기준으로 삼지 않는다. 대신 보병 1인칭을 "최저선"으로 끌어올린다(6장).
  4. 코드 원칙은 출처 위험을 막는 장치이기도 하다. 군용기 모델은 추출·재업로드 비율이 높았다. 자기 몸을 코드로 만들면 그 위험이 게임의 얼굴에 닿지 않는다.
  5. "자기 기체 = 아파치"라는 전제로 쓴 문장(CLAUDE.md "자기 기체 아파치 외형·조종석·계기는 계속 코드로")은 위 일반형으로 고쳐 쓰는 것을 제안한다. 문서 수정은 GD 정리 후에 한다.

6. 첫 화면: 보병 1인칭과 조종석의 품질 격차 (브리프 AD 질문 1)

데스크톱 보병 첫 출격 그림 1. 첫 출격 3초 뒤, 데스크톱. 거점 A에서 출격했다.

아파치 조종석 그림 5. 아파치 본진 FARP, 데스크톱. IHADSS 기호, MPD 두 장, 계기, 캐노피 프레임이 있다.

항목 보병 1인칭 아파치 조종석
손에 든 것 검은 상자 10개짜리 소총(rifleModel), 비조준 시 화면 오른쪽 아래 1/4을 대각선으로 가로지른다 조종간·콜렉티브·페달이 입력에 따라 움직인다
정보 기호 십자선, 모서리 상자 IHADSS 방위·고도·속도 눈금, MPD 페이지
근거리 세계 상자 인형이 카메라 바로 앞에 겹친다(그림 2 왼쪽 1/3), 흙길·풀 캐노피 프레임이 가까운 거리를 가린다
소리 소총 등 10개 클립(49KB) 로터 루프·시동 실제 녹음(169KB)

우선순위 (적은 비용으로 격차를 줄이는 순서).

  1. 뷰모델의 무게를 줄인다. 화면을 덮는 면적을 지금의 약 2/3로 줄이고, 금속색 #2b2e31을 한 단계 밝혀 화면에서 가장 어두운 덩어리가 되지 않게 한다. 총구는 화면 가운데 쪽을 향하게 한다. 코드 수정이라 에셋 비용은 0이다.
  2. 아군 인형이 카메라를 뚫지 않게 한다. 출격 지점에서 같은 분대 대원이 플레이어와 겹쳐 서 있다(그림 2). 1.5m 안의 인형은 숨기거나 밀어낸다.
  3. 근거리 인형을 다듬는다. 손·총·어깨 표식. A13(코드 인형 유지) 범위 안에서 한다.
  4. **#182(피치 0에서 지형이 뚫림)**는 실기기에서 확인한다. 헤드리스에서는 스폰 피치 −0.05로 피해 있다. 이번 촬영에서는 재현하지 않았다.

격차를 다루는 원칙(CD·TD 합의, AD-8). 조종석 수준으로 올리지 않는다. B3 보병 최저선은 다음 일곱 가지다.

  1. 뷰모델 축소·밝게·총구 가운데
  2. 1.5m 안 아군 인형 숨김(렌더에서만 숨기고 sim 판정은 그대로)
  3. 모바일 발사 버튼에서 위협색 제거
  4. 코치 "■ 아군"을 아군색으로
  5. 경계 말뚝(3.4)
  6. 점령 바의 내 몫(3.4)
  7. 배치 화면 스폰 지도(10장)

5~7은 첫 화면 품질이 아니라 전선 장치라서 탈것 폭과 맞바꾸지 않는다. 미뤄야 하면 말뚝 > 스폰 지도 > 내 몫 순서로 남긴다. 그 밖의 근거리 디테일(손·장갑·무기별 모델)은 만들지 않고, 남는 시간은 B4 탈것 폭에 쓴다. 번들 영향은 1KB 미만(TD 추정)이고 커밋 때 확인한다.


7. 출처·라이선스 현황과 위반 여부

7.1 외부 에셋 (public/assets/CREDITS.md, 41개)

분류 수 라이선스 판정
모델 KolosStudios (tank·truck·fuel_truck·soldier) 4 CC-BY 3.0 출처 정상. tank는 상세 페이지를 2026-10-03에 다시 확인했다(CC BY 3.0). 라이선스 URI 미표기(아래)
모델 Quaternius 8 CC0 정상
텍스처 Kenney·ambientCG 2 CC0 정상
사운드 Freesound·Kenney 24 CC0 정상. 공개 미리듣기에서 잘라 썼다(CC0는 형식과 무관). 과거 "검색 CC0 ↔ 상세 CC-BY" 사례 이후 상세 페이지 확인 날짜가 모두 기재되어 있다
글꼴 B612 Mono, Pretendard→Karda Sans 3 OFL 1.1 Pretendard 예약 이름 처리는 정상(이름 변경). B612 원문에는 예약 이름이 없다(OFL.txt 확인). 라이선스 고지 누락(아래)
아이콘 5장 5 자체 제작 기재 불필요

금지 출처 사용: 없음. Sketchfab(A5), 게임 추출, NC·ND, 회색 지대(Sonniss·Zapsplat·Pixabay)는 쓰지 않았다.

7.2 위반 소지 (법률 자문이 아니라 라이선스 문면을 읽은 결과)

# 무엇 근거 해소 비용
L1 three.js·React 등 MIT 라이브러리 저작권 고지가 배포물에 없다. vite build 산출물에 @license 주석이 없고 크레딧 화면에도 없다 MIT "above copyright notice ... shall be included in all copies or substantial portions" 크레딧에 "오픈소스" 묶음을 추가하고 라이선스 문서 하나를 public/에 둔다(지연 로드, 첫 로드 비용 0)
L2 OFL 글꼴의 라이선스가 함께 배포되지 않는다. 서브셋에 name ID 0(저작권)은 남아 있지만 13·14(라이선스 설명·URL)가 없고, OFL 전문 파일도 없다 OFL 1.1 조건 2: 각 사본에 저작권 고지와 이 라이선스를 포함(별도 텍스트 파일이나 메타데이터) subset-font.mjs에서 name ID 13·14를 유지하거나 public/assets/fonts/OFL.txt를 둔다
L3 CC-BY 3.0 모델 4개에 라이선스 URI가 없다. 크레딧 화면에는 "CC-BY-3.0" 글자만 있고, 원본 링크는 첫 URL만 연결된다 CC BY 3.0 4(a): 배포 시 라이선스 사본 또는 URI 포함 크레딧 행의 라이선스 글자를 deed 링크로 바꾼다
L4 (명칭) 실존 장비명 "아파치"·"AH-64"가 타이틀·manifest·역할 이름에 있다. 01장 원칙은 실존 장비 형상에 가상 명칭을 쓰는 것인데 자기 기체만 예외다 01장 원칙과의 불일치, 상표 위험(추정) 이름을 바꿀 때(9장) 타이틀과 manifest에서는 빠진다. 역할 이름은 CD(크리에이티브 디렉션 7.1) 결정대로 탈것 이름으로만 남기고, 게임의 얼굴(타이틀·아이콘·manifest·로딩)에는 쓰지 않는다. 채택 차량은 가상 명칭인데 아파치만 실명인 비대칭은 소유자 결정 목록에 올린다

L1~L3은 비용이 작고 코드·문서만 고치면 된다. TD가 첫 로드 비용 0을 조건으로 수락했다(AD-3).

  • L1: public/licenses.txt, 크레딧을 열 때만 받는다.
  • L2: name ID 13·14 유지 또는 fonts/OFL.txt. ID 13 본문에 예약 이름이 있으면 전문 파일 쪽으로 옮긴다.
  • L3: 문자열 변경.

다음 마일스톤 전에 처리한다.

7.3 쓰지 않는데 받는 것

UNITS_GROUP은 그룹 전체를 받는다(renderer.ts loadUnitModels). 그 안에 전장에서 쓰지 않는 soldier.glb 44.8KB(4.5절 "전장에서 쓰지 않는다"), civ_car.glb 43.9KB(D9 민간 없음), fuel_truck.glb 12.2KB가 있다. 경기마다 약 101KB를 받고 버린다. 크레딧에는 남겨 두되 전장 그룹에서 뺀다(AD-4, TD 수락). 다시 들어오지 않도록 "전장 그룹의 모든 모델은 로스터 유닛의 MODEL_FOR_UNIT이 가리킨다"는 검사를 둔다. 아파치 소리 169KB도 헬기 그룹으로 옮기면(TD-6) boot는 578.5 → 약 409KB, 경기당 지연 에셋은 345.8 → 약 245KB가 된다(TD 추정).


8. 모바일 화면 위계

모바일 보병 첫 출격 그림 2. 844×390 터치, 첫 출격 3초 뒤.

문제 (그림 2 기준).

  • 상단 1/3에 메뉴 버튼, 미니맵, 상태 알약, 코치 상자, 유탄·재장전 버튼이 겹쳐 있다. 세계가 보이는 면적은 가운데 띠 정도다.
  • 코치 문장이 줄바꿈되어 "다" 한 글자만 둘째 줄로 떨어진다.
  • 티켓 패널이 미니맵 아래 화면 왼쪽 가운데로 밀려나 있다. 데스크톱에서는 왼쪽 위다.
  • 가장 채도가 높은 세 요소(빨간 발사, 노란 스틱, 노란 코치)가 모두 조작 UI다(2장).
  • 소총 뷰모델과 "조준" 버튼이 겹친다.
  • 출격 지점의 아군 인형이 왼쪽 1/3을 덮는다.

제안 구역.

구역 내용 규칙
위 가운데 띠(높이 약 36px) 티켓 바 + 거점 줄 + 시계를 한 줄로 항상 같은 자리, 반투명
왼쪽 위 미니맵(110px), 그 옆에 메뉴
화면 가운데 원(세로 높이의 약 50%) 세계, 십자선, 피격 호, 표식만 UI를 놓지 않는다
가운데 아래 코치와 무전을 한 줄로(넘치면 줄이지 말고 자른다) 강조색 테두리, 4초
양쪽 아래 조작 버튼(무채색 반투명) 위협색·진영색 금지
오른쪽 위 체력·탄 위험할 때만 위협색

9. 게임 이름에 대한 AD 의견 (타이틀 로고·아이콘 관점, 브리프 AD 질문 4)

AD는 "카르다 전선"에 동의한다.

  • 한글 다섯 자에 띄어쓰기 하나다. 홈 화면 아이콘 밑 글자(iOS·Android 모두 대략 10자 안팎에서 잘린다, 추정)에 그대로 들어간다. short_name과 name을 같게 둘 수 있다.
  • 지금 글꼴 서브셋에 모든 글자가 있다(TD-8). 로고를 위해 새 글꼴을 들이지 않는다.
  • "전선"은 그림이 된다. 능선 위의 선, 밀고 밀리는 경계. "전장"(모드 이름)이나 "티켓 제로"는 그림이 되지 않는다.

타이틀 배경. CD-6의 구도("1인칭 보병이 능선 너머 거점 깃발을 본다")는 그림 에셋이 아니라 엔진 실시간 렌더로 만든다. PNG 한 장도 무캐시로 매 실행 비용이 되고, 직접 그린 그림은 채택 규칙 밖이다.

타이틀 로고. "카르다 전선"을 Karda Sans Bold 큰 글자로 쓰고, 아래에 끊어진 가로선 하나(전선)를 긋는다. 선 왼쪽은 아군색 ■, 오른쪽은 적색 ▲로 끝난다. 부제는 **"봇과 함께 싸우는 점령전"**이다(CD 합의). 아파치는 언급하지 않는다. 배치 화면의 헬기 슬롯 이름은 "공격 헬기 · 아파치"로 쓴다. 그림 대신 타이포그래피만 써도 된다(CD-6의 대안을 받아들인다). 배경은 지금처럼 작전실 바탕(#0b1320)에 실제 전장 원경을 어둡게 깐다(배치 화면이 이미 이렇게 한다).

아이콘 (지금: 노란 원 안 흰 "H" = 헬기장). 이름이 정해지면 다음으로 바꾼다.

  • 바탕 #0b1320. 가운데에 능선 실루엣 한 줄과 깃발 하나를 둔다. 깃발은 강조색 #ffd166이다. 진영색을 쓰지 않는 이유는 어느 진영의 게임도 아니기 때문이다.
  • 글자를 넣지 않는다. 192px 아이콘에서 한글 다섯 자는 읽히지 않는다.
  • 헬기와 실존 표식·국기를 넣지 않는다(01장, CD-6).
  • maskable 아이콘은 안전 영역(가운데 80% 원) 안에 들어가게 한다.
  • 다섯 장 합계를 지금(114.6KB, TD 실측) 이하로 맞춘다. 평면 도형 몇 개라 크기가 줄어든다(추정).

manifest. name·short_name "카르다 전선", description "봇과 함께 싸우는 브라우저 점령전" 정도. "AH-64"와 "시뮬레이터"를 뺀다. theme_color·background_color는 그대로 둔다.


10. 지금 화면의 구체적 문제 (목록)

# 문제 근거 영역
V1 표식 없이 100m에서 피아 구별 불가 그림 3, 3.2 피아
V2 설계의 어깨 표식·VPA 차량 부품 미구현, 중거리 LOD에서 머리 모양이 같다 puppets.ts, unitRenderer.ts vs 12.7·4.5 피아
V3 3D 깃발은 절대색, HUD는 상대색 flags.ts vs symbols.ts 색 체계
V4 코치 문장의 "■ 아군"이 강조색(노랑)으로 그려진다 그림 1·2 색 체계
V5 발사 버튼이 위협색 styles.css .tbtn.fire, 그림 2 위계
V6 소총 뷰모델이 화면에서 가장 무거운 덩어리 그림 1, 어두운 픽셀 6.1% vs 2.4% 첫 화면
V7 출격 시 아군 인형이 카메라 앞에 겹친다 그림 2 첫 화면
V8 거점의 지면 경계가 없다 그림 1, flags.ts만 있음 거점
V9 지형 삼각형 이음새의 점선이 원거리 보병과 같은 크기·색 그림 6 소음
V10 모바일 상단 혼잡, 코치 줄바꿈에서 한 글자만 떨어짐, 티켓 패널 위치 그림 2 모바일
V11 배치 화면에 지도가 없다. 스폰이 글자 버튼뿐이다("분대 1 (A 근처)"). 버튼 뒤에 카드와 맞지 않는 어두운 띠가 있다 그림 7 배치
V12 이름·아이콘·manifest가 제거된 게임을 말한다 index.html, manifest.webmanifest, public/icons 입구
V13 라이선스 고지 3건 누락 7.2 L1~L3 출처
V14 쓰지 않는 모델 약 101KB를 경기마다 받는다 7.3 용량
V15 보병 한계 35°의 경사가 풀색으로 보인다(못 가는 곳이 갈 수 있는 곳처럼 보임) 4.2a 지형

배치 화면 지도(V11, CD 5장 응답). CD는 죽음의 비용을 티켓이 아니라 "다시 잃은 거리"로 준다. 그 거리를 고르려면 배치 화면에 지도가 있어야 한다. 미니맵 크기의 스폰 지도에 거점 기호, 스폰 ◎, 각 스폰에서 가장 가까운 비소유 거점까지의 거리를 표시한다. CD-4의 전방 집결지도 ◎로 나타난다. B3 UI 작업에 넣기를 제안한다.

배치 화면 그림 7. 배치 화면, 데스크톱. 스폰을 고르는 지도가 없고, 버튼 아래에 어두운 띠가 있다.


11. 사람이 눈으로 볼 것 (마일스톤 관문 O5, AD 몫)

헤드리스로는 판단할 수 없는 항목이다. 마일스톤마다 실기기 스크린샷을 한 장씩 남긴다. CD-7의 녹화 요청(첫 교전 시각, 거점 원 진입)은 소유자 기기의 화면 녹화로 받는다. 헤드리스는 3~4fps라 시간을 잴 수 없다. 녹화가 어려우면 출격·첫 교전·원 진입 스크린샷 3장과 시각 메모로 대신한다. 항목 이름은 TD 하니스 지표 이름과 맞춘다.

  1. 표식을 끈 상태(발견 전)에서 50m·100m의 아군·적 보병을 3초 안에 구별하는가. 데스크톱과 휴대폰 각각.
  2. 실기기에서 지형 점선(V9)과 #182가 보이는가.
  3. 휴대폰 가로 화면에서 가운데 원 안에 UI가 없는가, 첫 교전에서 위협(피격 호)이 버튼보다 먼저 보였는가.
  4. 첫 경기에서 거점 원 안에 들어왔다는 것을 화면으로 알았는가. CD-7 ②와 같은 "거점 진입" 스크린샷 한 장으로 같이 판정한다.
  5. 진영을 바꿔 한 판씩 했을 때, 적이 더 잘 보인 쪽이 있었나(AD-1 명도 분리의 공정성 확인).

지표 이름은 하니스 v3와 같게 쓴다: firstContactSec(출격 → 첫 발견·사격·피격), firstEntrySec(출격 → 첫 비소유 거점 원 진입), reentrySec(사망 → 다음 진입), endFlips(경기 끝 "내가 있을 때 넘어간 거점" 수).


12. 조율 상태 (디렉터 라운드 1~3, 2026-10-03)

GD 회부 0건. 디렉터 사이에 남은 이견은 없다.

안건 상대 결과 이 문서
AD-1 피아 외형 CD·TD 합의. 명도 차 L* ≥ 15, 지면 대비를 같게 맞추는 것은 AD 목표, 사람 관문 5번이 최소 조건(CD 양보안). 부품은 인스턴스 메시 1개, 드로우콜 +3~4(TD 조건) 3.3
AD-2 지형 점선·도로 띠 TD 합의. 도로 띠는 기하 문제로 TD가 수정하고, 완료 조건은 100m 앞 도로가 한 줄로 보이는 것. 경사 점선은 로그 깊이 플래그 + 소유자 기기로 확정 3.5
AD-3 라이선스 고지 TD 합의(첫 로드 비용 0) 7.2
AD-4 쓰지 않는 모델 / TD-6 TD 합의 + 재유입 방지 검사 7.3
AD-5 / TD-5 / TD-7 탈것 스타일 TD 합의(재질 2개 이하, 인스턴스 색, 코드 모델 3KB 이하·지연 청크, 실루엣 PNG는 저장소에 넣지 않음) 4.3
AD-6 / CD-5 거점 CD·TD 합의(경계 말뚝, 깃발 상대색, 내 몫, ▼ + 숫자) 3.4
AD-7 / CD-6 / TD-8 이름·첫 화면 CD·TD 합의(카르다 전선, 부제 "봇과 함께 싸우는 점령전", 실시간 렌더 배경, 능선+깃발 아이콘) 9
AD-8 보병 최저선 CD·TD 합의(①~④ + 말뚝·스폰 지도·내 몫, CD 양보안) 6
AD-9 모바일 HUD CD 합의(28자, 거점 이름을 문장 앞에) 8
AD-10 / CD-7 사람 관문 CD·TD 합의(소유자 기기 녹화 또는 스크린샷 3장, 하니스 지표 이름) 11
CD 7.2 지명 CD 합의(화면 표식은 문자 + 모양, 지명은 무전·경기 끝에서만) 3.4
CD 5 죽음의 비용 = 거리 CD 합의(배치 화면 스폰 지도) 10
TD-4 / 4.2a 경사와 바위색 CD·TD 합의(45°, sim 상수 하나를 렌더가 읽음, 막힌 구간은 바위색) 4.2a
TD 위키 3.6 "그림자 패스" 정정 TD TD 정정 완료(final-td.md, 테크니컬-디렉션 3.6·8.3). GD 판정: 대기 표시가 한쪽에만 남아 있던 것을 고침 3.3 4번
"아파치" 실명 비대칭·상표 위험(추정) CD 소유자 결정 요청(회부 아님). 탈것 이름으로만 쓰고 입구에서는 금지 7.2 L4

부록: 촬영 방법

  • 서버: npx vite --port 5191 --strictPort(측정 체크아웃). 브라우저는 하나만 띄웠다. 끝난 뒤 fuser -k 5191/tcp로 종료했다.
  • 렌더 루프가 sim을 실시간으로 따라가려 해서 스크린샷이 3분 넘게 걸렸다. session.paused = true로 sim을 멈추고, 필요할 때만 paused=false → step → paused=true로 진행해 해결했다. 이후 한 장에 20~50초 걸렸다.
  • 피아 장면: renderer.debugCamera로 카메라를 고정하고 camera.fov를 80/55로 바꿔 비조준/조준을 흉내 냈다. 연합 c_inf·c_tank, VPA inf·tank를 같은 지면에 옮겼다. 시선이 지형에 막히지 않는 방향은 terrain.surfaceAt 표본으로 골랐다. 건물 가림은 검사하지 않았다.