Claude Code로 만든 모션그래픽 5편, 실제로 쓴 프롬프트 전부
10월 4일 밤부터 10월 6일 밤까지 이틀 남짓, Claude Code로 모션그래픽 쇼츠를 만들어 봤다. 그림은 이미지 생성으로 뽑고, 움직임과 3D, 음악은 전부 코드로 짰다. 영상 생성 AI는 쓰지 않았다. 나는 소재를 고르고, 결과를 보고 한마디씩 평가하고, 다음으로 넘어갈지만 정했다.
영상에서는 완성작 다섯 편과 프롬프트 다섯 개만 짧게 보여 줬다. 이 글에는 영상에 다 담지 못한 원문을 모았다. 편마다 작업 지시서, 대표 그림 프롬프트, 음악 지시를 그대로 옮겼고, 끝에 도구와 비용, 시도 횟수를 정리했다.
이 글은 유튜브 영상의 짝 글이다. 영상은 https://youtu.be/LdE42VgEs0A 에 있다(10월 7일 오전 7시 공개).
만든 다섯 편
| 편 | 길이 | 내용 |
|---|---|---|
| Opus 3D 게임 쇼츠 | 35초 | 지난번 올린 Opus 5.5 게임 영상의 화면과 내 목소리로 만든 세로 쇼츠 |
| 400살 그린란드상어 | 24.6초 | 주인공 상어만 Meshy 3D 모델로, 배경은 그림 열 장으로 |
| 공룡 Vox 해설 | 35초 | 뼈만 남은 공룡의 생김새를 어떻게 알아내는지 |
| 수분 세럼 광고 | 18초 | 가상 제품 「한 방울」. 유리병을 three.js 코드로 직접 만들었다 |
| 고양이 배틀 만화 | 25초 | 90년대 소년 배틀만화 느낌의 종이 만화. 책장이 3D로 휘며 넘어간다 |
모두 세로 1080x1920, 30fps다. 조립과 렌더는 Remotion, 3D는 three.js, 음악은 파이썬으로 MIDI를 작곡해 FluidSynth로 소리를 냈다.
어떻게 시켰나
Claude Code 세션을 두 층으로 나눠 돌렸다.
- 메인 세션: 내가 대화하는 세션이다. 기획을 하고, 작업 지시서를 쓰고, 결과를 검사했다.
- 작업 세션: 편마다 하나씩 띄운 세션이다. 지시서를 읽고 그림을 뽑고, Remotion 코드를 짜고, 렌더하고, 스스로 검사한 뒤 보고했다. 모두 Opus 5.5에 effort는 xhigh로 두었다.
그래서 이 글의 프롬프트는 세 종류다.
- 내가 메인 세션에 한 말. 대부분 한두 문장이었다. 「좀 지루하다」, 「핵심 인물인 상어가 좀 지루하지만 나아졌다」, 「최대한 잘 만들어 보자」 같은 식이다.
- 메인 세션이 그 말을 받아 쓴 작업 지시서. 아래에 옮긴 지시서는 대부분 이것이고, 내가 직접 쓴 글이 아니다.
- 작업 세션이 Codex 이미지 생성에 보낸 그림 프롬프트(영어).
원문에서 바꾼 것은 세 가지다. 영상 내용과 관계없는 내 컴퓨터 경로, 작업 환경, 녹화 원본 사정은 빼거나 … 로 표시했다. 너무 길거나 앞 판과 같은 부분은 [… 줄임] 으로 줄였다. 구분 기호로 쓴 가운뎃점은 쉼표로 바꿨다. 나머지는 파일에 적힌 그대로다.
영상에서 소개한 프롬프트 다섯 개
영상에 띄운 카드 다섯 장이다. 화면에 맞게 줄였지만 내용은 실제 지시 그대로다. 원문 전체는 아래 편별 절에 있다.
1. 볼거리 규칙
상어 첫 판이 65초 가운데 42초 동안 거의 멈춰 있었고, 둘째 판에서는 상어가 종이 인형처럼 미끄러지기만 했다. 그 두 번을 보고 공통 지시서에 더한 규칙이다. 그전 지시서에는 과하게 움직이지 말라는 말만 있었고, 최소한 이만큼은 움직이라는 말이 없었다.
볼거리 (지루함 막기)
- 3~4초마다 새 볼거리가 하나 생긴다: 구도 바꾸기, 카메라 이동, 새 요소 등장, 크기나 시점의 변화. 같은 구도는 5초를 넘기지 않는다.
- 한 편에 구도 종류를 5가지 이상 쓴다 (와이드, 클로즈업, 아래에서 올려다보기, 위에서 내려다보기, 화면 나누기 등).
- 조용한 대목은 느리게 움직이는 것이지 멈추는 것이 아니다.
- 그 편의 핵심(대비, 숫자, 반전)은 화면의 주인공 크기로 보여 준다.
- 주인공(동물, 캐릭터)은 이동만 하지 않고 장면마다 하나씩 반응한다 (고개, 눈, 입, 숨, 몸 돌리기).
[…] 첫 2초, 음악 편, 불쾌한 대상에 관한 세 줄은 줄임
2. 완료 판정
눈으로 대충 보지 말고 렌더한 영상을 숫자로 검사하게 한 기준이다. 숫자를 맞추려고 쓸데없는 흔들림을 더하는 것도 막았다.
완료 판정 (렌더 뒤 반드시 숫자로 검사)
정지 프레임 몇 장으로는 지루함을 잡을 수 없다. 렌더한 mp4 로 아래를 돌리고 결과를 노트에 붙인다.
.venv/bin/python tools/motion_check.py out/<편>.mp4
- 거의 정지한 초의 비율이 25% 이하, 같은 구도가 이어진 가장 긴 구간이 6초 이하여야 한다.
- 이 숫자는 확인용이다. 숫자를 맞추려고 입자, 흔들림, 깜빡임을 더하지 않는다. 볼거리 규칙대로 구도와 장면을 바꿔서 맞춘다.
- 실패하면 고쳐서 다시 렌더한다. 세 번 다시 해도 못 넘으면 멈추고 무엇이 걸리는지 보고한다.
3. 그림 프롬프트
사진도 3D도 아닌 손으로 그린 그림이라고 분명히 적고, 배경은 나중에 지우기 쉽게 한 가지 색으로 칠하게 했다. 상어가 사람 얼굴처럼 나왔을 때는 눈 크기와 입 모양을 하나씩 짚어서 고쳤다.
STYLE (most important): a hand-painted natural-history book illustration, digital gouache / oil painting. […] It must look PAINTED by hand, NOT a photograph, NOT a 3D render, NOT CGI.
Background: perfectly flat solid pure magenta #ff00ff (RGB 255,0,255) chroma key, no gradient, no shadow. Shark contains no magenta or pink.
Targeted correction: The current eye, nostril and mouth are too prominent and face-like.
- Reduce the visible side eye to about ONE THIRD of its current diameter: a TINY circular solid dark eye […] no eyelid, no white, no facial expression.
- Remove the conspicuous oval opening on the front of the snout completely. […] Put only a tiny barely perceptible nostril on the UNDERSIDE of the snout.
- Completely close the mouth. […] No lips, no teeth, no frown, no smile.
4. 겹쳐 그리기
공룡 뼈대 그림을 기준으로 주고, 자세와 위치는 그대로 둔 채 근육만 덧칠하게 했다. 뼈대, 근육, 피부, 깃털 네 장이 위치를 따로 맞추지 않아도 겹쳐진 것이 이 덕분이다.
Input image 1: EDIT TARGET and absolute pixel-registration reference. Edit this exact skeleton image by painting its MUSCLE layer over it.
PRIMARY REQUEST / CRITICAL INVARIANTS: This is the same Velociraptor in the exact same pose. Keep identical canvas, framing, margins, size, position […]. Paint over the source as if tracing it. Do not translate, rotate, scale, mirror, re-pose, or recompose any part.
Subject change only: reconstruct the anatomical musculature directly on this skeleton […]. Muscle wraps existing anatomy without changing pose or endpoints.
5. 대본 검사
상어 3D 판이 말하다 만 것처럼 끝난 뒤 만든 짧은 영상 대본 규칙의 검사 항목이다. 목소리를 만들기 전에 원고부터 검사한다.
원고 검사 (TTS 전에)
1. 첫 문장만 들어도 궁금한가.
2. 마지막 문장만 들어도 끝난 느낌이 드는가. 질문, "~지도 모릅니다", 접속사로 끝나면 실패.
3. 처음과 끝이 짝을 이루는가 (장면이든 문장이든).
4. 문장마다 사실이 하나인가. 숫자가 나오는 문장은 화면 글자로 같은 숫자를 보여 줄 수 있는가.
5. 단정할 수 없는 사실은 원고에서도 단정하지 않는가.
다섯 가지를 통과한 원고만 TTS 로 넘긴다.
편마다 실제 원문
Opus 3D 게임 쇼츠
시작은 지난번에 올린 「Claude Opus 5.5에 게임 하나 맡겼더니… 40분 뒤 이게 나왔습니다」 영상이었다. 그 영상의 화면과 내 목소리로 쇼츠를 만들어 달라고 했고, 새 내레이션은 만들지 않았다. 처음에는 스타일이 다른 시안 셋(큰 글자 쇼츠, 타임랩스 대시보드, 안개 트레일러)을 동시에 받았다.
큰 글자 쇼츠 방향은 좋았지만 억지스럽다고 했더니, 메인 세션이 1차 시안의 코드와 프레임을 세어 보고 35초 동안 화면이 25번 흔들리고 15번 번쩍였다는 분석과 2차 원칙을 썼다. 2차 시안 셋 가운데 고른 것이, 위에는 말한 문장이 한 줄씩 올라오고 아래 둥근 액자에 근거 화면이 나오는 「에디토리얼」 판이다.
작업 지시서
1차 공통 지시서 (BRIEF.md)
# 모션 그래픽 시안 3종 — 공통 브리프
사용자(StefanCho 개발 채널 운영자)가 최근 영상 하나를 모션 그래픽으로 만들어 보는 테스트를 맡겼다. 세 작업자가 서로 다른
방식으로 한 편씩 만든다. 이 파일은 셋이 같이 읽고, 자기 시안 지시는 `briefs/vN.md` 에 있다.
## 고른 영상
「Claude Opus 5.5에 게임 하나 맡겼더니… 40분 뒤 이게 나왔습니다」 https://youtu.be/7gyIit5TtsI
(7분 2초, 10월 2일 공개, 하루 만에 조회 8,300회로 최근 영상 중 가장 빠름. Higgsfield 후원 영상)
내용: Claude Code(Claude 앱의 Code 탭)에서 Opus 5.5 에 effort 를 Extra 로 올리고, Higgsfield MCP 를 연결해 프롬프트
한 번으로 3D 탑다운 디펜스 게임 「등불지기 — 안개가 오는 밤」을 만들었다. 에셋(컨셉 이미지, 3D 모델)은 전부 Higgsfield
MCP 의 Generate Image, Generate 3D 도구로 뽑았고, 게임은 Godot 엔진으로 만들어 웹 브라우저에서 돈다. 약 40분 걸렸고
201 크레딧을 썼다. 영상 맨 앞에는 이 게임으로 만든 55초짜리 시네마틱 인트로가 있다.
모션 그래픽이 전해야 할 한 줄: **3D 게임 코드를 짜 본 적 없는 사람이, 프롬프트 한 번으로 40분 만에 3D 게임을 만들었다.**
## 사용자 요청 (원문 요지)
- 영상 전체가 아니라 모션 그래픽으로 만들면 좋을 핵심 구간만 쓴다.
- 새 내레이션(TTS, 새 녹음)은 만들지 않는다. 영상 안의 화면을 쓰고, 목소리는 영상에서 필요한 만큼 따서 쓴다.
- 세 시안은 서로 비슷하지 않게, 가장 임팩트 있고 시선을 끄는 방식으로.
## 작업 위치
- 작업 폴더: `…/2026-10-04-opus55-game/`
- Remotion 프로젝트: 그 아래 `remotion/` (Remotion 4.0.506, React 19, pnpm 설치 끝남). git repo 아님. 커밋, 업로드, 게시 금지.
- 컴포지션은 이미 등록돼 있다: `V1Kinetic`, `V2Timelapse`, `V3Cinematic`. 각 시안의 크기, 길이는 `src/vN/config.ts`, 본체는
`src/vN/Main.tsx`. **자기 `src/vN/` 폴더, `public/vN/`(필요하면 만든다), `out/vN-*` 만 만진다.** `Root.tsx`, 다른 시안 폴더,
`public/` 의 공용 소재는 고치지 않는다(세 작업자가 동시에 돈다).
- 설치된 패키지: remotion, @remotion/cli, transitions, shapes, paths, noise, media-utils, google-fonts, motion-blur ,
layout-utils, zod. 더 필요하면 `pnpm add <pkg>@4.0.506`(Remotion 계열은 버전을 맞춘다) — 다른 작업자도 쓰는 폴더라 꼭 필요할 때만.
- 렌더: `cd remotion && pnpm exec remotion render src/index.ts V1Kinetic out/v1-kinetic.mp4 --concurrency 3`.
세 명이 동시에 렌더하므로 `--concurrency 3` 을 넘기지 않는다. 다듬는 중에는 `remotion still`, `--frames=a-b`, `--scale 0.5` 로
부분만 본다. 타입 검사 `pnpm exec tsc -p .`.
## 소재 (`remotion/public/`, 코드에서는 `staticFile("clips/…")`)
### 화면 — `clips/` (모두 1920x1080 30fps. 원본 녹화에서 잘라 자막이 없다)
| 파일 | 길이 | 소리 | 내용 |
|---|---|---|---|
| `intro_cinematic.mp4` | 55s | 내레이션+BGM+효과음 | 영상 맨 앞 시네마틱. 이끼골 마을 등불 → 안개 → 화로 → 굴러오는 바위 트롤 → 등불 탑 → 거석 → 마지막에 「등불지기 / 안개가 오는 밤」 타이틀. 자막 시각은 `intro_cinematic.cues.txt`, `intro_cinematic.ko.srt` |
| `prompt_send.mp4` | 16s | 없음 | Claude 앱(밝은 화면) 입력창에 게임 프롬프트를 붙여 넣고 보낸 직후. 아래쪽 모델 표시 「Opus 5.5, Extra」 |
| `effort_connectors.mp4` | 50s | 없음 | 폴더 고르기 → effort 를 Extra 로 → 커넥터에 Higgsfield → 도구 권한 |
| `model3d_first.mp4` | 16s | 없음 | 채팅 안 Higgsfield `generate_3d` 위젯이 「Generating」 → 첫 3D 모델(울타리)이 검은 뷰어 안에서 도는 장면. 위젯은 화면 가운데 열 |
| `timelapse_build_x30.mp4` | 68.5s | 없음 | 프롬프트 전송 직후부터 첫 게임 화면까지 30배속. 이미지, 3D 생성 위젯이 줄줄이 지나간다. 클립 t초 = 프롬프트 전송 뒤 실제 t×30초 |
| `game_first_shot.mp4` | 12s | 없음 | 채팅 안에 첫 게임 스크린샷이 뜨는 장면 |
| `timelapse_polish_x30.mp4` | 33.9s | 없음 | 첫 게임 화면 뒤 다듬기 + 게임을 옆에 띄우고 고치는 구간 30배속. 클립 t초 = 프롬프트 전송 뒤 실제 2056 + t×30초 |
| `title_screen.mp4` | 25s | 없음 | Chrome 에서 게임 로딩 → 「등불지기 / 안개가 오는 밤」 타이틀 화면과 「불씨 지키러 가기」 버튼(약 3초부터) |
| `gameplay.mp4` | 160s | 게임 소리 | 실제 플레이. 탑 세우기, 업그레이드, 웨이브, 카메라 확대와 각도 바꾸기. 위쪽 브라우저 줄은 잘라 낸다 |
화면 녹화 원본은 데스크톱 전체(1920x1080)라 글자가 작다. 그대로 쓰지 말고 볼 곳을 잘라 확대한다.
### 목소리 — `audio/`
- `vo-norm.wav` (5분 24초, 48kHz mono): 사용자 본인 목소리로 녹음한 본편 내레이션 원본(배경음 없이 깨끗하다).
`vo-transcript.txt` 가 문장 시각, `vo-words.json` 이 단어 시각(whisper). 받아 적기 오류가 있다: 힉스피드 → Higgsfield,
오퍼스 → Opus, 애폴트 → effort, 고도 → Godot, 클러드 → Claude, 제너레이트 → Generate. **화면 글자는 바른 표기로 쓴다.**
- `intro_narration.wav` (55s): 시네마틱 인트로의 노인 화자 내레이션만 따로. 시각은 `clips/intro_cinematic.cues.txt` 와 같다.
자주 쓸 만한 대사 (vo-norm.wav 기준 초, 앞뒤 숨소리까지 직접 들어 보고 자른다):
| 시작–끝 | 대사 |
|---|---|
| 78.04–81.62 | 3D 탑다운 디펜스 게임을 하나 만들어 보겠습니다 |
| 103.30–106.76 | 에셋은 전부 Higgsfield MCP로 만듭니다 |
| 106.76–112.80 | 그러니까 Higgsfield MCP로 이미지도 뽑고 3D 모델까지 전부 뽑아내는 겁니다 |
| 119.94–124.58 | Generate Image 도구도 뜨고 / Generate 3D 도구도 뜹니다 |
| 129.38–133.26 | 대략 총 40분 정도 걸렸습니다 |
| 140.10–144.28 | 그리고 작업이 다 끝났고 화면을 보면 이렇게 플레이할 수 있게 완성이 되었습니다 |
| 194.32–196.70 | 3D로 게임을 만들면 이런 게 장점이죠 |
| 203.16–207.02 | 이 에셋들을 전부 프롬프트 한 번으로 만든 겁니다 |
| 231.86–235.30 | 조금 더 확장하면 10분 20분짜리 게임도 만들 수 있겠죠 |
| 245.36–249.22 | 저는 3D 게임을 직접 코드로 짜서 만들어 본 경험이 없습니다 |
| 250.58–261.00 | 그런데도 이렇게 프롬프트 한 번으로 에셋을 만들고 게임까지 만들 수 있었고요 (중간에 긴 쉼이 있다) |
| 311.68–314.76 | 크레딧은 총 201 크레딧을 사용했습니다 |
### 게임 자체의 소리와 그림 (영상 안에서 들리고 보이는 것, 보조 소재)
- `game-audio/`: 게임 BGM `title.m4a`(40s), `battle.m4a`(40s), `ambience.mp3`, 효과음 `lantern_shot`, `ember_burst` ,
`stone_break`, `hearth_hit`, `build`, `bell`, `wave_start`, `victory`, `defeat`, `boss`, `mushroom_pop`, `click`.
- `concepts/`: Higgsfield Generate Image 로 뽑은 컨셉 이미지 13장(화로, 등불 탑, 박격포 탑, 종 탑, 조약돌, 버섯, 바위 적,
보스, 나무, 오두막, 받침, 울타리)과 타이틀 키아트 `keyart.png`.
- 이것들은 보조다. 주인공은 영상 화면과 사용자 목소리다.
## 사실 규칙
- 숫자, 사실은 영상에 나온 것만: 프롬프트 한 번, 약 40분(영상 표현 「대략 총 40분 정도」), 201 크레딧, 탑 3가지와 업그레이드,
5분짜리 게임, Opus 5.5, effort Extra, Higgsfield MCP(Generate Image, Generate 3D), Godot, 웹 브라우저에서 플레이.
- 그 밖의 숫자(모델 개수, 이미지 장수 등)는 소재에서 직접 세어 확인한 경우에만 쓰고, 어떻게 셌는지 notes 에 적는다.
- 대사를 잘라 붙여 원래 뜻과 다른 말을 만들지 않는다.
- 브랜드 표기: Claude Code, Opus 5.5, Higgsfield, Godot. 로고 이미지는 화면 녹화에 찍힌 것 말고 새로 가져오지 않는다.
## 품질 기준과 확인
- 길이 30~45초, 30fps. 첫 1.5초 안에 눈을 잡는 장면이 있어야 한다(피드에서 넘기기 전).
- 한글 글꼴은 @remotion/google-fonts 의 한글 지원 글꼴(Noto Sans KR, Black Han Sans, Do Hyeon, Gowun Batang, Nanum Myeongjo,
Noto Serif KR, IBM Plex Sans KR 등)을 쓴다. 렌더한 프레임에서 한글이 두부(□)나 대체 글꼴로 나오지 않는지 본다.
- 소리: 목소리가 음악, 효과음에 묻히지 않게(말할 때 음악 -12dB 안팎으로 내린다), 완성본은 `ffmpeg -af loudnorm=I=-14:TP=-1.5`
두 번 측정 방식이든 한 번이든 통합 음량 약 -14 LUFS, 피크 -1 dBTP 아래. 측정값을 notes 에 적는다.
- 렌더 뒤 반드시 프레임을 뽑아 직접 본다(예: 1초 간격 콘택트시트). 글자 잘림, 화면 밖으로 나간 요소, 검은 프레임, 늦거나 빠른
자막, 개인 정보 노출을 찾고 고친다. 최소 한 번은 보고 → 고치고 → 다시 렌더한다.
- 같은 방식의 다른 시안과 겹치지 않게 자기 시안의 방향을 지킨다(다른 둘의 방향은 `briefs/` 에 있다, 읽기만).
## 산출물
- `remotion/out/vN-<이름>.mp4` — 완성본
- `remotion/out/vN-sheet.jpg` — 완성본 콘택트시트(1초 간격)
- `remotion/out/vN-notes.md` — 콘셉트 한 단락, 구간별 구성표(시각, 화면, 소리, 글자), 쓴 소재와 원본 시각, 확인한 것(음량
측정값, 프레임 점검 결과), 남은 문제와 더 해 볼 만한 것. 한국어로, 처음 보는 사람이 읽을 수 있게.
끝나면 마지막 메시지에 `VN_DONE` (예: `V1_DONE`) 과 산출물 경로를 적는다. 사람 판단이 꼭 필요한 일이 생기면 추측으로 넘기지 말고
그 지점에서 멈추고 무엇이 필요한지 적는다.
1차 「큰 글자 쇼츠」 시안 지시 (briefs/v1.md)
# V1 — 키네틱 타이포 쇼츠 「말이 화면을 때린다」
컴포지션 `V1Kinetic`, 1080x1920 세로, 30~40초. 산출물 이름 `out/v1-kinetic.mp4`.
## 방향
유튜브 쇼츠, 릴스 피드에서 엄지를 멈추게 하는 세로 영상. 화면의 주인공은 **글자**다. 사용자 목소리의 단어가 말하는 순간에
맞춰 화면을 때리듯 등장하고(`audio/vo-words.json` 단어 시각에 프레임 단위로 맞춘다), 핵심어는 화면을 꽉 채울 만큼 커진다.
게임 화면은 글자 뒤에서, 또는 거대한 글자의 안쪽(글자 모양 마스크)으로 보인다.
- 핵심어 후보: 「경험 없음」 「프롬프트 한 번」 「40분」 「201」 「3D」 「완성」. 숫자는 카운트업이나 슬롯 회전처럼 움직여도 좋다.
- 리듬: 빠른 컷, 단어가 박힐 때 짧은 줌 펀치, 화면 흔들림, 플래시. 효과음은 `game-audio/` 의 `lantern_shot`, `stone_break` ,
`ember_burst`, `build` 같은 게임 소리를 타격음으로 쓴다. 음악은 `battle.m4a` 를 낮게 깔고 마지막에 올린다.
- 색: 거의 검정 바탕 + 등불지기 타이틀의 따뜻한 등불 주황 + 오프화이트. 굵은 한글 디스플레이 글꼴(Black Han Sans 등).
- 화면 소재: 게임 플레이, 시네마틱 인트로를 세로로 잘라(가운데 화로, 탑이 보이게), `model3d_first` 의 3D 위젯,
`prompt_send` 의 프롬프트 입력창을 잘라 확대. 데스크톱 전체 화면을 축소해 넣지 않는다.
## 구성 예시 (바꿔도 된다)
1. 0~2초 훅: 「저는 3D 게임을 직접 코드로 짜서 만들어 본 경험이 없습니다」 — 「경험 없음」이 화면을 깨며 박힌다.
2. 프롬프트 한 번: 프롬프트 입력창 확대, 「프롬프트 한 번」.
3. Higgsfield MCP: Generate Image, Generate 3D, 3D 모델이 도는 위젯.
4. 「40분」: 거대한 숫자, 30배속 타임랩스 조각이 숫자 안에서 흐른다.
5. 완성 → 게임 플레이 몽타주(카메라 각도 바꾸는 장면, 탑 공격), 「201 크레딧」.
6. 끝 카드: 「프롬프트 한 번. 40분. 3D 게임.」 + 「등불지기」 화면.
세로 안전 영역: 위 아래 각 250px 안에는 중요한 글자를 두지 않는다(쇼츠 UI 가 덮는다).
2차 지시서: 1차가 과해 보인 이유와 2차 원칙 (BRIEF2.md)
# 2차 시안 3종 — 「큰 글자 쇼츠」를 자연스럽게
1차 시안 셋 중 사용자가 「큰 글자 쇼츠」(V1, `out/v1-kinetic.mp4`) 방향을 골랐다. 다만 "억지스러운 연출이 있다, 더 자연스러운
모션 그래픽으로" 라는 피드백이다. 같은 소재, 같은 세로 형식으로 자연스러운 판을 세 가지 방식으로 만든다.
공통 사항(작업 폴더, 소재, 사실 규칙, 개인 정보, 음량, 산출물 형식)은 [BRIEF.md](BRIEF.md) 를 그대로 따른다. 이 파일은 거기에
더해지는 것만 적는다. 자기 시안 지시는 `briefs/v4.md`, `v5.md`, `v6.md`.
## 1차 큰 글자 쇼츠가 과해 보인 이유 (메인 세션 분석)
`src/v1/timeline.ts` 와 렌더 프레임을 세어 본 결과다. 35초 안에 화면 흔들림, 줌 펀치 25번(1.4초마다), 번쩍임 15번(2.3초마다),
게임 타격 효과음 약 30번, 장면 12개(평균 2.9초)였다.
1. **화면 에너지가 목소리와 안 맞는다.** 내레이션은 담담한 후기 말투인데 화면은 액션 트레일러처럼 계속 때린다. 귀와 눈이 다른
이야기를 해서 억지로 흥분시키는 느낌이 난다.
2. **강조에 위계가 없다.** 말한 단어 거의 전부(49개 중 대부분)가 큰 글자가 됐다. 「직접」 「짜서」 「전부」 「까지」 같은 말까지 커지니
정작 「프롬프트 한 번」 「40분」이 덜 보인다.
3. **같은 말을 두 번 읽게 한다.** 큰 글자 더미와 아래 자막 줄이 같은 문장을 동시에 보여 줘서 눈이 두 곳을 오간다. 큰 글자는
단어가 계단처럼 쌓여 문장으로 안 읽힌다.
4. **효과가 뜻에서 나오지 않았다.** 「경험 없음」에 유리 깨짐, 「201」에 슬롯머신, 「40분」을 0부터 세어 올리기, 3D 글자 회전.
말한 내용과 상관없는 장치라 장식으로 보인다. 「경험이 없습니다」를 「없음」으로 줄인 것도 말투를 바꿨다.
5. **증거가 조연이다.** 이 영상에서 제일 설득력 있는 건 실제로 만들어진 게임과 생성 화면인데, 게임은 어둡게 깔리거나 글자 안에
갇혀 무늬처럼 보이고, Claude 앱 화면은 작게 기울어진 카드라 읽히지 않는다.
6. **장면마다 새 기술이다.** 텍스트 마스크, 깨짐, 번쩍임, 흔들림, 기울어진 카드, 이미지 3프레임 넘김(초당 10장 깜빡임), 카운트업,
슬롯, 외곽선 회전, 주황 빛 번짐까지 10가지 넘는 효과가 35초에 들어갔다. 일관된 움직임 말투가 없어 템플릿 모음처럼 보인다.
7. **소리가 붐빈다.** 단어마다 타격음이 말 첫소리와 겹치고, 「돌 깨지는 소리」 같은 게임 효과음을 뜻과 무관하게 썼다. 전투 음악이
담담한 이야기 밑에 깔렸다.
8. **글꼴이 늘 소리친다.** 가장 굵은 디스플레이 글꼴에 주황 빛 번짐을 거의 모든 글자에 줘서 쉴 곳이 없다.
## 2차 시안의 공통 원칙
- 화면 에너지는 목소리 에너지를 따른다. 담담한 말에는 부드러운 움직임, 숫자나 결론처럼 목소리가 실제로 힘을 주는 곳에만 큰 변화.
- 강조는 한 구(말 덩어리)에 하나까지. 큰 글자는 영상 전체에서 3~4번(예: 프롬프트 한 번, 약 40분, 201 크레딧, 끝 문장).
- 한 시점에 읽을 글은 한 곳. 큰 글자를 띄우는 동안 자막을 숨기거나, 자막만 쓴다. 말한 그대로 쓰고 말투를 바꾸지 않는다.
- 효과 종류는 3~4가지로 정하고 영상 내내 같은 방식으로 반복한다(그 시안의 움직임 말투).
- 게임 화면과 Claude 앱 화면이 주인공이다. 크게, 밝게, 읽히게. 볼 곳으로 카메라가 천천히 다가가는 식으로 보여 준다.
- 금지: 화면 흔들림, 번쩍임, 유리 깨짐, 슬롯머신, 글자 안에 영상 넣기, 3프레임 이하 이미지 넘김, 단어마다 타격음, 모든 글자 빛 번짐.
- 소리: 음악은 차분한 쪽(`title.m4a`, `ambience.mp3`, 전투 음악 `battle.m4a` 는 게임 플레이 장면에서만), 말할 때 덕킹.
효과음은 장면 전환에 부드럽게 몇 번만. 게임 효과음은 화면에 그 소리가 날 장면(탑 공격, 종)이 보일 때만.
- 1차 V1 의 대사 조각과 단어 시각(`src/v1/timeline.ts`, `public/v1/vo/`)은 그대로 가져다 써도 된다. 읽기만 하고 고치지 않는다.
필요하면 자기 폴더에 복사한다.
## 이 영상에 맞는 효과 (조사 결과)
웹 조사(sonnet 조사 에이전트, 2026-10-05) 요약. 출처가 확인된 것과 추측을 나눴다. 수치는 30fps 기준 출발점이고, 자기 시안에서
보고 조정한다. 각 시안은 이 중 3~4가지를 골라 끝까지 반복한다.
근거가 있는 원칙
- 모든 단어가 움직이면 위계가 사라진다. 모션은 뜻을 강화할 때만, 순서와 속도 차이로 위계를 만든다
(https://hackernoon.com/kinetic-typography-quickstart-guide-for-devs-designers-d5c6b5545ade).
- 쇼츠 자막: 한 번에 5~7단어 이내, 최대 2줄, 1.5~3초 노출, 소리보다 0.1~0.3초 먼저. 위 20%와 아래 25%는 쇼츠 UI 가 덮으므로
가운데 쪽에 둔다(https://www.opus.pro/blog/youtube-shorts-caption-subtitle-best-practices). 강조는 형광펜처럼 핵심어에만
(https://subclip.app/blogs/animated-captions-2026-best-practices-reels-shorts-x-exporting-srt).
- 등장 0.5~0.8초, 퇴장은 등장의 약 75%, 등장은 감속(ease-out).
- Linear 런치 영상 방식: 카메라가 실제 제품 화면 속을 한 번에 한 동작씩 지나간다(https://getlago.com/blog/we-killed-our-motion-design-job).
- Screen Studio 방식: 볼 곳으로 자동 줌, 줌 구간에 모션 블러, 줌은 필요한 곳에만(https://www.screen.studio/guide/animations-motion).
- 카운트업은 숫자 첫 등장에 한 번, 짧게. 숫자가 바로 읽혀야 하면 쓰지 않는다.
- 소리: 우쉬는 움직임 길이에 맞추고, 라이저는 정점을 화면 변화와 맞춘다. 트레일러의 힘은 타격 직전의 고요라서 단어마다
타격음을 넣으면 반대가 된다(https://violetrecording.com/sound-design-for-trailers/). 덕킹은 내레이션 뒤에서 느리게
(빠르면 음악이 들락거린다, https://blog.adobe.com/en/publish/2017/11/02/audition-deep-dive-auto-ducking-music).
- Remotion `spring` 기본값(damping 10)은 튕긴다. 튕김 없는 감속은 `damping: 200` (https://www.remotion.dev/docs/spring).
효과 후보 (구현 수치는 조사 에이전트 권장값, 추측 포함)
| 효과 | 이 소재에 맞는 이유 | Remotion 구현 출발점 |
|---|---|---|
| 말 덩어리 자막, 핵심어 하나만 색이나 굵기 | 담담한 말투와 맞고 위계가 생긴다 | opacity 0→1 과 translateY 12px, spring damping 200, 약 15프레임 |
| 블러 인 등장 | 조용한 등장, 큰 글자 몇 번에만 | blur 8px→0, 20프레임, `Easing.out(Easing.cubic)` |
| 화면 녹화 카메라 줌, 팬 | Claude 앱 글자가 작아서 볼 곳으로 다가가야 읽힌다 | scale 1.0→1.8 과 translate, `Easing.bezier(0.16,1,0.3,1)`, 30~45프레임 |
| 줌 구간 모션 블러 | 빠른 이동을 부드럽게 | 속도에 비례한 blur, 최대 3px (또는 @remotion/motion-blur) |
| 스포트라이트 | 생성 위젯, 프롬프트 줄처럼 한 곳을 가리킬 때 | 주변 어둡게 0→0.6, 12프레임 |
| 느린 켄 번스 | 게임, 시네마틱 장면을 살아 있게 | 4초에 scale 1.0→1.06, 거의 선형 |
| 밝은 UI 에서 어두운 게임으로 디졸브 | 밝기 차이가 큰 두 소재를 잇기 | `@remotion/transitions` fade + springTiming, 20프레임 |
| 매치 컷 (추측) | 채팅 속 작은 결과물이 실제 게임으로 커진다 | 같은 사각형을 scale 로 키우다 컷 |
| 속도 램프 | 30배속 작업이 첫 3D 모델에서 내려앉기, 전투 순간 | 원본 프레임 매핑을 interpolate 로 (배속 클립은 시각 대응을 직접 계산) |
| 「40분」은 정적 등장 또는 1초 안 한 번 카운트 | 시간을 0부터 세는 건 어색하다 | 정수만, 24프레임 이내 |
| 「201 크레딧」은 작은 설명과 숫자를 크기로 나눔 | 세어 올리지 않아도 충분히 읽힌다 | 페이드 또는 블러 인 |
| 「프롬프트 한 번」은 실제 입력창 장면을 그대로 확대 | 효과 대신 실제 화면이 증거 | 클립 확대, 필요하면 문장 줄 하이라이트 |
| 약한 비네팅과 색 맞춤 (추측) | 밝은 UI 컷과 어두운 게임 컷의 간극 줄이기 | 가장자리 어둡게, 채도, 밝기 소폭 |
| 소리: 전환에만 짧은 우쉬, 음악은 느리게 덕킹, 마지막 숫자나 결론에만 낮은 붐 한 번 | 고요가 있어야 한 번의 강조가 산다 | `<Audio volume={(f)=>...}>` 프레임별 볼륨 |
우쉬, 붐 같은 소리 파일은 `public/` 에 없다. 새로 만들려면 ffmpeg 로 합성(분홍 소음에 필터와 페이드, 낮은 사인파에 감쇠)해 자기
`public/vN/` 에 두고 notes 에 만든 방법을 적는다. 외부에서 내려받지 않는다.
채택된 「에디토리얼」 시안 지시 (briefs/v5.md)
# V5 — 정돈된 타이포 「에디토리얼 쇼츠」
컴포지션 `V5Editorial`, 1080x1920 세로, 30~40초. 산출물 `out/v5-editorial.mp4`, `out/v5-sheet.jpg`, `out/v5-notes.md`.
## 방향
1차 큰 글자 쇼츠의 장점(글자가 이야기를 끌고 간다)은 살리고, 제품 발표 영상처럼 정돈된 타이포로 바꾼다. 위쪽에는 말한 문장이
한 줄씩 차분히 올라오고(마스크 안에서 아래에서 위로 밀려 나오는 등장), 아래쪽에는 둥근 모서리 액자 안에 그 말을 증명하는 화면이
있다. 큰 글자는 문장 속 핵심어 하나만 크기나 색으로 키우고, 나머지는 보통 굵기다.
- 움직임 말투: 줄 단위 마스크 등장(8~12프레임, 감속), 액자 안 화면은 천천히 확대되는 정도, 장면이 바뀔 때는 액자가 크기와
위치를 바꾸며 다음 화면으로 이어진다(같은 액자가 계속 살아 있는 느낌). 이 셋 정도로 끝까지.
- 글꼴: 굵기 단계가 있는 한글 산세리프(Pretendard 계열이 없으면 Noto Sans KR 이나 IBM Plex Sans KR)로 위계를 굵기와 크기로만
만든다. 빛 번짐, 외곽선, 그림자 없이. 배경은 아주 어두운 단색이나 게임 화면을 강하게 흐린 것.
- 숫자는 세어 올리지 말고 숫자 자체가 한 번 자리 잡는 등장으로. 고정폭 숫자.
- 자막 줄을 따로 두지 않는다. 위쪽 문장이 곧 자막이다(같은 말을 두 곳에 쓰지 않는다).
- 소리: `ambience.mp3` 와 `title.m4a` 를 낮게, 줄이 바뀔 때 아주 작은 클릭이나 숨소리 같은 소리 정도.
그림 프롬프트
이 편은 새 그림을 뽑지 않았다. 원래 영상의 화면 녹화와 게임 안 음악, 효과음만 썼다.
음악과 소리 지시
2차 지시서의 소리 원칙과 채택된 시안의 소리 지시다.
- 소리: 음악은 차분한 쪽(`title.m4a`, `ambience.mp3`, 전투 음악 `battle.m4a` 는 게임 플레이 장면에서만), 말할 때 덕킹.
효과음은 장면 전환에 부드럽게 몇 번만. 게임 효과음은 화면에 그 소리가 날 장면(탑 공격, 종)이 보일 때만.
- 소리: `ambience.mp3` 와 `title.m4a` 를 낮게, 줄이 바뀔 때 아주 작은 클릭이나 숨소리 같은 소리 정도.
결과물에는 내 대사 조각 9개를 쓰고, 게임 음악과 환경음을 말할 때 대사보다 약 12dB 낮게 깔았다. 장면 전환에는 코드로 합성한 공기 소리를 10번, 끝 문장에만 낮은 울림을 한 번 넣었다. 완성본 음량은 -14.0 LUFS다.
400살 그린란드상어
400년 가까이 사는 그린란드상어 한 마리가 거의 움직이지 않는 동안 위 세상에서는 역사가 흘러간다는 이야기다. 처음 세 판은 그림 몇 장을 코드로 움직인 2D였고, 상어가 몸을 돌릴 때마다 그림 두 장이 겹쳐 보이는 문제가 남아서 주인공만 3D 모델로 바꿨다. 영상에 나온 것은 마지막 3D 판이다.
| 판 | 길이 | 거의 멈춘 시간 | 작업 세션 시간 | 내 평과 남은 문제 |
|---|---|---|---|---|
| 2D v1 | 65초 | 65% (42초) | 37분 | 「좀 지루하다」, 「눈의 기생충이 징그럽고 기생충 그림도 잘못 뽑힌 것 같다」 |
| 2D v2 | 48.4초 | 6% | 36분 | 「핵심 인물인 상어가 좀 지루하지만 나아졌다」, 「최대한 잘 만들어 보자」 |
| 2D v3 | 51.6초 | 2% | 그림 14분 + 모션 40분 | 몸을 돌릴 때 그림 두 장이 반투명하게 겹쳐 보였다(평은 따로 남기지 않았다) |
| 3D v1 | 21.2초 | 9% | 26분 47초 + 고치기 5분 36초 | 「영상은 잘 만든 것 같은데, 시나리오가 말하다가 그냥 끊기는 느낌이라 마무리가 필요하다」 |
| 3D v2 | 24.6초 | 4% | 11분 | 영상에 쓴 판 |
3D 모델은 v3에서 뽑은 비스듬한 앞모습 그림 한 장을 Meshy 7 이미지-3D 변환에 넣어 만들었다(텍스처 2K, 약 4만 삼각형). 30크레딧이 들었고, Blender로 여덟 방향을 돌려 보니 꼬리와 지느러미, 무늬가 모두 이어져 있어서 다시 만들지 않았다.
작업 지시서
상어 판부터 쓴 공통 지시서 (BRIEF.md, 볼거리와 완료 판정이 들어간 판)
# 모션 그래픽 다섯 편 — 공통 브리프
사용자(StefanCho 개발 채널 운영자)가 "영상 생성 AI 없이 코드로만 만든 모션 그래픽 5편"을 소개하는 유튜브 영상을 만든다.
다섯 작업자가 한 편씩 만든다. 이 파일은 다섯이 같이 읽고, 자기 편 지시는 `briefs/<편>.md` 에 있다.
목표는 완성도다. 보는 사람이 "이걸 코드로 만들었다고?" 하게 만드는 것.
## 작업 위치
- 작업 폴더: 이 파일이 있는 폴더 (`…/2026-10-05-five-styles/`).
git repo 아님. 커밋, 업로드, 게시 금지.
- Remotion 프로젝트: `remotion/` (Remotion 4.0.506, React 19). 컴포지션은 이미 등록돼 있다
(`Shark`, `Synthwave`, `TRex`, `Cat`, `BlackHole`). 크기와 길이는 `src/<편>/config.ts`, 본체는 `src/<편>/Main.tsx`.
- **자기 편 폴더만 만진다**: `remotion/src/<편>/`, `remotion/public/<편>/`, `assets/<편>/`, `out/<편>*`.
`Root.tsx`, `package.json`, 다른 편 폴더, `tools/` 는 고치지 않는다. 다섯이 동시에 돈다.
패키지가 꼭 더 필요하면 직접 설치하지 말고 보고에 적는다.
## 지킬 것
- **영상 생성 모델 금지** (Higgsfield, Seedance, Sora, Veo, Kling 등). 움직임은 전부 Remotion 코드다.
- **이미지는 Codex 로만** 뽑는다:
`.venv/bin/python tools/imgen.py --provider codex --prompt-file <p.txt> --out assets/<편>/raw/<이름>.png --size 1536x1024`
- 여러 개를 시트 한 장에 뽑는다. 배경은 대상에 쓰지 않는 단색 크로마키(보통 `#ff00ff`), 칸 사이는 넉넉히 띄운다.
- 프롬프트에 항상 no text, no letters, no logo, no watermark. 글자는 코드가 얹는다.
- 크게 확대할 주인공과 화면 전체 배경은 한 장씩 따로 뽑는다 (시트 칸은 해상도가 낮다).
- 움직일 부위(지느러미, 팔, 앞발 등)는 몸과 따로 뽑는다. 애니메이션 프레임을 시트로 뽑지 않는다. 움직임은 코드가 만든다.
- 같은 캐릭터가 여러 장에 나오면 첫 장(앵커)을 `--ref` 로 넘겨 다음 장을 뽑는다.
- 프롬프트에 다른 회사나 채널 이름(Vox, Kurzgesagt 등)을 쓰지 않고 그림체의 특징으로 적는다. 실존 브랜드 디자인 금지.
생성 뒤 눈으로 보고 글자 혼입이나 규칙 위반이면 다시 뽑는다.
- 배경 지우기: `.venv/bin/python tools/remove_chroma_key.py --input <raw> --out <png> --auto-key border --soft-matte --transparent-threshold 12 --opaque-threshold 220 --despill`.
시트는 투명 영역 기준으로 덩어리마다 잘라 낱장 PNG 로 만든다 (자르는 스크립트는 `assets/<편>/` 에 직접 쓴다).
- 코드로 그릴 수 있는 것(글자, 숫자, 선, 격자, 그라데이션, 빛, 입자, 기본 도형, 말풍선)은 이미지로 만들지 않는다.
- 화면 글자는 브리프 문장 그대로 쓴다. 브리프에 없는 사실을 화면에 더하지 않는다. 폰트는 `@remotion/google-fonts` 에서 편에 맞게.
## 움직임 원칙 (지난 시안에서 배운 것)
아래 규칙은 두 방향의 실패를 함께 막는다. 10-04 1차 시안은 35초에 흔들림 25번, 번쩍임 15번으로 억지스러웠다(과함).
10-05 상어 v1 은 그 반대로 65초 중 42초가 거의 정지 화면이었고 13~35초가 같은 구도 한 컷이었다(지루함).
금지 목록은 과함을 막는 것이지 움직임을 줄이라는 뜻이 아니다.
말투(과함 막기):
- 편마다 효과 종류를 3~4가지로 정해 끝까지 같은 방식으로 반복한다. 그것이 그 편의 움직임 말투다.
- 강조는 한 시점에 하나. 크게 힘주는 순간은 편 전체에서 3~4번.
- 금지: 화면 흔들림 연발, 번쩍임, 유리 깨짐, 슬롯머신 숫자, 단어마다 타격음, 모든 글자 빛 번짐, 3프레임 이하 이미지 넘김.
- `spring` 은 `damping: 200` 이 기본(튕김은 의도한 곳에만). 등장은 감속, 퇴장은 등장 길이의 약 75%.
볼거리(지루함 막기):
- 3~4초마다 새 볼거리가 하나 생긴다: 구도 바꾸기, 카메라 이동, 새 요소 등장, 크기나 시점의 변화. 같은 구도는 5초를 넘기지 않는다.
- 한 편에 구도 종류를 5가지 이상 쓴다(와이드, 클로즈업, 아래에서 올려다보기, 위에서 내려다보기, 화면 나누기 등). 장면 표에 구도가 안 적혀 있어도 작업자가 정한다.
- 조용한 대목은 느리게 움직이는 것이지 멈추는 것이 아니다. 화면이 2초 넘게 거의 그대로면 그 구간을 다시 짠다.
- 그 편의 핵심(대비, 숫자, 반전)은 화면의 주인공 크기로 보여 준다. 화면 구석에 작게 두지 않는다.
- 첫 2초 안에 눈을 잡는 그림이 있어야 한다(쇼츠는 첫 2초에 넘긴다).
- 음악 편도 음악 없이 봐서 지루하지 않아야 한다. 음악은 나중에 더하는 것이지 빈 화면을 채우는 수단이 아니다.
- 주인공(동물, 캐릭터)은 이동만 하지 않고 장면마다 하나씩 반응한다(고개, 눈, 입, 숨, 몸 돌리기). 주인공 그림이 한 각도뿐이면 미끄러지는 종이 인형이 된다(상어 v2). 주인공은 2~3 각도와 움직일 부위(턱, 머리 등)를 따로 뽑는다.
- 징그럽거나 불쾌한 대상(기생충, 상처, 벌레)은 클로즈업하지 않는다. 멀리서, 실루엣으로, 또는 그 결과(예: 뿌옇게 보이는 시야)로 보여 준다.
- 화면 에너지는 이야기 에너지를 따른다. 반전이나 숫자에서 크게, 나머지는 "느리지만 계속 바뀌게".
- 세로 편(상어, 고양이)은 쇼츠로도 쓴다. 위 20%, 아래 25% 에 중요한 글자를 두지 않는다(그림과 실루엣은 둬도 된다).
## 소리
- 음악은 메인 세션이 나중에 넣는다. 지금은 넣지 않는다.
- 효과음이 필요하면 ffmpeg 로 합성(분홍 소음에 필터와 페이드, 낮은 사인파에 감쇠 등)해 `public/<편>/` 에 두고 만든 법을 노트에 적는다. 외부에서 내려받지 않는다.
- 나레이션 편(티라노, 블랙홀)은 사용자가 나중에 녹음한다. 지금은 장면 표의 시각대로 만들고,
장면 시작 시각을 `src/<편>/timeline.ts` 한 곳에 모아 녹음이 오면 그 파일만 고치면 맞도록 한다.
나레이션 문장을 임시 자막으로 보이는 스위치 `showScript` 를 config 에 둔다(지금은 켬).
## 단계
1. **에셋 단계.** 자기 브리프의 그림 목록대로 뽑고 잘라 `remotion/public/<편>/` 에 투명 PNG 로 둔다. 원본은 `assets/<편>/raw/`.
모든 낱장을 이름표와 함께 한 장에 모은 `assets/<편>/contact.png`, 목록 `assets/<편>/assets.md`(파일, 쓰임, 프롬프트 요지)를 만든다.
**여기서 멈추고 보고한다.** 메인 세션이 사용자 확인을 받아 "ok" 또는 고칠 점을 보낸다.
2. **모션 단계.** 확정된 에셋으로 컴포지션을 완성한다. 산출물:
- `out/<편>.mp4`
- `out/<편>-sheet.jpg` (1초 간격 콘택트시트)
- `out/<편>-notes.md` (장면 구성표, 고른 효과와 이유, 확인한 것, 남은 문제)
## 완료 판정 (렌더 뒤 반드시)
정지 프레임 몇 장으로는 지루함을 잡을 수 없다. 렌더한 mp4 로 아래를 돌리고 결과를 노트에 붙인다.
.venv/bin/python tools/motion_check.py out/<편>.mp4
- 0.5초 간격 콘택트시트(`out/<편>-sheet-half.jpg`)를 처음부터 끝까지 본다. 연속 10칸(5초) 이상 거의 같은 그림이 이어지면 실패다.
- 거의 정지한 초의 비율이 25% 이하, 같은 구도가 이어진 가장 긴 구간이 6초 이하여야 한다(상어 v1 은 65%, 21.5초). 이 숫자는 확인용이다. 숫자를 맞추려고 입자, 흔들림, 깜빡임을 더하지 않는다. 볼거리 규칙대로 구도와 장면을 바꿔서 맞춘다.
- 노트에 구도 목록(시각, 구도 이름)을 적고 구도 종류 수를 센다(5가지 이상).
- 실패하면 고쳐서 다시 렌더한다. 세 번 다시 해도 못 넘으면 멈추고 무엇이 걸리는지 보고한다.
## 렌더와 부하
- 오래 걸리는 명령을 여러 개 동시에 돌리지 않는다.
- 다듬는 중에는 `pnpm exec remotion still`, `--frames=a-b`, `--scale 0.5` 로 부분만 본다.
- 전체 렌더는 한 번에 한 편만: `mkdir out/.render-lock` 이 성공할 때만 렌더하고 끝나면 `rmdir out/.render-lock`.
실패하면 1분 뒤 다시 시도한다. 렌더는 `--concurrency 2`.
`cd remotion && pnpm exec remotion render src/index.ts <Id> ../out/<편>.mp4 --concurrency 2`
- 타입 검사 `cd remotion && pnpm exec tsc -p .`.
2D v1 편 지시서 (briefs/shark.v1.md)
# 400살 상어 — 컴포지션 `Shark` (1080x1920, 30fps, 65초)
공통 규칙은 [../BRIEF.md](../BRIEF.md). 자기 폴더는 `src/shark/`, `public/shark/`, `assets/shark/`, `out/shark*`.
북극 바다의 그린란드상어 한 마리가 거의 움직이지 않는 동안, 수면 위로는 400년의 역사가 흘러간다.
이 느림과 빠름의 대비가 이 편의 중심이다. 음악과 화면 글자만 쓴다(음악은 나중에).
## 그림체
차분한 자연 다큐멘터리 일러스트. 부드러운 붓 질감, 사실적인 비례. 팔레트는 깊은 남색, 청록, 얼음 흰색, 상어는 회갈색.
세로 화면 위쪽 약 1/4 은 얼음 덮인 수면과 그 위 세상(역사 실루엣이 지나가는 띠), 나머지는 바닷속.
## 장면
| 시간 | 화면 글자 | 화면 |
|---|---|---|
| 0초 | "지금 이 바다 어딘가에" | 얼음 덮인 북극 바다 아래, 어둠 속에서 큰 그림자가 아주 느리게 움직인다 |
| 4초 | "400살 가까이 된 상어가 살고 있을지 모릅니다" | 그림자가 빛 안으로 들어오며 몸길이 5m 의 그린란드상어가 드러난다 |
| 10초 | "태어난 해는 1620년대, 조선 인조 때" | 수면 위 연도 숫자가 2026 에서 1620년대로 거꾸로 감기고, 상어가 새끼 크기로 줄어든다 |
| 16초 | "1년에 1cm도 자라지 않습니다" | 연도가 다시 흐른다. 수면 위로 병자호란이 지나가고, 아래의 상어는 눈에 띄지 않을 만큼 조금씩 길어진다 |
| 23초 | "어른이 되는 건 150살쯤" | 연도가 1770년대에 닿으면 상어 옆에 키 눈금이 붙고, 수면 위로 미국 독립이 지나간다 |
| 29초 | "헤엄치는 속도는 시속 1km 남짓" | 연도가 빨라지는 동안, 얼음 위를 걷는 사람 실루엣이 상어를 앞질러 간다 |
| 35초 | "눈에는 기생충이 매달려 있어 앞을 거의 못 봅니다" | 카메라가 눈으로 다가가면 작은 기생충이 물결에 흔들린다 |
| 41초 | "그런데 배 속에서 북극곰 뼈가 나왔습니다" | 몸이 엑스레이처럼 비치며 배 속에 북극곰과 순록의 뼈가 보인다 |
| 46초 | "이렇게 느린 상어가 어떻게 잡았는지는 아직 아무도 모릅니다" | 물음표 하나가 천천히 떠오른다 |
| 51초 | "나이는 눈으로 쟀습니다" | 눈의 수정체가 나무 나이테처럼 갈라지고, 태어날 때 만들어진 한가운데가 빛난다. 1960년대 핵실험 때 공기 중에 늘어난 탄소가 기준 눈금으로 겹친다 |
| 59초 | "그리고 그 상어는 지금도, 아주 천천히 헤엄치고 있습니다" | 연도 숫자가 2026 에서 멈추고 상어가 어둠 속으로 사라진다 |
화면 연도 표지: 병자호란 1636, 미국 독립 1776, 광복 1945, 달 착륙 1969. 연도 글자는 코드로 쓴다.
## 그림 목록
1. 단독 `shark-body`: 그린란드상어 옆모습 몸통. 꼬리지느러미와 가슴지느러미는 빼고 이음매가 자연스럽게. 둔한 원통형 몸, 작은 눈, 회갈색 피부.
2. 시트 `shark-parts` (1 을 `--ref` 로): 꼬리지느러미, 가슴지느러미 두 개, 눈 하나, 눈에 매달리는 가늘고 흰 기생충 두 마리, 새끼 상어 전신 하나.
3. 단독 `shark-xray`: 1 과 같은 윤곽의 엑스레이판(반투명 푸른 몸, 연골 뼈대).
4. 시트 `silhouettes` (흰 실루엣, 단순한 형태): 북극곰 뼈, 순록 뼈(엑스레이 느낌), 방한복 입고 걷는 사람, 조선 병사, 18세기 범선, 만세 부르는 군중, 깃발 꽂는 우주비행사.
5. 단독 `ice-surface`: 바닷속에서 올려다본 얼음 수면 질감 띠 (가로로 길게, 1536x1024).
코드로 그린다: 바닷속 깊이 그라데이션, 빛줄기, 떠다니는 입자, 연도 카운터, 키 눈금, 물음표, 수정체 나이테(동심원), 탄소 기준 눈금, 화면 글자.
## 움직임 제안
연도 카운터의 속도 변화(거꾸로 감기, 다시 흐르기, 빨라지기, 멈추기)를 축으로 삼는다. 수면 위 실루엣 띠의 흐름 속도를 연도 속도에 묶고,
상어는 꼬리의 느린 사인 흔들림과 몸의 미세한 굴곡만 준다. 카메라는 느린 밀기와 초점(블러) 이동. 이 넷이면 충분하다.
## 사실 근거 (화면 글자 밖의 사실을 더하지 않는다)
- 수명 Nielsen et al. 2016 Science: 눈 수정체 방사성탄소, 최대 개체 392±120년. 오차가 커서 화면은 "~모릅니다"로 단정하지 않는다.
- 1년에 1cm 미만 성장, 약 150살에 성숙. 순항 약 시속 1.2km. 눈 기생 요각류. 위 내용물에서 북극곰과 순록 잔해 보고. 사냥법은 미확정.
2D v1 모션 단계 지시 (motion-task.md)
# 상어 편 모션 단계 지시 (메인 세션, 2026-10-05 21:0x)
이 폴더의 `BRIEF.md` 와 `briefs/shark.md` 를 읽고 상어(`Shark`) 편의 **모션 단계를 렌더까지** 끝낸다.
- 에셋 단계는 끝났고 사용자가 ok 했다. 목록과 주의점은 `assets/shark/assets.md`, 미리보기는 `assets/shark/contact.png`.
`remotion/public/shark/` 의 17장을 쓴다. 새 그림은 꼭 필요할 때만 Codex 로 뽑고 이유를 노트에 적는다.
- 이번에는 상어 한 편만 만든다. 사용자가 이 결과를 보고 나머지 네 편의 진행을 정하므로, 이 편이 다섯 편의 품질 기준이 된다.
BRIEF 의 움직임 원칙(효과 3~4가지를 끝까지 반복, 강조는 한 번에 하나, 금지 목록, 세로 화면의 위 20% 와 아래 25% 에 중요한 글자 두지 않기)을 지킨다.
- 화면 글자는 `briefs/shark.md` 장면 표의 문장 그대로. 수명은 단정하지 않는다.
- 음악은 넣지 않는다(메인 세션이 나중에 넣는다). 효과음도 이번에는 넣지 않는다.
- 자기 편 폴더만 만진다: `remotion/src/shark/`, `remotion/public/shark/`, `assets/shark/`, `out/shark*`. `Root.tsx`, `package.json`, 다른 편 폴더, `tools/` 는 고치지 않는다.
- 파일을 지울 때 `rm` 대신 덮어쓰거나 `assets/shark/trash/` 로 옮긴다.
- 다듬는 중에는 `remotion still`, `--frames`, `--scale 0.5` 로 부분만 보고, 프레임을 직접 눈으로 확인한다.
- 전체 렌더는 BRIEF 의 잠금 규칙(`out/.render-lock`)과 `--concurrency 2` 를 지킨다.
산출물:
- `out/shark.mp4` (1080x1920, 30fps, 65초)
- `out/shark-sheet.jpg` (1초 간격 콘택트시트)
- `out/shark-notes.md` (장면 구성표, 고른 효과와 이유, 확인한 것, 남은 문제)
끝나면 mp4 길이와 용량, 고른 효과, 남은 문제를 다섯 줄 안으로 보고하고 멈춘다. 막히면(패키지가 더 필요함, 렌더 반복 실패 등) 그 자리에서 멈추고 무엇이 막혔는지 보고한다.
2D v2 지시 (motion-task-v2.md)
# 상어 편 v2 지시 (메인 세션, 2026-10-05 22시)
사용자가 v1 을 보고 "좀 지루하다", "눈의 기생충이 징그럽고 기생충 그림도 잘못 뽑힌 것 같다"고 했다.
원인은 작업이 아니라 지시였다. 움직임 원칙에 상한(효과 3~4가지, 힘주는 순간 3~4번, 금지 목록)만 있고 하한이 없었고,
상어 브리프가 같은 와이드 한 컷과 기생충 클로즈업을 정했으며, 완료 판정이 정지 프레임뿐이었다.
고친 지시를 다시 읽고 v2 를 만든다.
- `BRIEF.md` 의 「움직임 원칙」(새로 생긴 「볼거리」)과 「완료 판정」. 옛 판은 `BRIEF.v1.md`.
- `briefs/shark.md` 전체. 옛 판은 `briefs/shark.v1.md`. 길이는 48초 안팎으로 줄이고 `src/shark/config.ts` 도 고친다.
- v1 영상은 `out/shark-v1.mp4`, 그 판정 결과는 `.venv/bin/python tools/motion_check.py out/shark-v1.mp4` (거의 정지 65%, 같은 구도 22초).
할 것:
- v1 코드를 살려 고친다. 연도 곡선, 실루엣 동기화, 눈 이음매, 엑스레이 겹침, 수정체 나이테는 잘 됐다.
- 렌더는 `out/shark.mp4` 로(잠금 규칙과 `--concurrency 2` 그대로). 렌더 뒤 `tools/motion_check.py out/shark.mp4` 를 돌린다.
- 통과 기준: 거의 정지한 초 25% 이하, 같은 구도 가장 긴 구간 6초 이하, 노트에 센 구도 종류 5가지 이상,
0.5초 간격 시트(`out/shark-sheet-half.jpg`)에서 5초 넘게 같은 그림 없음, 기생충 그림 안 씀, 두 줄 글자 3.5초 이상 노출.
숫자를 맞추려고 입자, 흔들림, 깜빡임을 더하지 않는다.
- 못 넘으면 고쳐서 다시 렌더한다. 세 번 다시 해도 못 넘으면 멈추고 무엇이 걸리는지 보고한다.
- `out/shark-sheet.jpg`(1초 간격)도 다시 만들고, `out/shark-notes.md` 를 v2 내용으로 새로 쓴다. 구도 목록(시각, 구도 이름)과 motion_check 출력 요약을 넣는다.
- 자기 편 폴더만 만진다. 파일을 지울 때 `rm` 대신 `assets/shark/trash/` 로 옮긴다.
끝나면 길이, motion_check 숫자 셋(정지 비율, 같은 구도 최장, 구도 종류 수), 바꾼 것, 남은 문제를 다섯 줄 안으로 보고하고 멈춘다.
2D v2 편 지시서 (briefs/shark.v2.md)
# 400살 상어 — 컴포지션 `Shark` (1080x1920, 30fps, 48초 안팎)
공통 규칙은 [../BRIEF.md](../BRIEF.md). 자기 폴더는 `src/shark/`, `public/shark/`, `assets/shark/`, `out/shark*`.
v1(65초, `out/shark-v1.mp4`, 지시는 `briefs/shark.v1.md`)은 사용자가 "지루하다", "눈의 기생충이 징그럽다"고 했다.
v2 는 같은 이야기, 같은 화면 글자로 길이를 줄이고 구도를 계속 바꾼다.
북극 바다의 그린란드상어 한 마리가 거의 움직이지 않는 동안, 위 세상에서는 400년의 역사가 흘러간다.
이 느림과 빠름의 대비가 이 편의 중심이다. 상어가 느리다고 화면까지 느리면 안 된다.
느린 것은 상어 하나뿐이고, 역사와 카메라는 빠르게 움직여 대비를 만든다. 음악과 화면 글자만 쓴다(음악은 나중에).
## 그림체
차분한 자연 다큐멘터리 일러스트. 부드러운 붓 질감, 사실적인 비례. 팔레트는 깊은 남색, 청록, 얼음 흰색, 상어는 회갈색.
얼음 수면 경계선의 높이는 장면마다 바꾼다. 위 세상이 주인공인 장면은 경계선을 화면 절반까지 내려 위 세상을 크게 보여 준다.
## v1 에서 살릴 것
연도 곡선과 실루엣 띠의 동기화, 눈으로 파고들 때의 이음매, 엑스레이 겹침, 수정체 나이테, 초점 이동 전환은 잘 됐다. 코드를 살려 쓴다.
## v1 에서 바꿀 것
- 첫 35초가 화면 가운데 작은 상어 옆모습 한 컷이었다. 장면마다 구도를 바꾼다(아래 표의 「구도」 칸).
- 역사 쪽이 화면 맨 위에 작게 나와 대비가 안 보였다. 연도 숫자는 글자 높이 200px 이상, 역사 실루엣은 높이 300px 이상으로 키운다.
실루엣은 흰 단색이라 키워도 된다. 사건 이름(병자호란 1636 등)도 연도 숫자 바로 아래에 읽힐 크기로.
- 기생충 그림(`shark-parasite-a/b.png`)은 쓰지 않는다. 기생충 장면은 상어의 눈으로 본 뿌연 시야로 바꾼다.
- 탄소 기준 눈금(호박색 고리, 급등 곡선)은 글자 없이는 뜻이 안 전해져서 뺀다.
## 장면
시각은 기준이다. 화면 글자가 다 읽히도록(두 줄 글자는 3.5초 이상) 맞춰 조정해도 된다.
| 시간 | 화면 글자 | 구도 | 화면 |
|---|---|---|---|
| 0초 | "지금 이 바다 어딘가에" | 초근접 통과 | 첫 프레임부터 어둠 속에서 거대한 상어 몸통이 카메라 바로 앞을 가로질러 지나간다. 화면이 피부 질감으로 꽉 찼다가 꼬리가 빠져나가며 어둠이 열린다. 가까운 물체라 흐려도 된다 |
| 3초 | "400살 가까이 된 상어가 살고 있을지 모릅니다" | 아래에서 올려다보기 | 밝은 얼음 수면을 등지고 상어가 실루엣으로 화면 위쪽을 지나다가, 빛줄기 안으로 들어오며 색과 질감이 드러난다. 상어는 화면 폭에 가까운 크기 |
| 7초 | "태어난 해는 1620년대, 조선 인조 때" | 화면 나누기 | 카메라가 위로 올라가 경계선이 화면 절반에 온다. 경계선에 걸친 큰 연도 숫자가 2026 에서 1620 으로 되감기고, 위 세상의 실루엣이 크게 거꾸로 쏟아져 지나간다. 아래의 상어는 새끼로 줄어든다 |
| 12초 | "1년에 1cm도 자라지 않습니다" | 중간 크기, 확대 창 | 새끼 상어 주둥이 끝을 크게 보여 주는 둥근 확대 창에 코드로 그린 1cm 눈금 자가 붙는다. 연도가 한 해 넘어갈 때마다 주둥이 끝이 눈금 한 칸에 못 미치게 나아간다. 위로는 병자호란 조선 병사들이 크게 지나간다 |
| 16초 | "어른이 되는 건 150살쯤" | 뒤로 빠지는 와이드 | 연도가 빨라지며 상어가 자라고, 카메라는 상어가 자라는 만큼 뒤로 빠진다. 1770년대에 범선들이 위를 지나며 "미국 독립 1776" |
| 20초 | "헤엄치는 속도는 시속 1km 남짓" | 화면 나누기 경주 | 위 얼음 위로 걷는 사람이 2초 만에 화면을 가로지르고, 아래 상어는 같은 시간에 주둥이 하나만큼 나아간다. 출발선과 결승선을 코드로 그려도 된다 |
| 24초 | "눈에는 기생충이 매달려 있어 앞을 거의 못 봅니다" | 상어 시점 | 카메라가 머리 쪽으로 다가가다(눈은 작게) 상어의 눈으로 본 바다로 넘어간다. 화면 전체가 우윳빛으로 뿌옇고, 알아볼 수 없는 형체가 흐릿하게 지나간다. 기생충은 보여 주지 않는다 |
| 28초 | "그런데 배 속에서 북극곰 뼈가 나왔습니다" | 화면을 꽉 채운 측면 | 상어 몸통이 화면을 넘칠 만큼 크게. 엑스레이가 꼬리에서 머리 쪽으로 쓸고 지나가며 배 속의 북극곰 뼈와 순록 뼈가 드러난다 |
| 33초 | "이렇게 느린 상어가 어떻게 잡았는지는 아직 아무도 모릅니다" | 아주 먼 와이드 | 카메라가 멀리 물러나 넓은 얼음과 바다 속 상어가 작게 보인다. 물음표 하나가 떠오른다 |
| 38초 | "나이는 눈으로 쟀습니다" | 눈으로 파고들기 | v1 처럼 눈으로 파고들어 수정체 단면으로. 나이테가 안에서 밖으로 갈라지고 태어날 때 만들어진 한가운데가 빛난다 |
| 43초 | "그리고 그 상어는 지금도, 아주 천천히 헤엄치고 있습니다" | 화면 나누기 복귀 | 큰 연도 숫자가 광복 1945, 달 착륙 1969 를 지나 2026 에서 멈춘다. 상어가 어둠 속으로 멀어지며 끝(48초 안팎) |
화면 연도 표지: 병자호란 1636, 미국 독립 1776, 광복 1945, 달 착륙 1969. 연도 글자는 코드로 쓴다.
[… 그림 목록은 v1 과 같아 줄임]
## 움직임 말투
1. 연도 카운터의 속도(거꾸로 감기, 다시 흐르기, 빨라지기, 멈추기). 위 세상 실루엣의 흐름 속도를 연도 속도에 묶는다.
2. 장면마다 바뀌는 구도와 카메라 이동. 구도 사이는 초점(블러) 이동이나 카메라가 이어서 움직이는 것으로 넘긴다.
3. 상어의 느린 생명감(꼬리 사인 흔들림, 몸의 굴곡, 지느러미).
4. 초점 이동으로 요소 등장과 퇴장.
크게 힘주는 순간: 첫 통과, 되감기, 엑스레이, 수정체 가운데 빛.
[… 사실 근거는 v1 과 같아 줄임]
2D v3 지시 (motion-task-v3.md)
# 상어 편 v3 지시 (메인 세션, 2026-10-05 23시)
사용자가 v2 를 보고 "핵심 인물인 상어가 좀 지루하지만 나아졌다"고 했고, "최대한 잘 만들어 보자"고 했다.
v2 는 화면 구도는 계속 바뀌지만 상어 자체가 옆모습 한 장으로 미끄러지기만 하고 반응하지 않는다.
v3 는 주인공 상어를 살린다. 이번이 다섯 편의 품질 기준이 되는 판이다.
먼저 읽을 것:
- `BRIEF.md` (공통. 「볼거리」에 주인공 연기 규칙이 더해졌다)
- `briefs/shark.md` (v3 지시 전체)
- `out/shark-v2-notes.md` (v2 구도 목록과 코드 구조), 코드 `remotion/src/shark/`
- `assets/shark/assets.md` (에셋 목록, 주의점), `assets/shark/gen.py`, `match.py`, `cut.py`
## 1단계: 새 그림
`briefs/shark.md` 「새로 뽑을 그림」의 다섯 장(`shark-front`, `shark-belly`, `shark-three-quarter`, `shark-head`, `shark-jaw`)을 Codex 로 뽑는다.
여러 장을 동시에 돌려도 된다(`gen.py` 로, 한 장 10분 넘으면 끊고 다시).
뽑은 뒤 눈으로 보고 다른 상어처럼 보이거나(피부, 색, 붓 질감), 해부가 이상하거나(지느러미 수, 눈 위치), 글자가 섞였으면 다시 뽑는다.
배경을 지우고 색을 몸통에 맞춰 `remotion/public/shark/` 에 두고, `assets/shark/contact-v3.png` 와 `assets.md` 를 갱신한다.
**여기서 멈추고** 새 그림 목록과 다시 뽑은 횟수를 세 줄 안으로 보고한다. 메인 세션이 그림을 보고 "계속" 또는 다시 뽑을 것을 보낸다.
## 2단계: 모션 (메인 세션이 "계속"을 보낸 뒤)
- v2 코드를 살려 고친다. 장면 순서, 화면 글자, 구도 흐름, 연도 곡선은 v2 그대로 두고 `briefs/shark.md` 「상어 연기」와 「물속 느낌」을 더한다.
- 장면마다 상어 연기가 하나씩 분명히 보여야 한다. 노트에 장면별로 상어가 무엇을 하는지 시각과 함께 적는다.
- v2 의 남은 문제 셋을 고친다: 상어 시점 장면의 흰 화면과 밝기 급변, 1.5~5초 빈 화면, 눈 파고들기의 속도와 판 이음매.
- 렌더는 `out/shark.mp4` (잠금 규칙, `--concurrency 2`). 렌더 뒤 `.venv/bin/python tools/motion_check.py out/shark.mp4`.
- 통과 기준: 거의 정지 25% 이하, 같은 구도 최장 6초 이하, 구도 5가지 이상, 두 줄 글자 3.5초 이상, 기생충 그림 안 씀,
상어 시점 장면 앞뒤로 0.3초 안에 화면 평균 밝기가 크게(0~255 에서 25 넘게) 바뀌지 않음, 장면마다 상어 연기 하나.
- 0.5초 시트(`out/shark-sheet-half.jpg`)와 연기 장면의 원래 크기 프레임을 직접 보고 확인한다. 상어가 종이 인형처럼 보이는 곳(이음매, 각도 바꿀 때 튐)이 있으면 고친다.
- 못 넘으면 고쳐서 다시 렌더한다. 세 번 다시 해도 못 넘으면 멈추고 보고한다.
- `out/shark-sheet.jpg`, `out/shark-notes.md`(v3 로 새로 쓰기: 상어 연기 목록, 구도 목록, motion_check 요약, 남은 문제)를 만든다.
- 자기 편 폴더만 만진다. 파일을 지울 때 `rm` 대신 `assets/shark/trash/` 로 옮긴다. v1, v2 산출물(`out/shark-v1*`, `out/shark-v2*`)은 건드리지 않는다.
끝나면 길이, motion_check 숫자, 상어 연기 목록, 남은 문제를 다섯 줄 안으로 보고하고 멈춘다.
2D v3 편 지시서 (briefs/shark.md)
# 400살 상어 — 컴포지션 `Shark` (1080x1920, 30fps, 50초 안팎)
공통 규칙은 [../BRIEF.md](../BRIEF.md). 자기 폴더는 `src/shark/`, `public/shark/`, `assets/shark/`, `out/shark*`.
판 이력:
- v1(65초, `out/shark-v1.mp4`, 지시 `briefs/shark.v1.md`): 사용자 "지루하다", "눈의 기생충이 징그럽다".
- v2(48초, `out/shark-v2.mp4`, 지시 `briefs/shark.v2.md`, 노트 `out/shark-v2-notes.md`): 구도는 계속 바뀌게 됐다. 사용자 "핵심 인물인 상어가 좀 지루하지만 나아졌다. 최대한 잘 만들어 보자".
- v3(이 파일): 주인공 상어를 살린다. v2 의 이야기, 화면 글자, 장면 순서, 구도 흐름은 그대로 두고 상어의 각도, 연기, 물속 느낌을 더한다.
북극 바다의 그린란드상어 한 마리가 거의 움직이지 않는 동안, 위 세상에서는 400년의 역사가 흘러간다.
이 느림과 빠름의 대비가 이 편의 중심이다. 느린 것은 상어의 이동 속도이지 상어의 생명감이 아니다.
상어는 아주 느리게 헤엄치지만 숨쉬고, 둘러보고, 반응하는 살아 있는 주인공이어야 한다. 음악과 화면 글자만 쓴다(음악은 나중에).
## v2 에서 상어가 지루했던 이유
1. 그림이 옆모습 한 장뿐이라 상어가 늘 같은 각도로 미끄러지는 종이 인형처럼 보였다.
2. 머리, 입, 눈, 아가미가 한 번도 움직이지 않았다. 장면에서 무슨 일이 일어나도 상어가 반응하지 않았다.
3. 몸 위로 흐르는 물결 빛도, 카메라 앞을 지나가는 것도 없어 평평한 배경 위 그림 한 장처럼 보였다.
## 그림체
차분한 자연 다큐멘터리 일러스트. 부드러운 붓 질감, 사실적인 비례. 팔레트는 깊은 남색, 청록, 얼음 흰색, 상어는 회갈색.
얼음 수면 경계선의 높이는 장면마다 바꾼다. 위 세상이 주인공인 장면은 경계선을 화면 절반까지 내려 위 세상을 크게 보여 준다.
## 새로 뽑을 그림 (v3)
모두 단독 한 장씩(크게 쓰므로 시트 칸으로 뽑지 않는다), `shark-body.png` 를 `--ref` 로 넘겨 같은 상어, 같은 피부, 같은 붓 질감으로.
배경은 `#ff00ff` 크로마키, no text, no logo, no watermark. 뽑은 뒤 `match.py` 처럼 색을 몸통에 맞춘다.
1. `shark-front`: 정면(카메라를 향해 헤엄쳐 오는) 전신. 둔한 주둥이와 작은 눈 둘, 가슴지느러미가 양옆으로, 몸은 원근으로 짧아짐. 마지막 장면에서 몸을 돌려 카메라 쪽으로 올 때 쓴다.
2. `shark-belly`: 바로 아래에서 올려다본 전신(배 쪽). 밝은 얼음을 등진 실루엣으로 쓰므로 윤곽이 분명하게. 3초 올려다보기 장면에 쓴다.
3. `shark-three-quarter`: 비스듬한 앞모습(4분의 3 각도) 전신. 머리가 카메라 쪽으로 약간 돌아 있음.
4. `shark-head` + `shark-jaw`: 옆모습 머리 큰 클로즈업(1536px 폭에 머리만, 아가미 구멍 다섯 개가 보이게). 아래턱은 따로 한 장으로 뽑아 입을 천천히 벌리고 닫을 수 있게 한다(머리 쪽 입 안은 어두운 빈 자리, 턱의 경첩 위치가 맞게). 이음매가 어색하면 머리를 "입 다문 것", "입 조금 벌린 것" 두 장으로 뽑아도 된다. 그때도 두 장의 윤곽이 겹치게 같은 상자로 자른다.
기생충 그림(`shark-parasite-a/b.png`)은 계속 쓰지 않는다. 사람, 피, 상처는 그리지 않는다.
뽑은 뒤 `assets/shark/contact-v3.png`(새 그림만, 이름표, 남색 배경 위)와 `assets.md` 갱신까지 하고 **멈춰서 보고한다.** 메인 세션이 그림을 보고 "계속" 또는 다시 뽑을 것을 보낸다.
## 상어 연기 (장면마다 하나씩)
v2 의 장면과 시각을 기준으로, 장면마다 상어가 하나씩 반응한다. 반응은 느리게, 하지만 분명히 보이게.
| v2 시각 | 화면 글자 | 상어가 하는 것 |
|---|---|---|
| 0~3초 | 지금 이 바다 어딘가에 | 초근접 통과 그대로. 몸 위로 물결 빛이 흐르고, 지나가며 아가미 구멍이 한 번 열렸다 닫힌다 |
| 3~7.5초 | 400살 가까이 된 상어가 살고 있을지 모릅니다 | **빈 화면 고치기.** `shark-belly` 실루엣이 화면 가운데 위를 크게(화면 폭의 80% 이상) 가로지르다, 빛 안으로 들어오며 옆모습으로 넘어간다. 1.5~5초에 화면이 비지 않게 |
| 7.6~11초 | 태어난 해는 1620년대, 조선 인조 때 | 되감기 동안 상어의 몸 물결이 거꾸로 흐른다 |
| 11~16.5초 | 1년에 1cm도 자라지 않습니다 | 새끼가 몸 전체를 S자로 물결치며 헤엄친다 |
| 16.5~21초 | 어른이 되는 건 150살쯤 | 자라는 동안 몸 물결이 느려지고 커진다(어른이 될수록 느릿하게) |
| 21~25.5초 | 헤엄치는 속도는 시속 1km 남짓 | 걷는 사람이 머리 위를 지나갈 때 상어가 고개를 살짝 들어 위를 본다(머리 쪽 굴곡) |
| 25.5~30초 | 눈에는 기생충이 매달려 있어 앞을 거의 못 봅니다 | `shark-head` 클로즈업으로 다가가 아가미가 숨쉬듯 열리고 닫힌다. 상어 시점 장면을 고친다: **흰 화면을 어둡고 탁한 청록으로**, 눈 모양 테두리로 상어의 눈이라는 것을 보이고, 밝기는 앞뒤 장면과 비슷하게. 30초에 밝기가 갑자기 떨어지지 않게 1초 이상에 걸쳐 바꾼다 |
| 30~35초 | 그런데 배 속에서 북극곰 뼈가 나왔습니다 | 엑스레이 스캔 그대로. 스캔선이 머리에 닿을 때 턱이 살짝 움직인다 |
| 35~40초 | 이렇게 느린 상어가 어떻게 잡았는지는 아직 아무도 모릅니다 | 먼 와이드 대신 `shark-three-quarter` 또는 `shark-head` 로 가까이. 상어가 입을 아주 천천히 벌렸다 닫고, 그 뒤 물음표가 떠오른다 |
| 40~43초 | 나이는 눈으로 쟀습니다 | 눈 파고들기를 `shark-head` 에서 시작해 1초 더 길게(3초 안팎). 눈 그림이 머리 위에 판처럼 뜨지 않게 가장자리를 머리 피부에 섞는다 |
| 43~48초 | 그리고 그 상어는 지금도, 아주 천천히 헤엄치고 있습니다 | 연도가 2026 에서 멈춘 뒤 상어가 천천히 몸을 돌려(옆모습에서 `shark-three-quarter`, `shark-front` 로) 카메라 쪽으로 다가오다 어둠 속으로 사라진다. 마지막은 상어의 정면 |
## 물속 느낌 (코드)
- 물결 빛(caustics): 상어 몸 위로만 흐르는 밝은 물결 무늬. 몸 모양으로 가려서 얹는다. 얕은 곳(수면 가까이) 장면에서 더 강하게.
- 앞쪽 입자: 카메라 바로 앞을 흐리게 지나가는 큰 입자 몇 개(초점이 안 맞아 둥글게 번진 것). 깊이를 주는 용도라 장면당 몇 개만, 천천히.
- 상어 몸 전체 물결: v2 는 꼬리 쪽만 굴곡했다. v3 는 머리에서 꼬리로 물결이 흘러가게(머리는 작게, 꼬리로 갈수록 크게). 몸통을 세로 띠로 나눈 v2 방식을 넓혀 쓴다.
- 아가미: 머리가 크게 보이는 장면에서 아가미 구멍이 숨쉬듯 열리고 닫힌다(코드로 그린 어두운 선의 폭 변화, 또는 `shark-head` 위 덧칠).
[… v2 와 같은 장면 표와 그림 목록은 줄임]
## 움직임 말투
1. 연도 카운터의 속도. 위 세상 실루엣의 흐름 속도를 연도 속도에 묶는다.
2. 장면마다 바뀌는 구도와 카메라 이동.
3. 상어의 생명감과 연기(몸 전체 물결, 아가미, 고개, 입, 몸 돌리기). v3 에서 가장 힘을 줄 곳.
4. 초점 이동으로 요소 등장과 퇴장.
크게 힘주는 순간: 첫 통과, 되감기, 엑스레이, 수정체 가운데 빛, 마지막에 상어가 정면으로 돌아섬.
[… 사실 근거는 v1 과 같아 줄임]
3D 20초 시험판 지시 (TASK.md)
# 상어 20초 시험판 작업 지시
모션 디자인 편의 새 방식 시험. 지난 상어(`../2026-10-05-five-styles`, v3 52초)는 그림 몇 장을 2D 로 움직여 몸을 돌릴 때 두 그림이 겹쳐 보였다. 이번에는 주인공을 Meshy 3D 모델로 바꿔 실제로 돌리고, 배경과 컷은 미리 뽑은 그림으로 1.5~2초마다 바꾼다. 내레이션이 먼저 있고 그 길이에 맞춰 자른다.
## 입력 (이 폴더)
- `model/shark.glb`: Meshy 7 그린란드상어, 텍스처 포함(`model/shark_base_color.png`), 약 4만 삼각형. 8방향 확인 그림 `model/turn-sheet.png`. 축: 몸길이가 Y(약 1.9), 폭 X 1.16, 높이 Z 0.57 (Blender 기준. glTF 로 읽으면 축이 바뀔 수 있으니 직접 확인)
- `audio/narration.mp3`: ElevenLabs v4, 사용자 목소리, 20.24초. 낱말별 시각 `audio/words.json`, 원고 `audio/narration.txt`
- 재사용 가능한 그림: `../2026-10-05-five-styles/remotion/public/shark/` 의 `sil-walker.png`, `sil-bear-bones.png`, `sil-joseon-soldier.png`, `ice-surface.png`, `caustics.png` 등. 붓 그림 스타일 기준도 그 그림들이다
- 공통 규칙: `../2026-10-05-five-styles/BRIEF.md` 의 「볼거리」와 「완료 판정」을 따른다
## 만들 것
- `out/shark-20s.mp4`: 1080x1920, 30fps, 약 21초, 내레이션을 0.3초 늦춰 깐다(영상 시각 = 낱말 시각 + 0.3). 음악 없음. 음량 -14 LUFS 안팎
- Remotion 프로젝트는 이 폴더 `remotion/` 에 새로 만든다. 버전과 렌더 설정은 `../2026-10-05-five-styles/remotion/package.json` 과 맞추고 `@remotion/three`, `three`, `@react-three/fiber` 를 더한다. 3D 렌더는 `--gl=angle` 로 시작하고 안 되면 다른 gl 옵션을 시험해 적는다
- 상어 몸 물결은 정점 셰이더(또는 `onBeforeCompile`)로 직접 넣는다: 머리는 거의 고정, 꼬리 쪽으로 갈수록 커지는 좌우 사인파, 꼬리 끝 흔들림. 그린란드상어는 아주 느린 동물이라 물결 주기도 느리게(2~3초)
- 물속 느낌: 거리 안개(짙은 남색, 청록), 위에서 오는 빛줄기, 몸 위를 흐르는 물결 빛(`caustics.png` 투영 가능), 카메라 앞 흐린 입자
## 배경 그림 (먼저 뽑는다)
`../2026-10-05-five-styles/tools/imgen.py` 를 Codex 로, 시간 제한 래퍼 `../2026-10-05-five-styles/assets/shark/gen.py` 와 함께 쓴다(그 폴더 루트에서 실행하는 방식이므로 경로를 맞춘다). 세로 1024x1536, 크로마키 없이 전체 배경, 글자 없음. 스타일 문단은 `../2026-10-05-five-styles/assets/shark/raw/ice-surface.prompt.txt` 의 STYLE 문단을 그대로 쓴다(손으로 그린 자연사 책 삽화, 차분한 남색과 청록). 병렬로 뽑아도 된다. 대략 아래 열 장, 컷 표를 보고 더하거나 빼도 된다.
1. 얼음 아래 북극 바다, 아래에서 올려다본 얼음 밑면과 빛줄기
2. 깊고 어두운 청록 물속, 아래로 갈수록 검정
3. 1620년대 조선 바닷가 마을 겨울 풍경(옛 그림 느낌을 살짝)
4. 조선 궁궐 지붕과 눈 내리는 하늘
5. 차가운 바다 속 바위 절벽과 해초 없는 빈 바닥
6. 얼음 위 눈밭을 아래(물속)에서 본 단면, 위쪽 1/3 이 얼음(걷는 사람을 올릴 자리)
7. 낡은 자연사 책 펼친 면 또는 액자 속 바다 그림(튀어나오는 컷의 틀). 틀 안은 바다, 틀 밖은 종이나 어두운 배경
8. 유빙 위 북극곰, 멀리서 본 차가운 저녁
9. 아주 깊은 어둠, 떠다니는 입자 몇 개
10. 얼음 아래에서 본 수면, 희미한 해
## 컷 표 (영상 시각)
| 시각 | 내레이션 | 화면 |
|---|---|---|
| 0.0~2.3 | 지금 이 바다 어딘가에 | 프롬프트 넣는 화면. 어두운 입력창에 실제로 쓴 그림 프롬프트 한 줄(`../2026-10-05-five-styles/assets/shark/raw/shark-three-quarter.prompt.txt` 에서 짧게 발췌, 영어 그대로)이 타자로 쳐지고, 「Codex 이미지」 표지가 「Meshy 3D」로 바뀌며 그림이 선으로 된 3D 상어가 되고 텍스처가 입혀진다. 거짓 화면은 만들지 않는다 |
| 2.3~3.8 | 사백 살 가까이 된 상어가 | 3D 상어가 천천히 돌며 드러남. 큰 숫자 400 |
| 3.8~5.4 | 살고 있을지 모릅니다 | 배경 1. 얼음 아래를 지나는 상어를 아래에서 올려다본다 |
| 5.4~7.6 | 태어난 건 1620년대 | 연도 숫자 2026 에서 1620년대로 거꾸로 감김. 배경 3 |
| 7.6~9.4 | 조선 인조 때 | 배경 4. 상어는 작게, 또는 앞쪽 물 층에서 지나감 |
| 9.4~11.7 | 1년에 1cm도 자라지 않고 | 옆모습 상어와 길이 눈금(1cm 가 거의 안 보이게 작다는 것). 배경 2 또는 5 |
| 11.7~12.8 | 시속 1km로 | 배경 6. 얼음 위를 걷는 사람(`sil-walker.png`)이 상어를 앞질러 감 |
| 12.8~14.0 | 헤엄칩니다 | 꼬리 클로즈업, 느린 꼬리짓 |
| 14.0~15.9 | 그런데 배 속에서 | 튀어나오는 컷. 배경 7 의 틀 안에서 헤엄치던 상어가 머리부터 틀 밖으로 나와 카메라 쪽으로 온다. 몸 뒷부분은 틀 안에 가려 있어야 한다(스텐실이나 마스크로 앞뒤 관계) |
| 15.9~17.9 | 북극곰 뼈가 나왔습니다 | 배경 8. 상어가 엑스레이처럼 비치고(가장자리만 빛나는 반투명 셰이더) 배 속에 `sil-bear-bones.png` |
| 17.9~19.5 | 어떻게 잡았는지는 | 배경 9. 상어가 천천히 몸을 돌려 카메라를 정면으로 본다 |
| 19.5~21.2 | 아직 아무도 모릅니다 | 상어가 카메라 바로 앞을 지나 어둠으로. 물음표 하나, 끝 |
- 화면 글자는 숫자와 핵심 낱말만 크게(400, 1620년대, 1cm, 1km, 북극곰). 아래쪽에 내레이션 한 줄 자막을 작게 둔다(쇼츠 안전 영역 안).
- 3D 상어의 크기와 각도는 컷마다 달라야 한다. 같은 구도 5초 이하.
## 완료 판정
- `../2026-10-05-five-styles/tools/motion_check.py out/shark-20s.mp4` 로 거의 정지한 시간, 같은 구도 최장, 0.5초 시트를 낸다. 숫자를 맞추려고 입자나 흔들림을 더하지 않는다.
- 컷마다 한 장씩 프레임을 뽑아 `out/frames/` 에, 배경 그림 모음 `out/contact-bg.png`
- `out/notes.md`: 컷 표(실제 시각), 쓴 그림, 3D 설정(gl 옵션, 셰이더), 렌더 시간, 남은 문제. 첫 줄에 한 문장 요약
- 렌더가 끝나면 멈추고 보고한다. 이 폴더 밖 파일은 고치지 않는다(`../2026-10-05-five-styles` 는 읽기와 도구 실행만).
그림 프롬프트
상어 그림은 모두 같은 STYLE 문단을 쓴다. 첫 몸통 그림과 얼음 그림이 사진이나 3D 렌더처럼 나와 버려진 뒤로 「NOT a photograph, NOT a 3D render」 같은 부정문을 더 분명히 적었다. 비스듬한 앞모습은 첫 결과가 돼지코에 흰자 있는 눈, 찡그린 입으로 나와서 눈, 콧구멍, 입을 하나씩 짚어 고쳤고, 이 그림이 그대로 Meshy 3D 모델의 입력이 됐다.
2D 몸통 (shark-body)
Mode: built-in image_gen
Generation prompt:
Use case: scientific-educational
Asset type: Greenland shark body illustration for separate-part animation, 1536x1024 pixels, landscape 3:2.
STYLE (most important): a hand-painted natural-history book illustration, digital gouache / oil painting. Clearly visible soft brush strokes and painterly texture, gently simplified forms, soft edges inside the shapes, calm and quiet mood. Realistic anatomy and proportions, but it must look PAINTED by hand, NOT a photograph, NOT a 3D render, NOT CGI, no glossy highlights, no hyper-detailed skin pores.
Subject: a single Greenland shark (Somniosus microcephalus) in exact side profile, facing RIGHT, horizontal and straight, centered, filling about 88% of the image width with even margins.
Heavy, thick, blunt cylindrical body; short, broad, rounded snout; very small dark eye; small gill slits; two small low dorsal fins (the first near the middle of the back, the second further back); small pelvic fins. Skin: muted grey-brown with soft darker mottling, painted loosely. Soft light from above, darker belly shadow. Palette harmonises with deep navy and teal water (cool grey-brown, no warm orange).
Parts to OMIT (drawn separately and attached during animation):
- NO tail fin. The body tapers into a narrow tail stalk that simply ends with a soft, rounded, SOLID end covered in skin. No hole, no opening, no tube, no visible cross-section.
- NO pectoral fins. The flank behind the gills is smooth skin, no fin at all.
Background: perfectly flat solid pure magenta #ff00ff chroma key, uniform, no gradient, no shadow, no water, no particles. The shark contains no magenta or pink.
No text, no letters, no numbers, no logo, no watermark, no border, no frame.
Canvas size: 1536x1024 pixels.
Final edit prompt:
Use case: precise-object-edit.
Edit the provided Greenland shark illustration for a chroma-key animation asset. Change only framing and background. Preserve the existing hand-painted gouache/oil brushwork, muted cool grey-brown shark, exact right-facing side profile, body shape, small dorsal and pelvic fins, small eye, gills, and the complete absence of pectoral fins and tail fin. Keep the rounded skin-covered solid tail stalk with no hole or cross-section.
Reframe the shark proportionally smaller so it fills exactly about 88% of canvas width, centered both horizontally and vertically with equal 6% left/right margins (about 92 pixels on each side on this 1536x1024 canvas). Do not crop it.
Background must be a digitally flat, uniform, pure RGB(255,0,255) / HEX #FF00FF field, with absolutely no grain, brush strokes, noise, dithering, gradient, shadows, particles or texture in the BACKGROUND. Painterly brush texture is confined strictly to the shark itself. No magenta or pink on the shark.
Output 1536x1024 pixels. No text, labels, logo, watermark, frame.
비스듬한 앞모습, 처음 프롬프트와 고친 프롬프트 (shark-three-quarter)
Mode: built-in image_gen
Initial generation prompt:
Use case: scientific-educational
Asset type: hand-painted natural-history shark illustration for chroma-key compositing, landscape 1536x1024.
Input image 1: reference for the very same Greenland shark (Somniosus microcephalus), its identity, skin colour, soft darker mottling, soft overhead lighting and painterly brushwork. Create a new view of this same animal.
STYLE (most important): a hand-painted natural-history book illustration, digital gouache / oil painting. Clearly visible soft brush strokes and painterly texture, gently simplified forms, soft edges inside the shapes, calm and quiet mood. Realistic anatomy and proportions, but it must look PAINTED by hand, NOT a photograph, NOT a 3D render, NOT CGI, no glossy highlights, no hyper-detailed skin pores. Match the reference's muted grey-brown skin, loosely painted soft darker mottling and cool palette that harmonises with deep navy and teal water (no warm orange).
Subject and composition: the same Greenland shark in a three-quarter FRONT view: it swims toward the viewer and slightly to the RIGHT, its head turned toward the camera, so we see the front and the right side of the blunt rounded head. The thick body recedes diagonally behind the head toward the upper LEFT of the image in perspective, getting smaller with distance. Near pectoral fin large and close, far pectoral fin partly visible; first dorsal fin on the back; tail fin visible far behind at the upper left. The whole animal including the complete tail and every fin fully inside the frame, centered, filling about 80% of image width.
REALISTIC SHARK ANATOMY, NOT a cartoon and NOT a face: the eye is a very small, round, completely dark eye on the SIDE of the head (no white around it, no eyelid, no eyebrow, no expression); the far eye is hidden behind the snout. Nostrils are small and on the UNDERSIDE of the snout, barely visible (NOT a big pig-like nose seen from the front). Mouth is a low, wide, gentle line on the underside of the head, closed, no lips, no frown, no teeth. Five gill slits on the near side. Calm, slow, emotionless, animal-like.
Skin: soft, loosely painted darker blotches like the reference, NOT a fine pixel camouflage pattern. Soft light from above.
Background: perfectly flat solid pure magenta #ff00ff (RGB 255,0,255) chroma key, uniform across all background pixels, no gradient, no shadow, no water, no particles, no light rays. Shark contains no magenta or pink.
No text, letters, numbers, logo, watermark, border or frame.
Output image size: 1536x1024.
Final correction prompt:
Use case: precise-object-edit.
Edit the supplied generated Greenland shark painting. Preserve the same animal, its grey-brown and cool slate muted palette, painterly gouache/oil brushwork, soft overhead lighting, body, tail, fin arrangement, diagonal three-quarter front pose and solid pure #ff00ff magenta background.
Targeted correction: realistic, understated Greenland shark HEAD ANATOMY, as explicitly requested. The current eye, nostril and mouth are too prominent and face-like.
- Reduce the visible side eye to about ONE THIRD of its current diameter: a TINY circular solid dark eye, set flat into the side of the head, with no raised rim, no eyelid, no white, no facial expression and no glossy highlight. The far eye stays fully hidden.
- Remove the conspicuous oval opening on the front of the snout completely. The front of this broad blunt rounded snout must be uninterrupted painted shark skin. Put only a tiny barely perceptible nostril on the UNDERSIDE of the snout.
- Completely close the mouth. Remove the black open gap and fleshy lip shape, replacing them with a thin, low, wide, gently level neutral seam on the UNDERSIDE of the head. No lips, no teeth, no frown, no smile.
- Keep exactly five gill slits on the near side.
Maintain realistic Greenland shark anatomy, no personification, no cartoon, calm emotionless animal. Keep natural-history PAINTED style with soft visible brushwork, no photographic surface, no CGI, no glossy highlights, no tiny pixel-camouflage detail.
Frame the full animal with a little more magenta space around it so its total width is about 80% of the canvas; all fins and tail within frame. Foreground head is toward lower right, the body recedes toward upper left, tail small in the distance.
Canvas 1536x1024. Background everywhere perfectly flat solid RGB(255,0,255), no texture, shadows, gradients, water, particles or rays. No pink or magenta within the shark. No text, numbers, logos, watermark, border or frame.
3D 판 배경: 상어가 튀어나올 책 그림 틀 (bg07-book-plate)
Mode: built-in image_gen
Use case: scientific-educational
Asset type: full-frame vertical background painting for a portrait video, opaque PNG, 1024x1536 pixels, 2:3 portrait. The painting fills the whole canvas edge to edge, no chroma key, no empty areas.
STYLE (most important): a hand-painted natural-history book illustration, digital gouache / oil painting. Clearly visible soft brush strokes and painterly texture, gently simplified forms, calm and quiet mood. It must look PAINTED by hand, NOT a photograph, NOT a 3D render, NOT CGI.
Subject: a single page of an old natural-history book, viewed straight on and perfectly flat, not rotated: aged cream paper with soft brownish foxing stains, slightly darker worn edges. In the middle of the page a large rectangular illustration plate: a painting of an empty, deep, cold sea, dark navy and teal water with soft light rays coming from the top. The plate is a precise axis-aligned rectangle with a crisp thin dark ink border line, roughly from x=150 to x=874 and from y=330 to y=1150, with plain paper margins around it. The page itself fills almost the whole canvas; only a narrow strip of very dark navy background is visible around the page edges.
The sea painting inside the plate is empty (an animal will be composited there later).
Palette: warm faded cream paper, dark navy and muted teal sea.
No sharks, no fish, no whales, no animals, no people.
No printed text, no captions, no letters, no numbers on the page.
No text, no letters, no numbers, no logo, no watermark, no signature, no border or frame around the image.
음악 지시
상어 편에는 음악이 없다. 2D 판 지시는 이랬다.
- 음악은 넣지 않는다(메인 세션이 나중에 넣는다). 효과음도 이번에는 넣지 않는다.
3D 판은 내레이션을 먼저 만들고 그 길이에 맞춰 잘랐다. 내레이션은 ElevenLabs로 복제한 내 목소리다. 처음 쓴 v4 모델은 내 목소리와 「약간만 비슷」해서, v2 판부터는 Multilingual v2 모델로 바꿨다.
10월 6일 세 편이 같이 읽은 공통 규칙
공룡, 세럼, 만화 세 편은 같은 시각(21시 3분)에 작업 세션 셋이 동시에 시작했다. 셋 다 아래 공통 규칙과, 상어 3D 판의 실패에서 나온 짧은 영상 대본 규칙을 먼저 읽었다. 내레이션과 효과음은 메인 세션이 미리 뽑아 두었고, 음악은 작업 세션이 코드로 작곡했다.
공통 규칙 (COMMON-2026-10-06.md)
# 모션 디자인 편 공통 규칙 (2026-10-06)
이 폴더(`motion-test/`) 아래 편 폴더 하나가 작업 세션 하나의 전부다. 자기 편 폴더 밖은 읽기와 도구 실행만 한다.
## 먼저 읽을 것
1. `SCENARIO-RULES.md`: 짧은 영상 시나리오 규칙. 원고와 마무리는 이미 이 규칙대로 확정돼 있다. 화면도 마무리를 살려야 한다: 마지막 말 뒤 0.8~1.5초는 말 없이 끝 화면, 첫 장면과 짝.
2. `2026-10-05-five-styles/BRIEF.md` 의 「볼거리」와 「완료 판정」: 3~4초마다 새 볼거리, 같은 구도 5초 이하, 구도 5가지 이상, 주인공은 주인공 크기로, 숫자를 맞추려고 입자나 흔들림을 더하지 않는다.
3. `2026-10-06-shark-20s/out/notes.md`: 바로 앞 편(상어 3D 시험판)의 설정과 함정. Remotion + three.js 3D 렌더(`--gl=angle`), 배경을 3D 장면 맨 뒤에 둔 이유, 렌더 시간.
## 도구
- Remotion: 편 폴더에 `remotion/` 을 새로 만든다. 버전과 설정은 `2026-10-06-shark-20s/remotion/package.json` 과 맞춘다(3D 가 필요 없으면 three 관련은 빼도 된다).
- 그림: `2026-10-05-five-styles/tools/imgen.py` 를 Codex 로, 시간 제한 래퍼 `2026-10-05-five-styles/assets/shark/gen.py` 와 함께(그 폴더 루트에서 실행하는 방식이므로 경로를 맞춘다). 병렬 가능. 크로마키 자르기는 `2026-10-05-five-styles/tools/remove_chroma_key.py`.
- 검사: `2026-10-05-five-styles/tools/motion_check.py out/<편>.mp4` (그 폴더의 `.venv/bin/python`).
- 소리: 내레이션과 효과음은 메인 세션이 이 맥에서 ElevenLabs 로 미리 뽑아 `audio/` 에 넣었다. 더 필요하면 만들지 말고 notes.md 에 적어 보고한다. 음악은 작업 세션이 코드로 작곡한다: MIDI 를 코드로 쓰고 FluidSynth 와 GM 사운드폰트로 렌더하는 방식을 먼저 시험한다(`brew install fluidsynth`, 사운드폰트는 라이선스가 자유로운 것, 출처를 notes.md 에). 소리가 너무 싸면 다른 방법을 시험하고 적는다.
## 렌더
- 1080x1920, 30fps, h264 + aac 48kHz, 음량 -14 LUFS 안팎.
- 여러 편이 같은 기계에서 동시에 돈다. 전체 크기 렌더는 공용 잠금으로 한 번에 하나만: `mkdir …/motion-test/.render-lock` 이 성공할 때만 렌더하고 끝나면 `rmdir`. 실패하면 30초 뒤 다시. 절반 크기 초안은 잠금 없이 `--concurrency 2` 로.
## 완료 판정과 보고
- `out/<편>.mp4`, `out/frames/`(컷마다 한 장), `out/<편>-sheet-half.jpg`(0.5초 시트), `out/contact-assets.png`(뽑은 그림 모음), `out/motion_check.txt`.
- `out/notes.md`: 첫 줄 한 문장 요약, 컷 표(실제 시각), 쓴 그림과 소리, 음악을 만든 방법, 렌더 시간, 남은 문제, 지시와 다르게 한 점.
- 렌더가 끝나고 notes.md 까지 쓰면 멈추고 보고한다. 사람에게 묻지 말고 추천대로 진행하되, 판단한 것은 notes.md 에 적는다.
짧은 영상 대본 규칙 (SCENARIO-RULES.md)
# 짧은 영상 시나리오 규칙 — 쇼츠, 모션 디자인 편, 광고
> 작성 2026-10-06, 계기: 모션 디자인 편 상어 20초 시험판. 영상은 잘 나왔는데 "말하다가 그냥 끊기는 느낌"이었다(사용자).
> 원인은 화면이 아니라 원고였다. 20초에 맞추려고 원고를 줄이면서 v3까지 있던 닫는 문장("그리고 그 상어는 지금도, 아주 천천히 헤엄치고 있습니다")을 뺐고,
> 열린 질문("어떻게 잡았는지는 아직 아무도 모릅니다")에서 끝났다.
> 대상: 15~60초 세로 영상 전부.
## 1. 한 편의 뼈대
한 편은 **궁금증 하나와 그 답(또는 반전) 하나**로 끝난다. 원고를 쓰기 전에 이 두 줄을 먼저 적는다.
| 구간 | 길이(20초 기준) | 하는 일 |
|---|---|---|
| 훅 | 0~3초 | 궁금증을 던진다. 첫 문장만 들어도 다음이 궁금해야 한다 |
| 전개 | 3~14초 | 사실 2~4개를 점점 세게 쌓는다. 문장 하나에 사실 하나 |
| 반전 | 14~17초 | "그런데"로 예상을 뒤집는 사실 하나 |
| 마무리 | 17~20초 | 훅에 답하거나 훅을 되부른다(첫 장면, 첫 문장과 짝). 마지막 말 뒤 0.8~1.5초는 말 없이 끝 화면 |
- **마무리 시간은 줄이지 않는다.** 길이가 넘치면 전개에서 사실을 뺀다.
- 열린 질문으로 끝내고 싶으면, 그 질문 **다음에** 닫는 문장 하나를 더 둔다. 질문이 마지막 문장이 되면 끊긴 느낌이 난다.
- 닫는 문장은 셋 가운데 하나다: 첫 장면 되부르기(callback), 시청자가 들고 갈 한 줄("다음에 박물관에서 티라노를 보면, 팔부터 보세요"), 숫자 하나로 정리.
## 2. 길이 예산
- 한국어 내레이션은 ElevenLabs v4 기준 **초당 약 5음절**이다(상어 시험판 101음절 / 20.2초 실측). 20초면 100음절, 30초면 150음절 안쪽.
- 숫자는 읽히는 음절로 센다("1620년대" = 천육백이십 년대, 8음절).
- 원고 길이는 TTS 한 테이크를 뽑아 실제 길이로 확인한다. 낱말 시각(`with-timestamps`)이 컷 표의 정본이다.
## 3. 원고 검사 (TTS 전에)
1. 첫 문장만 들어도 궁금한가.
2. **마지막 문장만 들어도 끝난 느낌이 드는가.** 질문, "~지도 모릅니다", 접속사로 끝나면 실패.
3. 처음과 끝이 짝을 이루는가(장면이든 문장이든).
4. 문장마다 사실이 하나인가. 숫자가 나오는 문장은 화면 글자로 같은 숫자를 보여 줄 수 있는가.
5. 단정할 수 없는 사실은 원고에서도 단정하지 않는가(출처는 편 폴더 세부 기록에).
다섯 가지를 통과한 원고만 TTS 로 넘긴다. 세션이 혼자 판정한 원고는 렌더 결과와 함께 사람에게 보여 줄 때 원고 전문을 같이 올린다.
## 4. 스타일별 원고 형식
스타일이 달라도 §1 뼈대는 같다. 바뀌는 것은 무엇이 이야기를 끌고 가느냐다.
| 스타일 | 끌고 가는 것 | 원고 형식 | 마무리 |
|---|---|---|---|
| 자연 다큐 내레이션 (상어) | 내레이션 | 문장 단위 컷 표 | 첫 장면 되부르기 |
| Vox 해설 | 내레이션 + 증거 자료 | 질문 → 가설이나 증거를 하나씩 쌓기. 화면마다 "증거" 하나(문서, 사진, 도장, 도해) | 답 또는 "아직 모른다" + 시청자 한 줄 |
| 비트 모션 | 음악 | 원고 대신 곡 구간표(인트로, 빌드업, 드롭, 쉬어 가는 구간, 마지막 드롭, 아웃트로). 장면 전환은 마디 경계에만 | 아웃트로에서 첫 화면으로 돌아오며 소리와 함께 닫힘 |
| 광고 | 카피 | 문제 → 해결(제품) → 증거 → 행동 유도. 카피 한 줄은 2초 안에 읽히는 길이 | 제품 이름과 행동 유도가 있는 끝 카드 |
| 종이 만화 | 칸 | 칸 단위 콘티(칸마다 그림, 말풍선, 의성어). 기승전결 네 묶음 | 마지막 칸이 펀치라인, 그 뒤 책장이 덮인다 |
## 5. 하지 않는 것
- 길이를 맞추려고 마무리 문장을 빼지 않는다(이 문서가 생긴 이유).
- 훅에서 답을 먼저 말하지 않는다.
- 한 편에 궁금증을 둘 넣지 않는다. 남는 사실은 다음 편 소재로 둔다.
## 6. 이 문서를 고치는 법
편을 하나 만들 때마다 사람 피드백 가운데 다음 편에도 통하는 것만 이 문서에 한 줄로 올린다. 편 하나에만 해당하는 것은 그 편 폴더(`…/motion-test/<날짜-편>/`) 노트에 둔다.
공룡 Vox 해설
「뼈만 남은 공룡, 생김새는 어떻게 알아낼까」를 크림색 종이 보드 위 콜라주로 풀었다. 화면 가운데에서 벨로키랍토르 한 마리가 뼈대, 근육, 피부, 깃털 순서로 복원된다. 그림 13장은 모두 첫 시도에 통과했고, 네 층은 위치를 따로 맞출 필요가 없을 만큼 겹쳤다(어긋남 4px 이내). 작업 세션 시간은 35분이다.
화면에 나오는 화석 사진, 현미경 사진, 1854년 판화는 실제 자료가 아니라 Codex가 그린 그림이다. 영상에도 그렇게 적었다.
작업 지시서
공룡 편 지시 (TASK.md)
# Vox 해설: 뼈만 남은 공룡, 생김새는 어떻게 알아낼까
먼저 `../COMMON-2026-10-06.md` 를 읽는다. 결과 `out/dino-vox.mp4`, 약 35초(내레이션 0.3초 지연 + 33.3초 + 끝 화면 1.5초).
## 입력
- `audio/narration.mp3`: 사용자 목소리(ElevenLabs Multilingual v2), 33.3초. 낱말 시각 `audio/words.json`, 원고 `audio/narration.txt`.
## 스타일: Vox 해설
종이 질감 보드 위에 오려 붙인 그림, 사진, 도해가 콜라주로 놓이고 카메라가 그 위를 옮겨 다닌다. 오려 낸 가장자리와 옅은 그림자, 손으로 그은 듯한 빨간 동그라미와 화살표(그려지는 애니메이션), 형광펜 밑줄, 연도 도장, 타자기 느낌 자막 띠. 차분한 크림색 종이, 검정, 빨강, 한 가지 강조색. 화면 글자는 핵심 낱말만 크게.
## 화면의 중심: 층층이 복원되는 공룡 한 마리
벨로키랍토르(깃털 있는 작은 수각류) 한 마리를 같은 자세, 같은 크기로 네 층 그린다: 뼈대 → 근육 → 피부 → 깃털과 색. 첫 층을 Codex 로 뽑은 뒤 그 그림을 참조로 넣어 나머지 층이 정확히 겹치게 뽑는다(어긋나면 자르기와 크기를 맞추고 notes 에 적는다). 층이 바뀌는 순간이 이 편의 볼거리다(아래에서 위로 쓸어 덮기, 오려 붙이기 등).
## 컷 (낱말 시각 기준, 영상 시각 = 낱말 시각 + 0.3)
| 내레이션 | 화면 |
|---|---|
| 뼈만 남은 공룡, 생김새는 어떻게 알아낼까요? | 보드 위 뼈대 그림. 물음표가 손글씨로 그려진다 |
| 먼저, 뼈에 남은 근육 자국을 따라 살을 붙입니다 | 뼈의 거친 근육 자국 확대에 빨간 동그라미, 이어 근육 층이 덮인다 |
| 다음은 가장 가까운 친척, 새와 악어와 비교합니다 | 새 골격과 악어 골격 도해가 양옆에 붙고 화살표가 공룡으로 모인다. 피부 층 |
| 운이 좋으면, 피부와 깃털 자국이 화석에 남습니다 | 박물관 표본 사진 느낌의 깃털 자국 화석 클로즈업, 형광펜 |
| 깃털 속 색소 알갱이로 색까지 알아낸 공룡도 있습니다 | 현미경 원 안의 색소 알갱이, 줄무늬 꼬리를 가진 작은 공룡(시노사우롭테릭스)이 색을 입는다. 연도 도장 2010 |
| 그런데, 1850년대 런던의 이구아노돈은 코에 뿔이 있었습니다 | 빅토리아 시대 판화풍 이구아노돈(코 위에 뿔), 도장 1854, 빨간 동그라미가 뿔에 |
| 알고 보니 엄지손가락이었죠 | 뿔이 오려진 종이처럼 떨어져 앞발 엄지로 옮겨 붙는다 |
| 지금 우리가 아는 공룡의 모습도, 화석 하나로 다시 바뀔 수 있습니다 | 다 복원된 벨로키랍토르(깃털과 색 층). 마지막 말 뒤 끝 화면에서 뼈대 선이 한 번 비쳐 첫 장면과 짝 |
- 같은 구도 5초 이하. 카메라는 보드 위를 옮겨 다니되 컷마다 거리와 각도를 바꾼다.
- 사실 표기: 이구아노돈 모형은 1854년 런던 수정궁 공원. 시노사우롭테릭스 색은 2010년 연구. 화면 글자에 이 둘 밖의 숫자를 새로 넣지 않는다.
- 음악: 낮은 음량의 차분한 피아노나 현 패드 한 줄을 코드로 작곡해 깐다(내레이션보다 -18dB 안팎). 동그라미가 그려질 때 마커 소리 같은 짧은 효과는 코드로 만들어도 된다.
그림 프롬프트
1층 뼈대 (raptor-skeleton)
Mode: built-in image_gen
Use case: scientific-educational
Asset type: one large cut-out figure, 1536x1024 pixels, 3:2 landscape. This is layer 1 of 4 of the same animal; later layers will be drawn exactly on top of it, so keep the pose simple and fully visible.
STYLE (most important): a scientific paleo-art plate as printed in a natural-history museum guidebook. Hand-painted gouache with fine ink detail, soft studio light from the upper left, realistic proportions, calm and precise. It must look like a carefully painted printed illustration, NOT a photograph, NOT a 3D render, NOT a cartoon.
Subject: the complete articulated SKELETON of a Velociraptor (a small feathered dromaeosaurid theropod), strict side view, facing RIGHT, standing calmly.
Pose: walking stance with both hind legs on the same ground line, left leg slightly forward, the enlarged sickle claw on the second toe raised clear of the ground. Long straight stiff tail held horizontal, pointing left. Neck in a gentle S-curve, long low skull with the mouth closed, eye socket clearly visible. Both arms folded against the chest, three long fingers with curved claws.
Bones: warm ivory and pale bone color with soft brown shading, clearly separated vertebrae, ribs, gastralia, pelvis (ilium, pubis pointing backward), thick thigh bone (femur) with visible rough bumpy muscle-attachment ridges. Bones only: no flesh, no skin, no feathers, no outline of the body.
Composition: the whole skeleton fits inside the image with an even margin of about 8% on every side. Tail tip near the left margin, snout near the right margin, toes about 10% above the bottom edge. The figure is centered.
Background: perfectly flat solid pure green #00ff00, RGB (0,255,0), uniform chroma key, also visible through every gap between the bones. Absolutely no gradient, no ground, no shadow on the background, no texture. The animal contains no green.
No text, no letters, no numbers, no labels, no logo, no watermark, no frame, no scale bar.
2층 근육: 뼈대 그림 위에 덧칠 (raptor-muscle)
Mode: built-in image_gen
Selected output: first generation (better source style match; background-only refinement did not achieve exact RGB).
Generation prompt:
Use case: scientific-educational.
Asset type: one large cut-out figure, Layer 2 of 4 anatomical overlay, exactly 1536x1024 pixels, 3:2 landscape.
Input image 1: EDIT TARGET and absolute pixel-registration reference. Edit this exact skeleton image by painting its MUSCLE layer over it.
PRIMARY REQUEST / CRITICAL INVARIANTS: This is the same Velociraptor in the exact same pose. Keep identical canvas, framing, margins, size, position, right-facing direction and anatomy landmarks. Paint over the source as if tracing it. Do not translate, rotate, scale, mirror, re-pose, or recompose any part. Keep skull, jaw, neck, every leg segment, both feet, raised sickle claws, folded arms, hands, and long straight tail on the identical source coordinates. Preserve all joint centers, bone axes, toe and claw tips, nose tip and tail tip. Source placement anchors on the 1536x1024 canvas: tail tip near (51,332); nose tip near (1492,254); skull top around y190; feet remain near y840. These anchors serve only to preserve the source and must never be drawn or labeled.
Subject change only: reconstruct the anatomical musculature directly on this skeleton with deep red and red-brown striated muscle, pale tendons and white fasciae. Add thigh and tail muscles including the large tail-base-to-thigh muscle, jaw muscles and neck muscles. Cover the rib cage with anatomical trunk muscles. Overall silhouette is only slightly thicker than skeleton; muscle wraps existing anatomy without changing pose or endpoints. Skull bones, teeth line, and claws may remain visible where muscle is thin. No skin, scales or feathers.
Style: match the source scientific paleo-art plate, realistic hand-painted gouache with fine ink details, soft studio light from upper left. Not a photograph, 3D render or cartoon.
Background: perfectly flat solid pure green #00ff00 RGB (0,255,0), everywhere outside the animal including gaps between limbs. Uniform chroma key with no gradient, ground, shadow, texture or mottling. Animal contains no green.
No text, letters, numbers, labels, logo, watermark or frame.
Output exactly 1536x1024 pixels. Preserve source registration above all other considerations.
[… 고르지 않은 배경 수정 프롬프트와 검증 메모는 줄임]
1854년 판화풍 이구아노돈 (iguanodon-plate)
Mode: built-in image_gen
Use case: historical illustration
Asset type: full-frame illustration plate, opaque PNG, 1536x1024 pixels, 3:2 landscape.
STYLE: a mid-19th-century Victorian wood engraving from an illustrated magazine: black ink line engraving with dense cross-hatching on aged warm off-white paper with faint foxing. Black ink on paper only.
Subject: the 1850s Victorian idea of an Iguanodon, like the life-size sculpture in a London park: a huge heavy four-legged reptile resembling a giant scaly iguana crossed with a rhinoceros, strict side view facing RIGHT, standing on four thick pillar-like legs, the two front feet flat on the ground and fully visible, low hanging belly, thick tail curving down to the ground, small iguana-like head with a big nose. IMPORTANT: the top of the snout is smooth and bare, with NO horn and NO spike on the nose (a horn will be added separately later). The animal stands on a low rocky ground line with a few ferns and a distant suggestion of Victorian park trees, all in engraving lines. The animal fills about 80% of the width, centered.
The paper fills the whole image; no border line, no frame.
No text, no letters, no numbers, no labels, no caption, no logo, no watermark.
음악 지시
- 음악: 낮은 음량의 차분한 피아노나 현 패드 한 줄을 코드로 작곡해 깐다(내레이션보다 -18dB 안팎). 동그라미가 그려질 때 마커 소리 같은 짧은 효과는 코드로 만들어도 된다.
작업 세션은 파이썬으로 72 BPM, D 단조의 피아노 아르페지오와 느린 현을 MIDI로 쓰고 FluidSynth와 GeneralUser GS 사운드폰트로 렌더했다. 「그런데」 마디에서는 피아노가 빠진다. 효과음 20개도 잡음에 필터와 감쇠를 거는 방식으로 코드에서 합성했다.
수분 세럼 광고
가상 제품 「한 방울」의 18초 광고다. 이 편의 시험은 제품 병을 Meshy 없이 three.js 코드로 만드는 것이었다. 작업 세션이 스스로 매긴 점수는 10점 만점에 7점이었다. 유리 벽에 굴절이 없고, 면이 너무 매끈해서 가까이 보면 CG 티가 난다는 이유였다. 사람 피부 사진을 쓰지 않으려고 건조한 피부는 갈라진 점토 질감으로 대신했다. 작업 세션 시간은 44분이다.
작업 지시서
세럼 광고 지시 (TASK.md)
# 광고: 가상 수분 세럼 「한 방울」
먼저 `../COMMON-2026-10-06.md` 를 읽는다. 결과 `out/serum-ad.mp4`, 약 19초(내레이션 0.3초 지연 + 16.5초 + 끝 카드 2초).
## 입력
- `audio/narration.mp3`: ElevenLabs v4, 한국어 여성 목소리 Anna Kim(차분하고 맑음), 16.5초. 낱말 시각 `audio/words.json`.
## 스타일: 뷰티 광고
파스텔 배경(물빛 하늘색, 연한 분홍, 흰색), 제품 정면샷과 천천히 도는 제품, 떨어지는 세럼 한 방울 매크로, 물결처럼 퍼지는 질감, 얇은 세리프 글자가 짧게 떴다 사라짐, 끝 카드. 고급스럽고 조용하게. 카피 한 줄은 2초 안에 읽힌다.
## 제품 병은 Opus 가 코드로 만든다 (이 편의 시험)
three.js 로 스포이트 유리병을 직접 만든다: LatheGeometry 몸통, 투명 유리(MeshPhysicalMaterial transmission), 안에 연한 물빛 세럼, 흰색 고무 스포이트와 옅은 금색 띠, 라벨에 「한 방울」과 작은 영문 HAN BANGUL. Meshy 는 쓰지 않는다. 병이 얼마나 그럴듯한지가 이 편의 판정 항목이다(notes.md 에 스스로 평가).
## 컷 (영상 시각 = 낱말 시각 + 0.3)
| 내레이션 | 화면 |
|---|---|
| 오후 세 시, 당기는 피부 | 사무실 창가 오후 빛, 건조한 갈라진 질감(사람 피부 사진이 아니라 추상 질감) 위 글자 "오후 3시" |
| 필요한 건 단 한 방울 | 스포이트 끝에 맺힌 세럼 한 방울이 천천히 떨어진다(매크로, 슬로모션) |
| 크기가 다른 히알루론산 세 가지가, 겉부터 속까지 채워 줍니다 | 크기가 다른 투명 구슬 셋이 층으로 그린 피부 단면도에 각자 다른 깊이로 스며드는 깔끔한 도해. 성분 이름 글자 |
| 바르는 순간, 물을 마신 듯 | 물결이 퍼지는 질감, 화면이 맑아지는 순간. 이 편의 정점 |
| 수분 세럼, 한 방울 | 파스텔 배경 위 제품 정면, 천천히 돈다 |
| 오늘부터 촉촉하게 | 끝 카드: 제품, 이름 「한 방울」, "지금 만나 보세요" 버튼 모양, 맨 아래 작게 "이 영상의 제품은 가상 제품입니다" |
- 효능 수치(몇 시간 지속, 몇 % 개선)와 피부 전후 비교는 넣지 않는다. 실제 브랜드의 병 모양이나 로고를 흉내 내지 않는다.
- 배경 질감과 소품은 Codex 로 뽑아도 된다. 제품 병은 코드로만.
- 음악: 부드러운 피아노나 플럭 코드 진행을 코드로 작곡해 내레이션 밑에 깐다(-18dB 안팎). 한 방울 떨어질 때 맑은 물방울 소리 한 번.
그림 프롬프트
건조함을 대신한 갈라진 점토 질감 (tex02-dry-crack)
Mode: built-in image_gen
Use case: ads-marketing
Asset type: full-frame abstract texture for the dryness moment of a vertical premium skincare video ad.
Create one photographic image, portrait 2:3, exactly 1024x1536 pixels.
Subject: extreme macro, straight top-down, of a thin layer of dried pale cosmetic clay that has cracked into many fine irregular plates, like a dry riverbed in miniature. Fine hairline cracks between plates, some plate edges slightly curled up. This is clearly an abstract material texture, NOT human skin.
Style (most important): premium skincare advertisement photography, quiet and luxurious, soft diffused light, airy, clean, high-key, very fine detail. Photographic, not illustration, not CGI-looking. Calm minimal composition, with clean uncluttered plate surfaces.
Composition: texture fills the entire frame edge to edge evenly, no vignette, no focal object.
Lighting: warm low side light from the left reveals delicate relief while maintaining soft diffusion, cream highlights and soft muted shadows.
Palette: pastel dusty blush pink and warm beige, cream highlights. Restrained, pale, airy color.
Absolutely no people, no hands, no faces, no skin, no products, no bottles, no packaging. No text, no letters, no numbers, no logo, no watermark, no frame, no border.
오후 3시 사무실 창가 (bg01-office-window)
Mode: built-in image_gen
Use case: background plate for a vertical skincare video ad.
STYLE (most important): premium skincare advertisement photography, quiet and luxurious, soft diffused light, airy, clean, high-key, very fine detail, shallow depth of field where noted. Pastel palette only: watery pale sky blue, soft blush pink, white and warm cream. Calm minimal composition with generous empty space. Photographic, not illustration, not CGI-looking.
Subject: a quiet modern office corner at 3 pm. A tall window on the left with thin horizontal blinds half open; warm golden afternoon sunlight streams in and lays long diagonal stripes of light and shadow across a pale cream wall and the corner of a clean white desk. Faint dust motes in the light. The air feels slightly dry and warm. Nothing on the desk except a soft shadow. Upper half is mostly the lit wall, lower third is the desk edge, slightly out of focus.
Palette: warm cream and soft gold light, pale sky blue shadows, a hint of blush.
Portrait 2:3, 1024x1536 pixels. Absolutely no people, no hands, no faces, no skin, no products, no bottles, no packaging. No text, no letters, no numbers, no logo, no watermark, no frame, no border.
음악 지시
- 음악: 부드러운 피아노나 플럭 코드 진행을 코드로 작곡해 내레이션 밑에 깐다(-18dB 안팎). 한 방울 떨어질 때 맑은 물방울 소리 한 번.
작업 세션은 80 BPM, D 장조로 피아노와 패드, 첼레스타를 쓰고 정점에서만 16분음표로 촘촘하게 했다. 물방울 소리는 900Hz에서 2600Hz로 올라가는 사인파에 배음과 잔향을 더해 코드로 만들었다. 내레이션은 ElevenLabs 공유 목소리 가운데 한국어 여성 목소리를 썼다.
고양이 배틀 만화
고양이와 물컵이 결투하는 25초 종이 만화다. 90년대 소년 배틀만화 느낌을 원했지만, 특정 작품의 캐릭터나 기술 이름을 쓰지 않고 화풍 특징으로만 적게 했다. 고양이가 끝까지 같은 고양이로 보이도록 표정과 자세를 모델 시트 한 장에 먼저 뽑고, 이후 그림마다 그 시트를 참조로 넘겼다. 쪽 내용은 캔버스에 그리고, three.js가 그 캔버스를 종이 면에 입혀 휘면서 넘긴다. 그림 14장은 모두 첫 시도에 통과했고, 작업 세션 시간은 50분이다.
작업 지시서
만화 편 지시 (TASK.md)
# 종이 만화: 고양이와 컵, 소년 배틀만화 패러디
먼저 `../COMMON-2026-10-06.md` 를 읽는다. 결과 `out/manga-cat.mp4`, 약 25초. 내레이션 없음, 의성어와 효과음과 짧은 배틀 음악.
## 스타일
실제 종이 만화책을 찍은 것처럼: 종이 결, 살짝 바랜 흰색, 인쇄된 먹선. 90년대 소년 배틀만화 화풍: 깔끔하고 굵은 먹선, 스크린톤 점, 집중선과 속도선, 기를 모을 때 몸 둘레에 타오르는 기운, 손글씨 같은 굵은 의성어. 칸 안의 그림이 실제로 살아 움직이고, 장면이 바뀌면 책장이 3D 로 휘며 넘어간다(three.js 로 종이 면을 휜다). 흑백이 기본이고 표지나 마지막 칸 하나만 색을 써도 된다.
- 특정 작품의 캐릭터, 기술 이름, 대사, 로고를 쓰지 않는다. Codex 프롬프트에 작가나 작품 이름을 넣지 말고 화풍 특징(굵은 먹선, 스크린톤, 집중선, 90년대 일본 소년만화 연출)으로 적는다.
- 고양이는 처음부터 끝까지 같은 고양이로 보여야 한다. 표정과 자세를 시트 한 장에 모아 한 번에 뽑고, 칸 그림은 그 시트를 참조로.
## 칸 콘티
| 묶음 | 칸 | 살아 움직이는 것 | 소리 (`audio/sfx/`) |
|---|---|---|---|
| 기 (첫 페이지, 0~6초) | 바람 부는 식탁에서 고양이와 물컵이 결투하듯 마주 봄. 두 눈만 크게 잡은 가로 칸 | 털과 식탁보가 바람에 날리고 눈빛이 번쩍 | wind-gust, eye-flash |
| 승 (6~13초) | 집사의 말풍선 "안 돼". 고양이가 기를 모은다 | 기운이 타오르고 식탁에 금이 가고 컵 물이 떨린다. 의성어 "고오오" | aura-charge, cat-meow-angry |
| 전 (책장 넘김 뒤, 13~19초) | 양면 큰 칸, 앞발 일격. 기술 이름 "냥냥파!" | 컵이 칸 테두리를 뚫고 다음 칸으로 날아가 "쨍그랑". 페이지 전체가 한 번 흔들린다 | page-flip, punch-whoosh, glass-shatter |
| 결 (19~25초) | 다음 날, 컵이 사라진 식탁. 고양이의 다음 목표는 집사 휴대폰. 칸 구석에 "다음 화에 계속" | 고양이 눈만 번쩍, 그 뒤 책이 덮인다 | eye-flash, book-close |
- 의성어와 말풍선 글자는 코드로 쓴다(굵은 한글 글꼴 + 흰 테두리, 칸을 살짝 넘치게). 칸 테두리, 스크린톤, 집중선도 코드로.
- 음악: 짧고 긴장감 있는 배틀 음악(타악기, 낮은 현이나 브라스)을 코드로 작곡해, 승에서 쌓고 전의 일격에서 터지고 결에서 코믹하게 빠진다.
- 마무리: "다음 화에 계속" 뒤 책이 덮이는 소리로 닫는다. 마지막 1초는 덮인 책 표지.
그림 프롬프트
고양이 모델 시트 (cat-sheet)
Mode: built-in image_gen
Asset type: character model sheet, opaque PNG, 1536x1024 pixels, 3:2 landscape.
STYLE (most important): black-and-white Japanese boys' battle manga artwork from the 1990s, as printed in a paper comic book. Clean, bold, confident black ink lines with tapered brush-pen strokes, solid black fills, and grey tones made ONLY with mechanical screentone dot patterns (regular halftone dots). Dramatic, intense, heroic staging and sharp angular eyes, but drawn with simple clean shapes. Pure monochrome: black ink on white paper. No colour, no soft grey airbrush gradients, no painterly shading, no 3D render, no photo.
THE CAT (keep identical in every drawing): a lean short-haired WHITE cat with ONE solid black patch covering its LEFT ear and the area around its LEFT eye, a fully BLACK tail, a small V-shaped notch in the tip of its RIGHT ear, long white whiskers, large almond eyes with thin vertical slit pupils and bold black eyeliner-like outlines. Body fur is white paper with ink outlines and small spiky fur tufts on chest and cheeks.
Layout: SIX separate drawings of the same cat arranged in a 3-column x 2-row grid, each drawing fully inside its own cell, with wide empty magenta gaps (at least 80 pixels) between drawings. Drawings must not touch each other or the image border. No panel borders, no boxes around the drawings.
Row 1, left: the cat sitting upright in strict side view facing RIGHT, tense and still, glaring forward like a duelist, tail curled around its paws.
Row 1, middle: close-up of the cat's face from the front, both eyes narrowed fiercely, a tiny bright highlight in each eye, whiskers straight.
Row 1, right: the cat crouched low in a three-quarter front view, gathering power, fur bristling and standing up along the back, mouth open hissing with small fangs showing, ears flattened.
Row 2, left: the cat leaping through the air in a dynamic side view facing LEFT, body stretched long, its right front paw thrust far forward with claws out, delivering a strike.
Row 2, middle: the cat sitting calmly in a three-quarter view, smug half-closed eyes, a sly little smile, tail tip flicking.
Row 2, right: only the top of the cat's head peeking up from below a flat edge (ears, forehead and eyes visible, the lower face hidden), eyes wide and glinting, looking to the side.
Background: perfectly flat solid pure magenta #ff00ff, RGB (255,0,255), uniform chroma key everywhere outside the drawings. No gradient, no texture, no shadow on the background. Inside the cat, the white fur is pure white, never magenta or pink.
No text, no letters, no numbers, no sound effects, no logo, no watermark, no signature.
전(轉)의 일격 칸 (p4-strike)
Mode: built-in image_gen
Asset type: character cut-out on chroma key, opaque PNG, 1536x1024 pixels, 3:2 landscape.
[… STYLE 문단과 THE CAT 문단은 위 모델 시트와 글자 하나 다르지 않아 줄임]
The attached reference image is the model sheet of THIS cat: match its face, markings (black patch on its LEFT ear and around its LEFT eye, black tail, notch in the RIGHT ear), proportions and line style exactly.
Subject: the full body of the cat leaping through the air in a dynamic side view facing LEFT, body stretched long and horizontal, delivering a decisive strike: its right front paw is thrust far forward toward the LEFT edge with the paw pads and claws out, drawn slightly enlarged by foreshortening, the other front paw tucked, hind legs extended back, black tail streaming behind. Its mouth is open in a battle cry, its eyes are fierce. The cat spans about 80% of the canvas width. Do NOT draw speed lines, impact effects, ground or background; only the cat.
Background: perfectly flat solid pure magenta #ff00ff, RGB (255,0,255), uniform chroma key everywhere outside the subject, with a generous empty margin around the subject; the subject must not touch the image border. No cast shadow, no gradient on the background. White areas inside the subject are pure white, never magenta or pink.
No text, no letters, no numbers, no sound-effect lettering, no speech balloons, no logo, no watermark, no signature.
음악 지시
- 음악: 짧고 긴장감 있는 배틀 음악(타악기, 낮은 현이나 브라스)을 코드로 작곡해, 승에서 쌓고 전의 일격에서 터지고 결에서 코믹하게 빠진다.
- 마무리: "다음 화에 계속" 뒤 책이 덮이는 소리로 닫는다. 마지막 1초는 덮인 책 표지.
작업 세션은 파이썬 mido 로 D 단조, 120 BPM의 오케스트라 편성 MIDI를 쓰고 FluidSynth로 렌더했다. 효과음 8종은 메인 세션이 ElevenLabs로 미리 만들어 두었고, 영상에서 11번 쓰였다.
도구와 비용
| 도구 | 쓴 곳 | 비용 |
|---|---|---|
| Claude Code (Opus 5.5, effort xhigh) | 기획, 지시서, 검사(메인 세션)와 편마다 하나씩 띄운 작업 세션 | 구독 |
| Codex 이미지 생성 | 그림 전부. 한 장에 44 |
구독 |
| Meshy 7 (이미지로 3D 모델) | 상어 3D 모델 한 번 | 30크레딧(약 0.5달러) |
| ElevenLabs Pro | 내레이션(복제한 내 목소리, 세럼은 공유 목소리), 만화 효과음 | 요금제 안 |
| Remotion 4 | 모든 편의 조립과 렌더 | 0원 |
three.js (@remotion/three, @react-three/fiber) |
상어 3D, 세럼 병, 만화 책장 휘기 | 0원 |
| 파이썬 MIDI 작곡 + FluidSynth + GeneralUser GS 사운드폰트 | 공룡, 세럼, 만화 음악 | 0원 |
motion_check.py (작업 세션에게 만들게 한 검사 스크립트, ffmpeg 기반) |
거의 멈춘 시간, 같은 구도가 이어진 최장 구간, 0.5초 간격 시트 | 0원 |
| ffmpeg | 음량 맞추기(-14 LUFS), 프레임 시트 | 0원 |
| Blender | Meshy 모델 여덟 방향 확인 | 0원 |
구독 밖에서 따로 든 것은 Meshy 30크레딧뿐이다. 영상 생성 AI(Seedance, Sora, Veo, Kling 같은 것)는 쓰지 않았다. GeneralUser GS 사운드폰트는 개인, 상업 음악 제작에 제한 없이 쓸 수 있는 라이선스다.
시도 횟수
- 보여 준 다섯 편 말고도 중간에 버리거나 고친 영상이 열한 개 더 있었다. 10월 4일 시안 다섯, 상어 판 넷, 영상에 넣지 않은 다른 편의 두 판이다.
- 내가 다시 만들어 달라고 한 것은 다섯 번이다.
- 그림은 73장을 뽑아 썼고, 다시 뽑은 것은 5장뿐이다(상어 몸통, 얼음 수면, 상어 정면 두 번, 비스듬한 앞모습). 상어 3D 배경 10장, 공룡 13장, 세럼 5장, 만화 14장은 모두 첫 시도에 통과했다.
- Meshy 3D 모델은 한 번도 다시 만들지 않았다.
- 공룡, 세럼, 만화 세 편은 21시 3분에 동시에 시작해 50분 안에 모두 끝났다.
마무리
직접 해 보니 모션 그래픽을 만드는 일 대부분은 이제 코드로 맡길 수 있겠다는 생각이 들었다. 20~30초짜리 쇼츠 한 편이 30분에서 50분이면 나왔다.
대신 지루하다, 끊긴다 같은 문제는 대부분 영상 자체보다 지시와 대본에서 생겼다. 상어 첫 판이 지루했던 것도, 3D 판이 말하다 만 것처럼 끝난 것도 작업이 아니라 지시서와 원고 탓이었다. 무엇을 만들고 어떻게 끝낼지 정하는 일은 여전히 사람 몫이었다.
그리고 Claude는 소리를 직접 듣지 못한다. 작업 세션은 음악을 음량과 스펙트로그램으로만 확인했고, 음악이 괜찮은지는 결국 사람이 들어 보고 판단해야 했다.
댓글
아직 댓글이 없습니다. 첫 댓글을 남겨보세요!