비디오 스토리텔링
장시간 영상의 시각적 레이어를 구축하여 시청자가 9분이 지나도 방향을 잃지 않게 하는 방법. 대본이 있는 모든 토크 영상(뉴스, 단일 주제 심층 분석, 비교, 튜토리얼, 리스트릴)에 적용됩니다.
이 방법이 대체하는 실패 사례는 '장면 사고'입니다. 몇 초마다 새로운 그래픽이 등장하면 시청자는 매번 이해를 다시 시작해야 하며, 개별 그래픽 자체는 잘못이 없기 때문에 피드백이 '혼란스럽다' 또는 '너무 많은 정보'라는 모호한 형태로 돌아옵니다.
중립적인 연습 비트 시트는 저장소 루트의 docs/STORYTELLING-WORKBOOK.md에서 읽을 수 있습니다. 재사용 가능한 디자인 시스템은 이 스킬의 reference/design-system.md에 있습니다. 작업된 오픈 루프 기하학은 reference/patterns/wall-of-slots/에 있습니다. 비공개 소스 비디오는 필요하지 않습니다.
이것은 hyperframes-video-beats가 아닙니다. 그 스킬은 토크 헤드 위에 오버레이 카드를 배치합니다. 이 스킬은 비디오가 다루는 대상을 설계합니다.
1 · 네 가지 원칙
하나의 지속되는 세계
비디오는 단일 공간에 존재하며 절대 재설정되지 않습니다. 시청자가 이미 본 모든 것은 그대로 존재하고, 새로운 자료는 기존 것을 대체하지 않고 추가됩니다. 한 번 그려진 요소는 다시 그려지거나, 이동되거나, 레이블이 변경되지 않습니다.
이 스킬의 다른 모든 것은 이것에 의존합니다. 공간이 계속 변하면 카메라가 갈 곳이 없고, 화면에 다른 것이 없으면 스포트라이트가 의미가 없으며, 세계가 재설정되는 곳에서는 열린 루프가 열려 있을 수 없습니다.
세계는 또한 머물 가치가 있어야 하므로, 무엇이든 구축하기 전에 공간 문법을 결정하고 전체 런타임 동안 유지하십시오. 참조 빌드에서: 왼쪽에서 오른쪽은 결과를 향하고, 위쪽은 인간을 향하며 화면에서 유일하게 따뜻한 것이고, 아래쪽은 기록 시스템으로 향합니다. 처음 2분 안에 이것을 배운 시청자는 나머지 비디오를 공짜로 읽습니다.
의미를 위해 정확히 한 번, 의도적으로 문법을 깨십시오. 참조 빌드의 10분 동안 유일한 오른쪽에서 왼쪽 이동은 "재개율"이라는 단어와 함께 해결된 티켓이 대기열로 다시 들어가는 것입니다. 이전 3분 동안 방향이 의미가 있었기 때문에 한 마디도 없이 도착합니다.
카메라가 편집이다
새로운 그래픽으로 자르면 시청자는 매번 방향 감각을 잃습니다. 고정된 공간을 이동하는 것은 비용이 들지 않습니다. 그런 다음 접근은 "이미 이해하는 것의 부분을 더 자세히 보라"로 읽히고, 후퇴는 지금까지 구축된 모든 것이 여전히 존재하기 때문에 작업이 효과를 발휘하는 곳입니다.
세 가지 고도에서 작업하고 인접한 고도 사이를 이동하십시오:
| 고도 | 표시 | 용도 |
|---|---|---|
| 세계 | 전체 공간 | 방향 정하기, 성과, "우리가 있는 곳" |
| 영역 | 논의 중인 하위 그래프 | 대부분의 런타임 |
| 세부 | 하나의 요소 | 숫자, 상태 변경, 결정 |
세부에서 세계로 점프하는 것은 의도적인 성과 비트가 아니라면 방향 감각을 잃게 하며, 그 경우에는 사용 가능한 최고의 이동입니다.
각각 배우는 데 재구축 비용이 드는 규칙:
- 프레이밍을 스케일 팩터가 아닌 정확한 세계 창으로 명명하십시오. 창 경계는 레이블 사이에 있어야 합니다. 프레이밍을 "scale 0.6"으로 지정하면 프레임 가장자리에서 단어가 반으로 잘립니다.
- 같은 목적에 같은 창을 재사용하십시오. 오리엔트 샷이 특정 창이라면 항상 정확히 그 창을 사용하십시오. 거의 동일한 프레이밍은 표류로 읽힙니다.
- 이동 거리에 따라 지속 시간을 다양하게 하십시오. 하나의 전역 프리셋이 아닙니다.
- 카메라와 전체 프레임 와이프는 순차적으로, 절대 겹치지 않게 하십시오. 동시에 하면 콘텐츠가 단두대에 처해집니다. 카메라 먼저, 그 다음 와이프.
- 커버 레이어는 카메라가 그 아래로 이동하기 전에 불투명해져야 합니다. 순서가 바뀌면 이동의 일부가 노출되어 점프 컷으로 읽힙니다.
- 프레임 가장자리에서 60px 이내에 레이블을 두지 마십시오. 요소는 화면 밖으로 나가 "세상은 계속된다"로 읽힐 수 있습니다. 글자가 중간에 잘리면 버그로 읽힙니다. 마스킹이 아닌 배치로 해결하십시오. 페더는 ~1800px/s로 움직이는 칼날을 잡을 수 없기 때문입니다.
- 같은 대상에 대한 두 번의 연속 이동은 결함으로 읽힙니다. 리프레임이 끝난 다음 와이프가 시작되면 줌, 완전 정지, 두 번째 모션입니다. 클라이언트는 "결함과 일시 중지"라고 부릅니다. 하나의 제스처로 병합하십시오: 공유 대칭 이즈(power2.inOut), 같은 프레임에 착지, 패널이 푸티지를 밀어내는 것으로 읽힙니다. 관련: 보이는 푸티지 이동에서 전면 로드된 이즈(power3/4.out)는 이동의 ~90%를 앞부분에 집중시키고 크롤링으로 멈춥니다. 요소 입장을 위해 예약하십시오. 크롤링이 안착으로 읽힙니다. (작업된 예제 인트로에서 클라이언트가 플래그를 지정한 수정이 발생했습니다.)
주의는 스포트라이트다
어느 순간에도 정확히 하나의 요소만 완전한 밝기로 있어야 합니다. 이미 그려진 다른 모든 것은 조용하지만 읽을 수 있어야 합니다. 선택 사항이 아닙니다. 이것은 세계가 수십 개의 요소를 축적하면서도 결코 복잡하게 느껴지지 않게 하는 규칙이며, 후퇴를 압도적이지 않고 읽을 수 있게 만드는 것입니다.
계층 구조는 활성과 조용함 사이의 비율에서 나오며, 모든 것을 어둡게 만드는 것이 아닙니다. 참조 빌드의 첫 번째 프로토타입은 가장 밝은 픽셀이 101/255였고 960x540에서 읽을 수 없었습니다. 수정은 더 밝은 잉크였지 더 어둡게 하는 것이 아닙니다.
| 상태 | 목표 휘도 (Y, 16-235) | 참조의 불투명도 |
|---|---|---|
| 활성 선 + 레이블 | 200-235 | 1.0 |
| 컨텍스트, 그려졌고 여전히 관련 있음 | 120-150 | 0.56 |
| 소진됨, 역할을 다함 | 85-105 | 0.33 |
| 모든 상태의 모든 레이블 | 90 미만 금지 |
구현은 하나의 함수이며, 논의 중인 ID와 함께 모든 나레이션 비트에서 호출됩니다(build_s01.py, lit()):
def lit(t, active, warm=(), dur=0.5, floor=FLOOR):
active = list(active) + [g + "-l" for g in active if g + "-l" in order]
for gid in order:
if gid not in opac: # 그려진 적 없음: 불 켤 대상 없음
continue
tgt = 1.0 if gid in active else (WARM if gid in warm else floor)
if gid not in active:
tgt = min(tgt, MUTED.get(gid, 1.0))
...
거기에는 세 가지 중요한 세부 사항이 있습니다:
- 레이블은 항상 해당 요소의 상태를 상속합니다 (
-l접미사 통합). 밝은 요소 아래에 읽을 수 없는 레이블이 있으면 바로 수정하려는 결함입니다. - 완료된 소품은
MUTED캡을 통해 불투명도 0으로 은퇴하며, 0.3이 아닙니다. 0.3으로 음소거하면 섹션의 나머지 부분 동안 설명되지 않은 색종이가 화면에 남습니다. 생성기 규칙: 이후에 시작하는lit()전에mute()를 내보내십시오. 그렇지 않으면 트윈이 완료될 때 음소거가 덮어써집니다. - 불투명도 이벤트는 타임라인 순서로 내보내져야 합니다. 그렇지 않으면 트래커가 오래된 상태를 보고 잘못된 대상을 계산합니다. 순서가 맞지 않는 내보내기에 대해 예외를 발생시키는
seq()가드를 유지하십시오. - 요소당 창당 하나의 불투명도 권위. 동일한 요소의 불투명도를 다른 값으로 구동하는 두 개의 동시 활성 트윈은 독립 실행형 섹션에서는 부드럽게 렌더링되지만 조립된 마스터에서는 ~10Hz로 스트로브하며, 승리 트윈이 프레임마다 교대합니다. 참조 빌드는 모든 도크에서 이 결함을 출하했습니다.
lit()과 같은 스윕이 명시적인 밝게하기 또는 음소거와 겹칠 때, 나중에 시작하는 트윈이 유일한 드라이버이며 스윕은 해당 ID를 건너뜁니다(lit(..., skip=(...))). 게이트: 조립된 렌더를 스캔하여 모든 전환 창에서 한 프레임의 나갔다 들어온 휘도 점프를 찾습니다(참조 빌드의qa/v4/flicker/qa-flicker.mjs).
열린 루프는 공간적이다
"나중에 다시 돌아오겠습니다"라고 말하지 마십시오. 세계에 시각적으로 불완전한 것을 남겨두고 돌아오십시오. 시청자가 볼 수 있는 약속은 그들이 느낄 수 있는 미해결 약속입니다.
메커니즘은 모양에 관계없이 동일합니다:
- 갈고리에 심으십시오. 공간에, 약속을 하는 대사에.
- 모든 경계에서 다시 보여주십시오. 모든 섹션 핸드오프는 경계입니다. 다시 보여주는 데 약 2초가 걸리며 유지 메커니즘입니다. 건너뛰는 것은 보상이 아무것도 보상하지 않는 방법입니다.
- 시각적으로 진행시키십시오. 시청자는 불완전함이 줄어드는 것을 볼 수 있어야 합니다.
- 열었던 이미지로 닫으십시오.
스크립트에서 모양을 선택하십시오:
| 스크립트 모양 | 세계 | 불완전한 것 |
|---|---|---|
| N개의 병렬 항목 | 척추 위의 N개 소켓 | 빈 슬롯 (reference/patterns/wall-of-slots/ 참조) |
| 하나의 깊은 프로세스 | 배치된 전체 파이프라인 | 끊어지거나 누락된 링크 |
| 레벨 또는 계층 | 위로 쌓이는 스택 | 스택의 맨 위는 유령 |
| 비교 | 하나의 공유 축에 두 개의 열 | 하나의 열이 비어 있거나 채워지지 않은 점수판 |
| 뉴스 또는 발표 | 타임라인 또는 풍경 지도 | 오른쪽, 미래가 비어 있음 |
| 튜토리얼 또는 빌드 따라하기 | 고스트 처리된 완성된 아키텍처 | 아직 구축되지 않은 모든 노드 |
항목을 슬롯에 전달하는 것은 라이브 카메라 이동(~1.4초)이며, 채워진 상태의 미리 만들어진 그림으로 자르는 것이 아닙니다. 시청자는 방금 배운 것이 타일이 되는 것을 지켜봅니다. 비디오에 숫자나 카운터가 있으면 주행 거리계처럼 같은 이동 안에서 굴리십시오. 두 자릿수에 대해 같은 시작, 지속 시간 및 이즈를 사용하십시오. 그렇지 않으면 굴림 중간에 하나의 띠로 합쳐집니다.
카운터에는 숫자뿐만 아니라 이름이 필요합니다. 모서리 숫자는 시청자에게 시퀀스에서의 위치를 알려주지만 현재 항목이 무엇인지는 알려주지 않습니다. 9분 후에 "03"은 아무것도 전달하지 않습니다. 숫자를 현재 항목의 이름을 지정하는 1-2 단어 레이블(SUPPORT, VOICE AI)과 쌍으로 연결하고, 같은 플레이트 화학에서, 숫자와 함께 하나의 강체 고정물로 움직이며, 같은 주행 거리계 굴림 안에서 교체하십시오. 참조 빌드의 클라이언트 검토에서 정확히 이것을 요청했습니다: 시각적은 훌륭했지만 시청자는 여전히 어떤 사용 사례가 화면에 있는지 놓쳤습니다.
2 · 규율
단어를 얻지 못하면 그려지지 않는다
모든 모양은 레이블이 있는 요소, 레이블이 있는 요소 사이의 연결자, 이동하는 주제 또는 주변 배경입니다. 그 외에는 없습니다.
이것은 이해도 7/10을 기록하고 원인을 명명한 음소거 테스트 검토에서 나왔습니다: 다이어그램은 깔끔했지만 장식은 그렇지 않았습니다. 의미 있는 것과 같은 두께와 팔레트로 그려진 수십 개의 레이블이 없는 모양으로, 처음 보는 시청자는 신호와 질감을 구별할 수 없고 해독할 의도가 없었던 것을 해독하는 데 실제 주의를 소비합니다. 그것이 단어에서 모양으로 옮겨진 "너무 많은 정보"입니다.
예산: 섹션당 약 20개의 화면상 단어. 문장은 없습니다. 레이블은 1-2 단어이며 해당 요소 아래에 있습니다. 참조 섹션 1은 84초 동안 21개의 단어입니다.
결론: 반패턴 시각은 권장 사항을 절대 겹치지 않게 합니다. 먼저 세계를 거의 검은색으로 만들거나, 좋은 다이어그램이 없는 곳에 반례를 두십시오.
시청자에게 따라갈 한 가지를 주십시오
상태가 시각적으로 변하는 단일 이동 주제(데이터 행과 점수 막대가 있는 칩, 문서, 요청)로 이야기를 전달하십시오. 행이 채워지고, 막대가 움직이고, 테두리 색상이 변경됩니다. 시청자는 그 하나의 대상을 보면서 전체 섹션을 따라갈 수 있어야 하며, 절대 순간 이동해서는 안 됩니다. 그려진 연결자를 따라 일정한 속도로 이동합니다.
하나의 전역 토큰 세트
전체 세부 사항은 reference/design-system.md에 있습니다.
| 토큰 | 값 |
|---|---|
| 선 두께 | 1.5 / 2.5 / 4 / 7, 그 외 없음 |
| 서체 크기 | 22 / 30 / 42 / 60 / 84 |
| 반경 | 10 / 22 / 40, 항상 superellipse(2) |
다섯 가지 색상, 다섯 가지 고정된 의미, 장식 없음. 따뜻함은 인간이 관련되어 있음을 의미하며 다른 것은 절대 따뜻하지 않습니다. 서체에 절대 순수한 흰색을 사용하지 마십시오. 어두운 곳에서 헤일로가 생깁니다.
이것이 방지하는 실패, 첫 번째 빌드의 제작 검토에서: "모든 결정은 지역적으로 올바르게 내려졌습니다. 전역적으로 내려진 결정은 없었습니다." 18개의 선 두께와 9개의 서체 크기, 대부분 0.2 차이, 개별적으로는 보이지 않고 집합적으로는 치명적입니다. 눈은 계층 구조 대신 노이즈를 얻습니다. 빌드에 실패하는 토큰 린터로 게이트하십시오.
모션
입장은 cubic-bezier(0.16,1,0.3,1), 퇴장은 입장보다 빠르게, 지속 시간은 질량에 따라 다르므로 290px 노드와 40px 레이블이 동일하게 감속하지 않으며, back.out은 섹션당 정확히 한 번, 그럴 자격이 있는 비트에 사용합니다.
크로스페이드는 절대 사용하지 마십시오. 전체 블리드 레이어는 이미 불투명한 배경에서 클립으로 입장 및 퇴장합니다. 어떤 순간에도 픽셀은 그래픽이거나 푸티지입니다.
3 · 빌드 계약
- 섹션당 하나의 생성기.
scripts/build_<id>.py는 오직compositions/<id>.html만 씁니다. 생성기를 편집하고 생성된 HTML은 편집하지 마십시오. 섹션 루트index-*.html은 수동으로 유지 관리되므로 프레이밍 변경은 거기서 합니다. - 공유 모듈은 공유 상태를 유지합니다. 공유 기하학을 정의하는 모든 것은 모든 섹션에서 가져옵니다. 섹션이 병렬 에이전트에 의해 빌드된 경우 공유 모듈을 건드리지 못하게 금지하십시오. 분기된 기하학은 모든 핸드오프를 조용히 깨뜨립니다.
- 조립 전에 SVG defs의 네임스페이스를 지정하십시오. 각 섹션은 자체
gEdge,shadow,edgeFade를 정의합니다. 하나의 조립된 DOM에서url(#id)는 문서 순서에서 첫 번째 일치 항목으로 해석되므로, 이전 컴포지션이 마운트 해제되면 이후의 모든 그래픽은 아무것도 그리지 않습니다. 참조 빌드의 비용: 모든 게이트가 녹색인 상태에서 35초의 빈 화면. 조립된 렌더를 봐야만 발견할 수 있었습니다. - 워드 수준 전사에서 단어 시작에 모든 것을 시간을 맞추십시오. 기준 단어보다 0.15-0.25초 앞서 들어갑니다. 섹션을 비트로 균등하게 나누지 마십시오.
- 갭을 감사하십시오. ~1.5초 이상 아무 일도 일어나지 않는 부분은 죽은 화면입니다. 생성기가 이를 출력하게 하십시오.
- 컷에 여백을 남기십시오. 공격적인 일시 중지 제한은 문장 경계에서 거의 0에 가까운 갭을 생성하며 클라이언트는 "말 더듬" 및 점프 컷으로 듣습니다. 화자 자신의 표준에 대해 보정하십시오: 중앙값보다 ~10배 더 타이트한 문장 경계 갭에 플래그를 지정하고(참조 화자의 중앙값은 470ms였습니다. 플래그가 지정된 접합부는 20-40ms에 있었습니다), 4-8프레임의 여백을 삽입하여 수정하십시오. 단어는 건드리지 않습니다. 여백은 트랙의 실제 룸 톤의 기증자 조각이며 10ms 페이드가 있습니다.
anullsrc는 사용하지 마십시오: -50dBFS 바닥에 대한 디지털 침묵은 들을 수 있는 드롭아웃입니다. 비디오는 프레임을 유지합니다. 문장 사이에 토크 헤드는 거의 정지 상태이며 4-8프레임의 홀드는 보이지 않습니다. 삽입 전용 변경은 전사를 결정론적으로 이동시키므로 재전사가 필요하지 않습니다. 삽입의 가장자리는 음성 포락선을 존중해야 합니다: 기증자 톤을 1ms에서 단어 꼬리에 맞추면 ...
[번역을 위해 잘림]