코드로 하는 모션 디자인
먼저 물어볼 것
- 형식과 지속 시간 (예: 릴 9:16 1080×1920 30fps), 게시 위치.
- 브랜드의 색상, 폰트, 로고 및 수정할 수 없는 사항 (로고는 그대로 사용).
- 참고 스타일 (동영상 또는 이미지) 및 텍스트 포함 여부.
- 최종 편집을 사용자가 하는 경우 (Premiere/After Effects): 단일 비디오가 아닌 클립을 전달.
엔진
- Node +
@napi-rs/canvas로 그리기, ffmpeg로 인코딩.
- 각 프레임은 시간의 순수 함수
draw(ctx, t): 프레임 간 상태 없음. 따라서 어떤 순간이든 재생성, 확인 또는 병렬 렌더링 가능.
- 라이브러리(팔레트, 폰트, 이징, 스프링), 시퀀스, 배경, 렌더, 컨택 시트, 분석 등 별도 파일.
- Windows에서 Python은
py로 호출.
움직임
- 스프링 (감쇠 스프링의 폐쇄 응답)으로 진입 및 이동: 강한 시작, 부드러운 도착, 거의 느껴지지 않는 오버슈트. 3~4개의 프리셋 유지 (표준, 빠른 이탈, 큰 이동용 느림, 부드러움) 대신 분산된 값 사용.
- 부드러운 ease-in-out으로 형태 변형 및 선 그리기.
- 모션 블러: 180° 셔터에서 4개의 서브 프레임을 평균. 렌더링 속도 저하: 미리보기용 블러 없는 옵션 제공.
- 연속 요소 간 0.05~0.15초 지연.
- 우아한 스타일의 경우 만화 같은 바운스 금지; 여유로운 리듬, 동작 간 공간 확보.
연속성
- "하나의 형태가 변형되는" 스타일: 각 장면은 이전 장면의 지오메트리에서 생성되며, 급격한 컷 없음.
- 변형 중에는 요소가 사라졌다가 다시 나타나지 않음: 원본이 그려지지 않는 동시에 후속 요소가 같은 위치, 크기, 색상으로 생성됨.
- 두 형태가 교환될 때 교환 순간에 회전, 크기, 색상을 공유; 페이드는 겹침 (빈 프레임이나 중복 프레임 없음).
- 큰 흰색 채움: 중앙에서 채워서 성장, 페이드 인 하지 않음 (페이드 인 하면 회색으로 보임).
- 스타일이 요구하면 정지 상태 금지: 호흡, 느린 회전, 부유, 약간의 카메라 푸시인.
제어
- 전체 렌더 전 프레임 컨택 시트.
- 분석 스크립트: 0.5초마다 이미지 변화량 측정, 정체 구간 및 급격한 변화 탐지.
- 최종 파일의 지속 시간, 해상도, fps를
ffprobe로 확인.
내보내기
- 미리보기/소셜: MP4 H.264
-crf 14 -pix_fmt yuv420p.
- 편집용: MOV ProRes 422 HQ 10비트.
- 오디오 추가:
ffmpeg -i video.mp4 -i audio.wav -map 0:v -map 1:a -c:v copy -c:a aac -b:a 256k -shortest 최종.mp4
인스타그램 릴
- 그래픽 중심 (540, 960); 유효 영역 너비 최대 약 900px.
- 프로필 그리드가 중심을 4:5(1080×1350) 및 3:4로 자름: 핵심 콘텐츠는 y ~420에서 ~1500 사이.
- 아래와 오른쪽에는 앱의 캡션과 버튼이 있음: 비워둠.
- 다른 내보내기 규격은
grafica 플러그인 참조.