Postav mi video, které vysvětluje pravidla sportu stylem televizní analýzy s AR grafikou. Bez AI video modelů a bez stahování assetů: 3D scénu, postavy, textury, grafiku i zvuk vytvoř kódem. Pracuj samostatně a průběžně mi ukazuj kontrolní snímky.
## Parametry (pro jiný sport změň tuhle sekci a sekci Scénář)
- Sport: fotbal
- Pravidla (9): ofsajd, faul, pokutový kop, vhazování, rohový kop + kop od branky, hra rukou, přímý volný kop, žlutá a červená karta, gól (celý míč za čarou)
- Jazyk všech textů: čeština (plná diakritika, desetinná čárka)
- Délka: cca 68 s (úvod ~4,5 s, každé pravidlo 6 až 8 s, závěr ~4 s)
- Formát: 1920×1080, 30 fps, MP4 (H.264 + AAC)
- Styl postav: PS2 éra ve stylu GTA San Andreas (low-poly tvarované tělo, ručně malované textury)
- Týmy: Červení (červený dres s bílými lemy, bílé trenky), Modří (královsky modrý dres, tmavě modré trenky), rozhodčí černý s limetkovými lemy, brankáři zelený a fialový
## Technologie a pipeline
- Three.js (npm). index.html obsahuje WebGL canvas 1920×1080 a nad ním DOM vrstvu pro HUD.
- Deterministická funkce `window.renderFrame(t)`: stav scény i HUD je čistá funkce času, žádný stav mezi snímky.
- `render.mjs`: lokální statický HTTP server + puppeteer-core se systémovým Chrome (headless, na Macu `--use-angle=metal`). Pro každý snímek zavolej renderFrame(t), počkej 2× requestAnimationFrame, udělej JPEG screenshot a pošli ho rourou do ffmpeg (libx264, CRF 18, yuv420p). Režimy: `stills t1 t2 …` (PNG na kontrolu), `video`, `info` (zapíše časovou osu do out/timeline.json).
- Cesty řeš přes fileURLToPath (složky s mezerami v názvu).
- WebGLRenderer s `preserveDrawingBuffer: true`, ACES tone mapping, PCF soft shadows. EffectComposer s MSAA (samples 4, HalfFloat): RenderPass, UnrealBloomPass, vlastní grade pass (vinětace, jemné zrno, chromatická aberace, záblesk, whip blur, VHS efekt), OutputPass.
- Zvuk: Python (numpy + scipy) syntetizuje celý soundtrack do WAV, ffmpeg ho přimíchá (AAC 192k).
- Výstupy: plná kvalita + webová verze (CRF 23 až 24, maxrate 10M).
## Struktura projektu
src/util.js (easing, tmap pro freeze a zpomalení, track() pro pohyb hráčů po časovaných waypointech s fází běhu podle uražené vzdálenosti, seeded rng), src/world.js, src/player.js, src/ar.js, src/hud.js, src/grade.js, src/segments.js, src/main.js, render.mjs, https://audio.py/, PROGRESS.md (průběžně zapisuj, co je hotové a jak se to pouští, ať se dá navázat po přerušení).
## Svět
- Hřiště 105×68 m. Tráva jako canvas textura (pruhy po 5,25 m, šum, skvrny) + dlaždicová detail textura přes onBeforeCompile. Čáry jako ostrá geometrie, ne textura. Vnější hrana čar = hranice hřiště.
- Branky se sítí (LineSegments), rohové praporky.
- Stadion: dvoupatrová mísa podle superelipsy, dav jako canvas textura lidí v řadách, LED pás mezi patry, střecha s žebry, řady reflektorů na hraně střechy (emisivní, bloom), vnější fasáda s osvětlenými okny, noční obloha, světla města kolem, tmavá zem.
- LED mantinely kolem hřiště s českými nápisy (PRAVIDLA FOTBALU, RESPEKT, FAIR PLAY, ZNEJ PRAVIDLA, #PRAVIDLAFOTBALU), pomalu se posouvají.
- Světla: 4 směrová světla z rohů střechy se stíny (shadow kamera zaostřená na akci daného segmentu), hemisférické světlo, jemná mlha.
- Analytický grade: do všech materiálů světa vlož přes onBeforeCompile sdílený uniform uFreeze (odbarvení do chladné šedozelené + ztmavení). AR materiály ho nemají, takže při zastaveném obrazu zůstanou syté.
## Postavy (styl GTA San Andreas)
- Hierarchický rig: root → body (pánev) → trup → hlava a ramena → lokty, kyčle → kolena → kotníky. Póza = sada úhlů (náklon a rotace trupu, flexe a abdukce ramen, lokty, kyčle, kolena, kotníky, náklon těla, výskok).
- Geometrie: trup jako LatheGeometry (široká ramena, užší pas), zúžené končetiny, klouby jako koule, dlaň s palcem, kopačka s podrážkou a zúženou špičkou, tvarovaná hlava (užší brada), nos, uši, vlasy jako slupka (krátké, objemné, ježek, holá hlava).
- Ručně malované canvas textury: obličej (oči s duhovkou a odleskem, obočí, stín nosu, rty, tváře, strniště nebo vousy, vlasová linie), dres (V-výstřih, boční pruhy, znak, sponzor, jméno a velké číslo na zádech, vrásky látky), rukávy, trenky s číslem, štulpny s pruhy.
- Každý hráč jiný: pleť, vlasy, účes, oči, vousy, barva kopaček, postava. Česká jména na zádech (NOVÁK, DVOŘÁK, RŮŽIČKA…).
- Procedurální běh (fáze z uražené vzdálenosti, ať nohy nekloužou) + knihovna póz: kop (nápřah, úder, dokopnutí), skluz, zakopnutí a pád, vhazování, výskok s paží nad hlavou, zvednutá karta, postoj ve zdi, výskok zdi, robinzonáda brankáře, hlava dolů.
- Zvýraznění: obrysová slupka (inverted hull, tloušťka podle vzdálenosti od kamery), průsvitný hologram „ducha“ pro naznačení restartu, rozsvícení paže.
## AR grafika (additive blending, depthWrite false, kreslí se postupně přes progress)
GroundLine (zářící čára na zemi), Curtain (svislá rovina: ofsajd, branková a postranní čára), GroundRing (prstenec nebo disk s pulzem, čárkováním a výsečí, třeba kruh 9,15 m), Area (vyplněné území s okrajem a skenem), Trail (trubice trajektorie míče), GroundArrow (šipka s běžícími chevrony), Marker (zaměřovač kontaktu), Beam (světelný sloup), ScanGrid (skenovací mřížka), Segment3D (měřicí úsečky), Silhouette (válec obrysu těla).
Barvy: tyrkysová = měření, červená = přestupek, jantarová = míč a území, zelená = platné rozhodnutí.
DŮLEŽITÉ: shadery musí být NaN-safe (clamp UV, žádné pow ze záporného čísla). MSAA na hranách extrapoluje UV a NaN se v bloomu rozleje do černých bloků přes půl obrazu.
## HUD (DOM, styl sportovního přenosu)
- Logo vlevo nahoře „PRAVIDLA FOTBALU / AR ANALÝZA ZÁPASU“ + počítadlo „01 / 09“.
- Vpravo nahoře stav (ŽIVĚ, ZÁZNAM, ZPOMALENĚ ×0,6, STOP · AR, PŘETÁČENÍ ◀◀, KONEC ZÁPASU) a herní čas.
- Lower third vlevo dole: číslo pravidla, název, jednověté vysvětlení, ukazatel postupu z 9 dílků.
- Panel rozhodnutí vpravo dole v barvě rozhodnutí (OFSAJD, PENALTA, GÓL…) s podtitulkem.
- Při zastavení obrazu: záblesk, rohové závorky, štítek „ZASTAVENÝ OBRAZ · AR ANALÝZA“, krátký technický řádek dole.
- AR štítky ukotvené na 3D bod (projekce kamerou) s odkazovou čarou. Drž je v bezpečné zóně (ne pod spodní grafikou, ne pod logem) a nesmí se překrývat.
- Velká grafika karty (žlutá a červená) s důvody, úvodní titulek, závěr „TEĎ ZNÁŠ PRAVIDLA.“ s mřížkou 9 pravidel, stinger přechod (šikmé pruhy navy, tyrkysová, bílá + logo) na každém střihu.
- Čitelnost: minimální velikosti (název pravidla 66 px, popis 29 px, štítek 33 px + podtitulek 21 px, technický řádek 22 px). Text vždy na tmavém podkladu, krátké texty. Line-height aspoň 1,05, aby diakritika (Ž, Č, Ř) nebyla oříznutá. Titulky neodhaluj maskou, vypadá to jako ořez: použij fade + rozostření + lehký zoom.
- Fonty: systémové s českou diakritikou (na macOS DIN Condensed + Avenir Next Condensed). Pokrytí znaků ověř předem přes fc-query.
## Scénář (vnitřní časy segmentů, natažení na čtení viz další sekce)
Úvod (3,5 s): dron sjíždí z noční oblohy přes střechu do stadionu na široký záběr středu hřiště. Skenovací mřížka přejede hřiště, pod hráči naskočí kroužky, štítek „MÍČ SLEDOVÁN“. Titulek „PRAVIDLA FOTBALU“, nad ním „TV ANALÝZA PRAVIDEL“, pod ním „9 KLÍČOVÝCH PRAVIDEL · AR ANALÝZA“.
1. Ofsajd: televizní kamera, Červený #8 přihrává, zastavení v okamžiku přihrávky. Kamera se přesune do osy ofsajdové linie. Tyrkysová rovina u nejzazší části těla předposledního obránce (Modrý #4), červená u předsunutého kolena útočníka (Červený #9), měření „+1,59 m“ (spočítej z kloubů, paže se nepočítají). Rozhodnutí OFSAJD: nepřímý volný kop, Modří.
2. Faul: záznam ×0,6 nízko u trávníku. Modrý #10 vede míč, Červený #6 jde skluzem zezadu do kotníku. Zastavení v okamžiku kontaktu: zaměřovač „KONTAKT“, „MÍSTO FAULU“ (kruh + sloup), šipka dráhy skluzu, červený obrys. Kamera obkrouží, pak pád. FAUL: přímý volný kop.
3. Penalta: Červený #9 ve vápně, Modrý #3 ho podrazí. Zastavení, jeřáb nahoru. Zvýraznění pokutového území, oblouk z místa faulu na pokutovou značku s drátěným míčem, „11 m“. PENALTA.
4. Vhazování: přihrávka Červeného #2 přejede postranní čáru (trajektorie se kreslí živě). Zastavení až ve chvíli, kdy je celý míč venku, střih na kameru za čarou. Červená rovina, „+15 cm“, „CELÝ MÍČ VENKU“, „POSLEDNÍ DOTEK · ČERVENÝ #2“, modrá šipka do hřiště a hologram modrého hráče s míčem nad hlavou. VHAZOVÁNÍ (Modří).
5. Roh + kop od branky: střela Červeného #10 tečovaná Modrým #4 za brankovou čáru → ROHOVÝ KOP. Pak efekt přetáčení (VHS) a stejná střela bez teče → KOP OD BRANKY (zvýrazněné brankové území).
6. Hra rukou: střela, Modrý #5 ve výskoku s paží nad ramenem, míč do předloktí. Paže zčervená, ramenní linie, čára paže „ÚHEL PAŽE 135°“, průsvitný válec „OBRYS TĚLA“. RUKA: přímý volný kop.
7. Volný kop: zeď na 8,00 m „ZEĎ MOC BLÍZKO“, nakreslí se kruh 9,15 m, zeď ustoupí, číslo naběhne na 9,15 m a zezelená. Kamera za exekutora, zahraný oblouk přes zeď zpomaleně, zastavení „PŘES ZEĎ“. PŘÍMÝ VOLNÝ KOP.
8. Karty: detail rozhodčího se žlutou kartou proti hráči se svěšenou hlavou + velká grafika ŽLUTÁ KARTA / NAPOMENUTÍ se 3 důvody. Střih, červená karta, vyloučený odchází + ČERVENÁ KARTA / VYLOUČENÍ.
9. Gól: střela, brankář vyrazí, míč padá na čáru. Kamera u brankové čáry. První zastavení: polovina míče na čáře, červená rovina, „−11 cm“, „ZATÍM NENÍ GÓL“. Míč se dokutálí. Druhé zastavení: celý míč za čarou, rovina zezelená, „+3 cm“, blesky foťáků v hledišti. GÓL.
Závěr (2,5 s): kamera stoupá nad hřiště (návrat k úvodnímu záběru), mřížka, „TEĎ ZNÁŠ PRAVIDLA.“ + mřížka 9 pravidel, stmívačka.
Každé zastavení obrazu: krátký záblesk, odbarvení scény, kamera se dál pomalu hýbe kolem zmrazených hráčů, AR prvky naskakují postupně. Mezi segmenty vždy stinger.
## Čas na čtení
Akce (běh, kopy, skluzy) běží ve skutečné rychlosti. Analytické části každého segmentu natáhni 1,5× až 2,1× přes warp funkci (výstupní čas → vnitřní čas segmentu), aby každé pravidlo bylo na obrazovce 6 až 8 s a všechny texty se daly v klidu přečíst. `node render.mjs info` exportuje výslednou časovou osu do out/timeline.json.
## Zvuk (procedurální, https://audio.py/)
120 BPM broadcast groove (kopák, virbl, hi-haty, basa se sidechainem, arpeggio, pad), riser v úvodu, závěrečný akord. Při zastaveném obrazu hudba ztlumená low-passem. Dav (filtrovaný šum s vlněním, řev při gólu), whoosh + boom na každém střihu, kovový úder na každém zastavení, krátké „razítko“ při rozhodnutí, píšťalka, kopy do míče, zvuk přetáčení. Časy všech zvuků načti z out/timeline.json, ať sedí na obraz i po změně délky. Cílová hlasitost kolem −14 LUFS.
## Postup práce a kontrola
1. Nejdřív rozjeď pipeline (server, render, ffmpeg) s jednou scénou a ověř, že WebGL v headless Chrome běží.
2. Po každé změně vyrenderuj kontrolní snímky v klíčových časech a prohlédni je, včetně výřezů na 100 % kvůli textu a diakritice.
3. Celé video kontroluj přes kontaktní listy (ffmpeg filtr tile) a snímky kolem přechodů.
4. Hotové video ověř dekódováním (`ffmpeg -v error -i video.mp4 -f null -`) a délku a stopy přes ffprobe.
5. Do PROGRESS.md průběžně zapisuj, co je hotové a jakými příkazy se to pouští.
한국어 번역
AR 그래픽을 활용한 TV 해설 스타일로 스포츠 규칙을 설명하는 영상을 만들어 줘. AI 비디오 모델 없이, 에셋 다운로드 없이: 3D 장면, 캐릭터, 텍스처, 그래픽, 사운드를 모두 코드로 만들어 줘. 혼자서 작업하고, 중간중간 확인용 스틸 이미지를 보여 줘.
## 매개변수 (다른 스포츠라면 이 섹션과 시나리오 섹션을 바꿔 줘)
- 스포츠: 축구
- 규칙(9): 오프사이드, 파울, 페널티킥, 스로인, 코너킥 + 골킥, 핸드볼, 프리킥, 옐로카드와 레드카드, 골(공 전체가 라인을 넘어감)
- 모든 텍스트의 언어: 체코어(전체 발음 부호, 소수점 쉼표)
- 길이: 약 68초(인트로 ~4,5초, 각 규칙 6~8초, 엔딩 ~4초)
- 형식: 1920×1080, 30 fps, MP4(H.264 + AAC)
- 캐릭터 스타일: GTA San Andreas 스타일의 PS2 시대(로우폴리로 형태를 잡은 몸, 수작업으로 그린 텍스처)
- 팀: 레드(흰색 테두리의 빨간 유니폼, 흰색 반바지), 블루(로열 블루 유니폼, 짙은 남색 반바지), 심판은 라임색 테두리의 검은색, 골키퍼는 녹색과 보라색
## 기술과 파이프라인
- Three.js(npm). index.html에는 1920×1080 WebGL 캔버스가 있고 그 위에 HUD용 DOM 레이어가 있다.
- 결정론적 함수 `window.renderFrame(t)`: 장면 상태와 HUD는 시간의 순수 함수이며, 프레임 사이에 상태가 없다.
- `render.mjs`: 로컬 정적 HTTP 서버 + 시스템 Chrome을 쓰는 puppeteer-core(headless, Mac에서는 `--use-angle=metal`). 각 프레임마다 renderFrame(t)을 호출하고, requestAnimationFrame을 2번 기다린 뒤 JPEG 스크린샷을 찍어 파이프로 ffmpeg(libx264, CRF 18, yuv420p)에 보낸다. 모드: `stills t1 t2 …`(확인용 PNG), `video`, `info`(타임라인을 out/timeline.json에 기록).
- 경로는 fileURLToPath로 처리해 줘(이름에 공백이 있는 폴더).
- WebGLRenderer에 `preserveDrawingBuffer: true`, ACES 톤 매핑, PCF 소프트 섀도. MSAA(samples 4, HalfFloat)를 쓰는 EffectComposer: RenderPass, UnrealBloomPass, 커스텀 그레이드 패스(비네팅, 미세 그레인, 색수차, 플레어, 휩 블러, VHS 효과), OutputPass.
- 사운드: Python(numpy + scipy)으로 사운드트랙 전체를 WAV로 합성하고, ffmpeg가 이를 믹스한다(AAC 192k).
- 출력: 최고 품질 + 웹 버전(CRF 23~24, maxrate 10M).
## 프로젝트 구조
src/util.js(이징, 프리즈와 슬로모션용 tmap, 이동 거리에 따른 달리기 단계를 가진 시간 지정 웨이포인트를 따라 선수가 움직이게 하는 track(), 시드 기반 rng), src/world.js, src/player.js, src/ar.js, src/hud.js, src/grade.js, src/segments.js, src/main.js, render.mjs, https://audio.py/, PROGRESS.md(무엇이 완료됐고 어떻게 실행하는지 계속 기록해서 중단 후에도 이어갈 수 있게).
## 월드
- 경기장 105×68 m. 잔디는 캔버스 텍스처(5,25 m 간격 줄무늬, 노이즈, 얼룩) + onBeforeCompile을 통한 타일링 디테일 텍스처. 라인은 텍스처가 아닌 날카로운 지오메트리. 라인의 바깥쪽 가장자리 = 경기장 경계.
- 그물이 있는 골대(LineSegments), 코너 깃발.
- 스타디움: 초타원 형태를 따른 2층 관중석, 줄지어 앉은 사람들을 그린 캔버스 텍스처로 만든 관중, 층 사이의 LED 띠, 리브가 있는 지붕, 지붕 가장자리의 투광등 열(발광, 블룸), 불 켜진 창문이 있는 외부 파사드, 밤하늘, 주변 도시 조명, 어두운 지면.
- 경기장 주변의 LED 보드에는 체코어 문구(PRAVIDLA FOTBALU, RESPEKT, FAIR PLAY, ZNEJ PRAVIDLA, #PRAVIDLAFOTBALU)가 있고, 천천히 흘러간다.
- 조명: 지붕 모서리에서 나오는 그림자가 있는 방향광 4개(섀도 카메라는 해당 세그먼트의 액션에 초점을 맞춤), 반구광, 옅은 안개.
- 분석용 그레이드: 월드의 모든 머티리얼에 onBeforeCompile을 통해 공유 uniform uFreeze를 넣어라(차가운 회녹색으로 탈색 + 어둡게). AR 머티리얼에는 이것이 없어서 화면이 멈춰도 채도가 유지된다.
## 캐릭터 (GTA San Andreas 스타일)
- 계층형 리그: root → body(골반) → 몸통 → 머리와 어깨 → 팔꿈치, 고관절 → 무릎 → 발목. 포즈 = 각도 집합(몸통 기울기와 회전, 어깨 굴곡과 외전, 팔꿈치, 고관절, 무릎, 발목, 몸 기울기, 점프).
- 지오메트리: LatheGeometry로 만든 몸통(넓은 어깨, 좁아지는 허리), 가늘어지는 팔다리, 구체로 된 관절, 엄지가 있는 손바닥, 밑창과 좁아지는 앞코가 있는 축구화, 형태를 잡은 머리(좁은 턱), 코, 귀, 껍질처럼 덮는 머리카락(짧은 머리, 볼륨 있는 머리, 스파이크 머리, 민머리).
- 수작업으로 그린 캔버스 텍스처: 얼굴(홍채와 반사광이 있는 눈, 눈썹, 코 그림자, 입술, 볼, 면도 자국이나 수염, 헤어라인), 유니폼(V넥, 옆줄, 엠블럼, 스폰서, 등에 이름과 큰 등번호, 천의 주름), 소매, 번호가 있는 반바지, 줄무늬 양말.
- 모든 선수가 다르게: 피부색, 머리카락, 헤어스타일, 눈, 수염, 축구화 색, 체형. 등에는 체코어 이름(NOVÁK, DVOŘÁK, RŮŽIČKA…).
- 절차적 달리기(이동 거리에서 단계를 계산해 발이 미끄러지지 않게) + 포즈 라이브러리: 킥(백스윙, 임팩트, 팔로스루), 슬라이딩 태클, 걸려서 넘어짐, 스로인, 머리 위로 팔을 올린 점프, 카드를 들어 올림, 벽 앞 자세, 벽 점프, 골키퍼의 슈퍼 세이브, 고개 숙임.
- 강조: 외곽선 셸(역법선 껍질, 카메라 거리에 따른 두께), 재시작을 암시하는 반투명 '유령' 홀로그램, 팔 발광.
## AR 그래픽 (가산 혼합, depthWrite false, progress를 따라 점진적으로 그려짐)
GroundLine(지면의 빛나는 선), Curtain(수직 평면: 오프사이드, 골라인과 사이드라인), GroundRing(맥동, 점선, 부채꼴이 있는 링 또는 디스크, 예를 들어 9,15 m 원), Area(가장자리와 스캔이 있는 채워진 구역), Trail(공 궤적의 튜브), GroundArrow(흐르는 셰브론이 있는 화살표), Marker(접촉 지점 조준 표시), Beam(빛 기둥), ScanGrid(스캔 그리드), Segment3D(측정 선분), Silhouette(몸 윤곽 실린더).
색상: 청록색 = 측정, 빨간색 = 반칙, 호박색 = 공과 구역, 초록색 = 유효한 판정.
중요: 셰이더는 NaN에 안전해야 한다(UV 클램프, 음수에 대한 pow 금지). 가장자리의 MSAA는 UV를 외삽하고, NaN은 블룸에서 화면 절반을 덮는 검은 블록으로 번진다.
## HUD (DOM, 스포츠 중계 스타일)
- 왼쪽 위 로고 „PRAVIDLA FOTBALU / AR ANALÝZA ZÁPASU“ + 카운터 „01 / 09“.
- 오른쪽 위 상태(ŽIVĚ, ZÁZNAM, ZPOMALENĚ ×0,6, STOP · AR, PŘETÁČENÍ ◀◀, KONEC ZÁPASU)와 경기 시간.
- 왼쪽 아래 로어 서드: 규칙 번호, 이름, 한 문장 설명, 9칸 진행 표시.
- 오른쪽 아래 판정 패널은 판정 색상(OFSAJD, PENALTA, GÓL…)에 부제목이 붙는다.
- 화면이 멈출 때: 플래시, 모서리 브래킷, „ZASTAVENÝ OBRAZ · AR ANALÝZA“ 라벨, 아래쪽의 짧은 기술 정보 줄.
- 카메라 투영으로 3D 지점에 고정된 AR 라벨에는 연결선이 있다. 안전 영역(하단 그래픽 아래, 로고 아래가 아닌 곳)에 두고 서로 겹치지 않아야 한다.
- 이유가 적힌 큰 카드 그래픽(옐로, 레드), 인트로 타이틀, 9개 규칙 그리드가 있는 엔딩 „TEĎ ZNÁŠ PRAVIDLA.“, 모든 컷의 스팅어 전환(네이비, 청록, 흰색의 사선 줄무늬 + 로고).
- 가독성: 최소 크기(규칙 이름 66 px, 설명 29 px, 라벨 33 px + 부제목 21 px, 기술 줄 22 px). 텍스트는 항상 어두운 배경 위에, 짧은 문구로. 발음 부호(Ž, Č, Ř)가 잘리지 않도록 line-height는 최소 1,05. 자막을 마스크로 드러내지 마라, 잘린 것처럼 보인다: 페이드 + 블러 + 약한 줌을 사용해라.
- 폰트: 체코어 발음 부호를 지원하는 시스템 폰트(macOS에서는 DIN Condensed + Avenir Next Condensed). 문자 커버리지는 fc-query로 미리 확인해라.
## 시나리오 (세그먼트 내부 시간, 읽기용 늘리기는 다음 섹션 참조)
인트로(3,5초): 드론이 밤하늘에서 지붕을 넘어 스타디움으로 내려와 경기장 중앙의 와이드 샷을 잡는다. 스캔 그리드가 경기장을 훑고, 선수들 아래에 링이 나타나고, „MÍČ SLEDOVÁN“ 라벨이 뜬다. „PRAVIDLA FOTBALU“ 타이틀, 그 위에 „TV ANALÝZA PRAVIDEL“, 아래에 „9 KLÍČOVÝCH PRAVIDEL · AR ANALÝZA“.
1. 오프사이드: TV 카메라, 레드 #8이 패스하고, 패스하는 순간에 정지. 카메라는 오프사이드 라인 축으로 이동한다. 뒤에서 두 번째 수비수(블루 #4) 몸의 가장 앞선 부분에 청록색 평면, 공격수(레드 #9)의 앞으로 나온 무릎에 빨간색 평면, 측정값 „+1,59 m“(관절에서 계산하고 팔은 포함하지 않음). 판정 OFSAJD: 간접 프리킥, 블루.
2. 파울: 잔디 가까이에서 ×0,6 재생. 블루 #10이 공을 몰고, 레드 #6이 뒤에서 발목으로 슬라이딩한다. 접촉 순간에 정지: 조준 표시 „KONTAKT“, „MÍSTO FAULU“(원 + 기둥), 슬라이딩 경로 화살표, 빨간 외곽선. 카메라가 한 바퀴 돌고, 이어서 넘어진다. FAUL: 직접 프리킥.
3. 페널티킥: 레드 #9가 페널티 박스 안에 있고, 블루 #3이 그를 걸어 넘어뜨린다. 정지, 크레인 샷 상승. 페널티 에어리어 강조, 파울 지점에서 페널티 스폿까지의 호와 와이어프레임 공, „11 m“. PENALTA.
4. 스로인: 레드 #2의 패스가 사이드라인을 넘어간다(궤적은 실시간으로 그려짐). 공 전체가 밖으로 나간 순간에야 정지하고, 라인 뒤 카메라로 컷. 빨간 평면, „+15 cm“, „CELÝ MÍČ VENKU“, „POSLEDNÍ DOTEK · ČERVENÝ #2“, 경기장 안쪽을 향한 파란 화살표, 머리 위로 공을 든 블루 선수의 홀로그램. VHAZOVÁNÍ (블루).
5. 코너킥 + 골킥: 레드 #10의 슛이 블루 #4에게 맞고 굴절되어 골라인 밖으로 → ROHOVÝ KOP. 그다음 되감기 효과(VHS)와 굴절 없는 같은 슛 → KOP OD BRANKY(강조된 골 에어리어).
6. 핸드볼: 슛, 블루 #5가 점프하며 팔을 어깨 위로 들고, 공이 전완에 맞는다. 팔이 빨갛게 변하고, 어깨 라인, 팔 라인 „ÚHEL PAŽE 135°“, 반투명 실린더 „OBRYS TĚLA“. RUKA: 직접 프리킥.
7. 프리킥: 8,00 m에 선 벽 „ZEĎ MOC BLÍZKO“, 9,15 m 원이 그려지고, 벽이 물러나고, 숫자가 9,15 m로 올라가며 초록색이 된다. 키커 뒤에서 본 카메라, 벽을 넘기는 궤적을 슬로모션으로, 정지 „PŘES ZEĎ“. PŘÍMÝ VOLNÝ KOP.
8. 카드: 고개를 떨군 선수에게 옐로카드를 드는 심판의 클로즈업 + 3가지 이유가 있는 큰 그래픽 ŽLUTÁ KARTA / NAPOMENUTÍ. 컷, 레드카드, 퇴장당한 선수가 걸어 나감 + ČERVENÁ KARTA / VYLOUČENÍ.
9. 골: 슛, 골키퍼가 쳐내고, 공이 라인으로 떨어진다. 골라인 옆 카메라. 첫 번째 정지: 공의 절반이 라인 위, 빨간 평면, „−11 cm“, „ZATÍM NENÍ GÓL“. 공이 굴러간다. 두 번째 정지: 공 전체가 라인 뒤, 평면이 초록색으로, „+3 cm“, 관중석의 카메라 플래시. GÓL.
엔딩(2,5초): 카메라가 경기장 위로 상승(인트로 샷으로 복귀), 그리드, „TEĎ ZNÁŠ PRAVIDLA.“ + 9개 규칙 그리드, 페이드 아웃.
모든 화면 정지 시: 짧은 플래시, 장면 탈색, 카메라는 얼어붙은 선수들 주위를 계속 천천히 움직이고, AR 요소가 차례로 나타난다. 세그먼트 사이에는 항상 스팅어.
## 읽기 시간
액션(달리기, 킥, 슬라이딩)은 실제 속도로 재생된다. 각 세그먼트의 분석 파트는 워프 함수(출력 시간 → 세그먼트 내부 시간)로 1,5×~2,1× 늘려서, 각 규칙이 화면에 6~8초 머물고 모든 텍스트를 여유 있게 읽을 수 있게 해라. `node render.mjs info`는 최종 타임라인을 out/timeline.json으로 내보낸다.
## 사운드 (절차적, https://audio.py/)
120 BPM 방송 그루브(킥, 스네어, 하이햇, 사이드체인이 걸린 베이스, 아르페지오, 패드), 인트로의 라이저, 마지막 코드. 화면이 멈추면 음악은 로우패스로 약해진다. 관중(변조가 있는 필터링 노이즈, 골 때의 함성), 모든 컷의 휘익 + 붐, 모든 정지의 금속 타격음, 판정 시 짧은 '도장' 소리, 호루라기, 공 차는 소리, 되감기 소리. 모든 사운드의 시점은 out/timeline.json에서 읽어서, 길이가 바뀌어도 화면과 맞게 해라. 목표 음량은 약 −14 LUFS.
## 작업 순서와 확인
1. 먼저 한 장면으로 파이프라인(서버, 렌더, ffmpeg)을 돌려서 headless Chrome에서 WebGL이 동작하는지 확인해라.
2. 변경할 때마다 핵심 시점의 확인용 스틸을 렌더링해서 살펴보고, 텍스트와 발음 부호를 위해 100 % 크롭도 확인해라.
3. 전체 영상은 컨택트 시트(ffmpeg tile 필터)와 전환 구간의 프레임으로 확인해라.
4. 완성된 영상은 디코딩(`ffmpeg -v error -i video.mp4 -f null -`)과 ffprobe로 길이와 트랙을 검증해라.
5. PROGRESS.md에 무엇이 완료됐고 어떤 명령으로 실행하는지 계속 기록해라.