커피 머신을 누르면 커피가 내려옵니다. 고양이는 잠에서 깨고, 코드 리뷰 보드에서 시작한 빛은 서버까지 흘러갑니다. 밤으로 바꾸면 같은 건물에 불이 켜집니다.
이 장면은 SVG와 TypeScript로 만들었습니다. line-art-animation의 원본 예제를 실행한 뒤, 라이브러리는 그대로 두고 2층 개발자 스튜디오로 확장했습니다.
결과를 보여 주는 데서 끝내지 않고 복사해서 쓸 제작·수정·영상 출력 프롬프트, 실행 가능한 전체 소스를 함께 제공합니다. 같은 결과를 바로 띄우려면 소스 ZIP을, 내 장면을 새로 만들려면 프롬프트를 사용하면 됩니다.
완성한 데모부터 눌러 보세요
- 위층 사람을 클릭하면 인사한 뒤 원래 자세로 돌아옵니다.
- 아래층 커피 머신과 고양이를 눌러 보세요. 커피 추출과 잠에서 깨는 반응이 이어집니다.
- 리뷰 보드 또는 서버를 누르면 빌드 → 케이블 전송 → 준비 상태를 연출합니다.
- 자전거에는 벨 반응, 건물에는 낮밤 전환과 조명이 있습니다. 벨 소리는 선으로만 표현하며 데모는 무음입니다.
- Tab으로 대상을 선택하고 Enter로 실행할 수도 있습니다.
사람은 7명입니다. 위층 3명, 아래층 바리스타 1명, 길 위 보행자 2명과 자전거를 탄 사람 1명입니다. 서버 신호는 실제 빌드나 배포 요청을 보내지 않는 시각적 시뮬레이션입니다.
웹 데모에서는 직접 클릭할 수 있습니다. 릴스와 MP4는 그 반응을 녹화한 영상이므로 영상 속 요소를 누르는 기능은 남지 않습니다.
원본 스킬이 해 주는 것과 직접 만든 것
원본은 코딩 에이전트가 읽는 스킬 지침과 작은 TypeScript 라이브러리로 구성됩니다. walker와 village 예제가 있고, 걷기 포즈·선 그리기·작은 움직임·낮밤 색을 계산합니다.
| 구성 | 원본의 역할 | 이번 응용 |
|---|---|---|
ink.ts |
선, 팔다리, SVG 배치 | 인물, 건물, 커피 바, 서버 랙 |
gait.ts |
보행 속도와 포즈 | 두 보행자의 이동과 발 움직임 |
motion.ts |
보간과 움직임 계산 | 반응의 전환과 작은 흔들림 |
daynight.ts |
시간에 따른 종이색·먹선·조명 | 야간 팔레트와 건물 조명 |
건물, 사람의 배치, 커피 머신과 고양이, 리뷰와 서버의 상태 연결은 이번에 작성한 응용 코드입니다. 원본 예제가 이 스튜디오를 그대로 제공하는 것은 아닙니다.
원본 커밋은 c43d698913cf0ad44f984c7ae14c5348010594d3입니다. lib/의 네 파일은 원본과 해시가 같고, MIT 라이선스를 소스 ZIP에 보존했습니다. 전역 설치 없이 별도 프로젝트에서 사용했습니다.
1. 실행 환경과 설치
| 항목 | 이번 실행 |
|---|---|
| 운영체제 | Windows |
| Node | v24.12.0 |
| Chrome | 157.0.8103.51 |
| Vite | 7.3.8, 원본 잠금 파일 |
| TypeScript | 5.9.3 |
| FFmpeg | 8.0.1 |
같은 스튜디오를 바로 실행하기
스튜디오 전체 소스 ZIP을 풀고 프로젝트 폴더에서 실행합니다.
cd line-art-animation-studio
npm ci
npm run dev터미널에 출력되는 로컬 주소를 여세요. 검사는 다음 두 명령으로 실행합니다.
npm run typecheck
npm run buildZIP에는 src/, 원본 lib/, 라이선스, package-lock.json, 제작 명세와 무음 영상 출력 스크립트가 들어 있습니다. node_modules는 포함하지 않으므로 최초 설치에는 패키지를 내려받을 수 있어야 합니다.
원본 예제도 실행해 보기
git clone https://github.com/JDhruv14/line-art-animation.git
cd line-art-animation
git checkout c43d698913cf0ad44f984c7ae14c5348010594d3
npm ci
npm run dev/examples/walker/에서 걷기와 모자 인사를, /examples/village/에서 낮밤 전환을 먼저 확인했습니다. 스킬 지침은 저장소의 SKILL.md와 연결된 참고 문서를 코딩 에이전트가 읽도록 하면 됩니다. 원본에는 전역 설치를 해야만 실행되는 서비스가 없습니다.
2. 이 프롬프트로 장면을 요청하세요
아래는 이번 장면 명세를 재사용할 수 있게 정리한 전체 제작 프롬프트입니다. 스킬과 라이브러리를 읽을 수 있는 코딩 에이전트에 붙여 넣습니다.
line-art-animation 스킬로 "개발자 스튜디오의 하루"라는 복잡한 인터랙티브 SVG 장면을 만들어 줘.
결과부터 보고 써 보고 싶어질 만큼, 여러 행동이 동시에 이어지게 해 줘. 따뜻한 종이 위 가는 먹선, 청록과 커피색 포인트를 유지하고 화면을 UI 상자들로 채우지는 마.
2층 건물을 단면으로 보여 줘. 위층에는 개발자 두 명이 일하는 작업실과 코드 리뷰 보드, 아래층에는 바리스타가 있는 커피 바와 서버 랙 세 개가 있는 서버실을 배치해 줘. 건물 앞 거리에는 보행자 두 명과 배달 자전거가 지나가고, 하늘에는 새와 천천히 흐르는 구름, 지붕에는 굴뚝과 태양광 패널이 있어.
다음 반응을 구현해 줘.
- 개발자를 클릭하면 인사하고 원래 자세로 돌아와.
- 커피 머신을 누르면 커피가 내려오고 김이 올라와.
- 고양이는 누르면 잠에서 깨고, 잠시 뒤 다시 쉬어.
- 리뷰 보드나 서버를 누르면 빌드 → 케이블을 따라 전송 → 서버 불빛이 차례로 바뀌어. 실제 서버 작업이 아니라 애니메이션 연출이라고 밝혀 줘.
- 자전거를 누르면 벨 울림을 선으로 표현하고, 풍경을 누르면 자연스럽게 흔들려.
- 밤이면 건물의 램프가 켜지고 선과 종이색이 바뀌어. 페이지 바깥 배경은 그대로 유지해 줘.
인물은 원본 gait()의 보행 속도와 pose를 함께 써서 발이 미끄러지지 않게 해 줘. 자전거 바퀴와 페달은 이동에 맞춰 움직이게 해 줘. 인물의 몸 전체를 사인파로 흔드는 방식은 쓰지 마.
클릭 면적을 충분히 주고 Tab과 Enter로도 조작할 수 있게 해 줘. 새 SVG 요소를 매 프레임 만들지 말고 기존 요소의 좌표와 속성만 갱신해 줘. npm ci, npm run dev, npm run typecheck, npm run build로 독립 실행되는 TypeScript + Vite 프로젝트로 만들어 줘. lib/와 원본 MIT 라이선스를 보존해 줘.
완성 뒤 브라우저에서 모든 반응과 원상 복귀, 낮밤 전환 중간의 대비, 모바일 가로 넘침을 검사해 줘. debug 모드에서 시간을 정확히 바꾸고, 클릭 전후와 낮밤 스틸을 비교할 수 있게 해 줘. 조작 가능한 데모와 소스, 짧은 무음 시연 영상을 함께 제공해 줘.이번 작업은 작은 책상 장면을 먼저 만들고, 복잡한 스튜디오로 확장한 뒤 브라우저에서 수정했습니다. 이 프롬프트 하나로 한 번에 완성됐다거나 같은 결과가 자동으로 나온다는 뜻은 아닙니다. 정확히 같은 결과를 재현하는 경로는 위의 소스 ZIP입니다.
3. 실행한 뒤에는 이 프롬프트로 고칩니다
완성된 개발자 스튜디오 SVG를 실행해 보고, 다음 항목을 수정해 줘.
장면과 캐릭터의 정체성은 유지해 줘. 관찰한 문제와 수정 내용을 전후 스틸, 변경한 함수와 함께 기록해 줘.
1. 걷는 인물은 gait()의 period, speed, pose를 같은 시간에 연결하고 발 접지 프레임을 비교해 줘.
2. 커피 머신, 고양이, 리뷰 보드와 서버를 각각 클릭해 시작 → 동작 → 복귀 상태를 확인해 줘. 각 대상은 Tab과 Enter로도 조작할 수 있게 해 줘.
3. 빌드 → 케이블 전송 → 서버 준비 순서를 보여 주되 실제 배포라고 표현하지 마.
4. 낮, 해질녘, 밤과 그 사이 팔레트에서 글자와 선이 배경에 묻히지 않는지 확인해 줘. 페이지 바깥 배경은 유지해 줘.
5. 터치 화면에서도 누르기 쉬운 투명 클릭 영역을 두고 390px 너비에서 가로 스크롤이 생기지 않게 해 줘.
6. npm run typecheck와 npm run build를 통과시키고 브라우저 오류를 확인해 줘. 실패한 항목을 숨기거나 검사 대신 성공이라고 적지 마.
결과물: 수정된 소스, 실제 검사 결과, 수정 전후 스틸, 남은 한계.실제 보행 코드
핵심은 이동 속도와 발 포즈에 같은 시간을 넣는 것입니다. 몸 전체를 위아래로 흔들어 걷는 흉내만 내지 않습니다. 아래는 studio/src/main.ts에서 발췌한 부분이며, 인물 렌더링의 나머지 코드는 ZIP에 있습니다.
const walk=gait({kind:'walk'});
// figure().draw(t, P) 내부 발췌
const moving=mode==='walk';const phase=moving?t/walk.period:0;
pos=moving?(((startX+direction*walk.speed*scale*t+160)%1460)+1460)%1460-160:startX;
pose=walk.pose(phase,moving?1:0);const b=pose.bob;
place(g,pos,floor,direction,scale);coat.setAttribute('fill',nightTint(colour,P));
pose.feet.forEach((foot,i)=>{legs[i].draw([pose.hip,foot.knee,foot.ankle]);shoe(shoes[i],foot.ankle,foot.pitch);});g.insertBefore(legs[pose.front].g,coat);g.insertBefore(shoes[pose.front],coat);클릭과 상태 전환
커피 추출, 고양이 깨우기, 서버 신호는 각각 시작 시간을 저장합니다. 프레임을 그릴 때 현재 시간과의 차이를 계산해 진행률을 정하고, 마지막에는 대기 상태로 돌아갑니다. 클릭할 때마다 SVG를 새로 생성하는 방식은 피했습니다.
영상 캡처용 API는 다음과 같습니다. 일반 데모는 자동으로 움직이고, ?debug&capture에서는 시간과 반응을 직접 제어합니다.
window.__studio.seek(3);
window.__studio.trigger('coffee-machine');
window.__studio.trigger('cat');
window.__studio.seek(3.7);
window.__studio.setTau(0.88); // 밤
window.__studio.state(); // 커피·고양이·서버 등의 현재 상태
window.__studio.targets(); // 조작 가능한 대상 목록trigger()는 현재 시각을 시작점으로 삼습니다. 새 반응을 주기 전에 seek()로 시각을 정하고, 프레임을 시간순으로 진행해야 반응을 일관되게 녹화할 수 있습니다.
4. 영상으로 출력하기
소스 ZIP에 포함한 출력 스크립트는 브라우저를 열어 클릭과 낮밤 전환을 재생하고, 각 프레임을 FFmpeg로 합칩니다. FFmpeg를 PATH에 준비한 뒤 실행하세요.
npx playwright install chromium
npm run export:video출력은 out/studio-preview-muted.mp4입니다. 16초, 1200×820, 30fps, 무음이며 타입 검사·빌드와 별도로 실제 출력 후 디코딩까지 확인했습니다. 설치된 Chrome을 사용하려면 CHROME 환경 변수에 실행 파일 경로를 지정할 수 있습니다. 출력 스크립트가 자체 Vite 서버를 시작하고 종료하므로 별도의 서버 터미널은 필요하지 않습니다.
릴스는 이 장면을 1080×1920 안에 배치하고 커피 바·리뷰 보드·서버실을 순서대로 확대했습니다. 내레이션은 기존 Sohee 설명 옵션으로 생성한 뒤 음높이를 유지하며 1.15배로 처리했습니다. 16초 무음 예제와 음성이 있는 릴스는 별도의 출력물입니다.
다른 길이나 세로 화면으로 바꿀 때 사용할 프롬프트도 제공합니다.
개발자 스튜디오 웹 데모를 실제 브라우저에서 실행해 세로 MP4 시연 영상으로 만들어 줘.
프로젝트를 빌드한 뒤 로컬 서버에서 열고, debug 모드의 window.__studio API로 매 프레임 시간을 제어해 줘. seek(t), setTau(tau), trigger(id)를 사용해 줘. 입력 API가 다르면 먼저 실제 코드에서 확인해 줘.
16초 무음 시연 순서:
- 0~2.5초: 낮의 건물 전체, 인물과 자전거의 움직임.
- 2.5~5.5초: 커피 바와 고양이 확대. coffee-machine과 cat을 클릭.
- 5.5~8.5초: review-board를 클릭하고 리뷰 보드를 확대.
- 8.5~12초: 서버실 확대. 빌드 → 전송 → 준비를 보여 줘. 실제 서버 배포가 아닌 연출임을 표시.
- 12~16초: 건물 전체로 돌아오며 setTau(.5)에서 setTau(.88)로 부드럽게 전환.
1080×1920, 30fps, H.264, yuv420p로 출력해 줘. 종이 배경에 화면을 배치하고 확대 이동을 부드럽게 해 줘. 제목과 설명은 인스타 오른쪽 버튼, 아래 캡션 영역과 겹치지 않게 해 줘. MP4에는 클릭 기능이 남는 게 아니라 클릭 반응을 녹화한다는 점을 밝혀 줘.
색 공간과 범위를 명시해 프레임 색이 뜨지 않게 하고, FFmpeg로 처음부터 끝까지 디코딩 오류를 확인해 줘. 원본 웹 데모와 소스도 그대로 제공해 줘. 음성과 음악은 이번 무음 시연에 추가하지 마.실제로 걸린 문제와 해결
| 관찰한 문제 | 적용한 수정과 확인 |
|---|---|
| 간단한 책상만으로는 활용 범위가 잘 안 보임 | 2층 작업실·커피 바·서버실과 여러 인물로 확장 |
| 전체 화면에서는 커피와 고양이 동작이 너무 작음 | 세로 영상에서 해당 구역을 확대하고 다시 전체 화면으로 복귀 |
| 첫 음성과 속도가 기존 영상과 다름 | 기존 Sohee 설명 지시문 복원, 문장 재생성, 발음하기 쉬운 문구 사용, 1.15배 처리 |
| 영상의 밝기와 색 범위가 달라질 수 있음 | 프레임의 full range를 BT.709 limited range로 명시 변환 |
| 브라우저만 되면 소스 ZIP도 된다고 착각하기 쉬움 | ZIP을 별도 폴더에 풀어 설치·타입 검사·빌드·클릭 반응 확인 |
앞선 책상 실험에서는 창문이 배경을 가리는 문제와 가는 선 사이의 클릭 누락도 고쳤습니다. 이번 스튜디오에는 충분한 클릭 영역과 키보드 조작을 처음부터 넣었습니다.
검증과 한계
원본과 스튜디오의 타입 검사·빌드를 통과했고, 스튜디오에서는 클릭과 키보드 입력, 반응 후 복귀, 서버 연출의 단계 전환, 낮밤 중간 팔레트, 모바일 가로 넘침을 검사했습니다. 릴스는 자막 배치와 전체 디코딩을 확인했습니다. 기계 받아쓰기는 발음 확인의 보조 수단이며 사람의 최종 청취를 대신하지 않습니다.
한계도 있습니다. 작은 사람의 표정과 서버 표시를 휴대폰에서 한꺼번에 읽기는 어렵습니다. 그래서 전체 장면과 확대 화면을 나눴습니다. 코딩 에이전트나 실행 환경이 달라지면 프롬프트 결과도 달라집니다. 이 장면은 게임이나 실제 배포 도구가 아니라 동작을 보여 주는 SVG 데모입니다.
자료 모음
캐러셀 「움직이는 스튜디오 만들기」에는 설치부터 출력까지의 순서를 8장으로 요약했습니다. 이 글에는 그 순서를 실제로 따라갈 수 있는 코드와 프롬프트를 모았습니다.
