Communitygithub.com

dula-flat-cel

플랫 컬러 라인 아트 애니메이션 단편을 제작하는 스킬입니다. 이야기, 캐릭터 디자인, 드로잉, 입 모양 변형에서 음성이 포함된 완성된 비디오까지, 이미지 모델과 스크립트만으로 제작합니다. Python과 ffmpeg만 있으면 됩니다. 애니메이션 단편, TV 만화 스타일, 제한된 애니메이션, 대화 영화, 샷 간 캐릭터 일관성 유지, 입 모양 싱크 불일치 및 깜빡이는 드로잉 교체 수정에 사용합니다.

dula-flat-cel란 무엇인가요?

이 스킬은 이미지 생성 모델을 활용하여 TV 만화 스타일의 플랫 컬러 애니메이션을 제작하는 전문 워크플로우를 제공합니다. 기존의 복잡한 3D 모델링이나 비디오 생성 모델 없이, 하나의 드로잉을 3~4프레임 동안 유지하고 드로잉과 입 모양을 교체하는 방식으로 애니메이션을 구현합니다. Python 스크립트와 ffmpeg만 있으면 누구나 쉽게 사용할 수 있으며, Claude Code, Codex, Cursor 등 다양한 AI 에이전트 플랫폼에서 실행 가능합니다. 워크플로우는 이야기 및 샷 구성, 캐릭터 디자인, 배경 및 드로잉 생성, 입 모양과 깜빡임 변형, 음성 동기화, 테스트, 최종 렌더링 및 검수 단계로 구성됩니다. 특히 캐릭터 디자인 단계를 가장 중요하게 여기며, 모든 드로잉의 일관성을 유지하기 위해 참조 이미지를 활용하고, prep_cels.py를 통해 색상을 평탄화하고 변형을 기본 이미지에 고정합니다. 최종적으로 build_film.py로 전체 영화를 조립하고 check_mouths.py로 입 모음 오류를 검사하며, 사람의 눈과 귀로 직접 검수하는 것을 강조합니다.

지원 대상✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/orange9angel/dula-craft/tree/HEAD/skills/dula-flat-cel

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

플랫 컬러 애니메이션

하나의 드로잉이 3~4프레임 동안 유지되며, 드로잉과 입 모양을 교체하여 움직임을 만듭니다. 간단한 TV 만화 스타일의 디자인에 적합하며, 이미지 모델의 일관성을 가장 잘 유지할 수 있는 방식입니다. 3D 모델이나 비디오 모델이 필요하지 않습니다.

스크립트는 이 스킬의 scripts/ 폴더에 있으며, 경로는 이 SKILL.md 파일을 기준으로 합니다. 아래에서 $S는 그 폴더를 의미합니다. new_project.py를 제외하고는 영화 폴더에서 실행하세요. 환경 문제가 발생하면 dula-start를 사용하세요.

상대방의 언어로 대화하세요.

워크플로우

python $S/new_project.py my_film && cd my_film

1. 이야기와 샷

story.md를 작성한 다음 config/film.json을 작성하세요 (film.json 참조 파일 참조). 첫 번째 영화는 2030초로 유지하고, 한 마디 대사는 약 23초가 걸리므로 15초면 3~5마디 대사를 담을 수 있습니다. 원작 캐릭터만 사용하세요.

모든 대사에 대해 누가 말하는지, 누구에게 말하는지, 카메라가 누구를 보여주는지 생각하세요. 농담은 관객이 이해하지 못할 단어에 의존해서는 안 됩니다. 원인과 결과도 드로잉으로 보여줘야 합니다 (달려 들어온다 → 잡는다 → 물체가 날아간다). 컷으로 건너뛰지 마세요.

2. 캐릭터 디자인 (가장 중요한 단계)

각 캐릭터를 config/anchors.tsv에 배치하세요 (이름<TAB>외형), 그런 다음 실행하세요:

python $S/paint.py anchors config/anchors.tsv

직접 모든 이미지를 열어보세요. 일부 뷰어는 투명 영역을 검은색 바탕에 색상이 빛나는 것으로 표시하여 실패한 컷아웃처럼 보일 수 있습니다. 의심스러우면 3단계의 build/check_alpha.png를 확인하세요. 그런 다음 진행하기 전에 디자인을 상대방에게 보여주고 승인을 받으세요. 이후의 모든 드로잉은 이 디자인을 따르므로, 여기서 실수하면 수정 비용이 가장 많이 듭니다. "머리는 전체 높이의 1/3, 둥근 얼굴, 작은 검은 구슬 눈, 빨간 샤쓰"와 같은 단어로 비율을 수정하세요.

3. 배경과 드로잉

config/plates.tsv (이름<TAB>설명)와 config/cels.tsv (드로잉<TAB>캐릭터<TAB>포즈)를 작성하세요. 드로잉 이름은 캐릭터 이름으로 시작하세요, 예: hero_run_a.

python $S/paint.py plates config/plates.tsv
python $S/paint.py cels config/cels.tsv
python $S/prep_cels.py --bases-only    # 입을 그리기 전에 build/check_alpha.png에서 컷아웃 확인

이미지는 각각 1~3분이 소요되며, paint.py는 진행 상황을 보고합니다. 도구가 긴 명령을 중단하는 경우 백그라운드에서 실행하세요. 다시 실행하면 완료된 이미지는 건너뜁니다. 하나를 다시 그리려면 --only <이름> --force를 사용하세요.

드로잉과 장소의 연속성을 유지하려면 따라야 할 대상을 명명하는 추가 열을 하나 더 추가하세요:

hero_run_a	hero	오른쪽으로 달리기, 왼발이 앞으로.
hero_run_b	hero	오른쪽으로 달리기, 오른발이 앞으로.	hero_run_a
meadow	회색 비구름 아래의 초원.
meadow_sun	비가 그치고 햇살이 비치다.	meadow

규칙:

  • 이미지당 하나의 캐릭터를 그리세요. 캐릭터 디자인은 항상 첫 번째 참조입니다. 거부된 이미지를 참조로 사용하지 마세요.
  • 먼저 캐릭터가 바라보는 방향을 결정하세요. 한 번에 하나씩 생성된 이미지는 각각 방향을 선택하므로, 대화 중인 두 사람이 쉽게 등지게 됩니다. 미리 지정하고, 실수를 수정하려면 flip을 사용하세요.
  • 액션 사이클의 각 드로잉은 이전 드로잉을 따르므로(위의 추가 열), 방향, 크기 및 형태가 유지됩니다. 이렇게 하지 않으면 사이클이 튀는 현상이 발생합니다.
  • 시간대 변경의 경우 원본 플레이트를 참조하여 배경을 다시 그리세요. 색상을 곱한다고 푸른 하늘을 숨길 수는 없습니다.
  • 모든 샷에서 캐릭터의 비율을 확인하세요. "목을 위로 쭉 뻗은"과 같은 포즈 설명이 다른 신체로 이어질 수 있습니다.

4. 입 모양과 깜빡임

말하는 모든 드로잉은 동일한 이미지의 로컬 편집이 필요합니다. config/variants.tsv에서:

hero_stand_m1	hero_stand	입만 반쯤 열린 작은 타원형으로 변경.
hero_stand_m2	hero_stand	입만 크게 벌린 상태로 변경.
hero_stand_blink	hero_stand	두 눈을 간단한 곡선으로 감음. 다른 것은 변경하지 않음.

이름: <기본>_m1은 반쯤 열림, <기본>_m2는 크게 벌림입니다. _m1만 있으면 입은 열림과 닫힘 두 가지 상태를 가지며, 이것만으로도 작동합니다. 기본 드로잉 자체는 입이 닫혀 있어야 합니다. 입이 열린 상태로 그려진 경우, 닫힌 변형을 만들고 film.json에서 talk로 세 가지 상태를 모두 설정하세요.

말하는 캐릭터의 모든 드로잉은 걷기 사이클의 각 드로잉을 포함하여 자체 입 모양이 필요합니다.

python $S/paint.py variants config/variants.tsv
python $S/prep_cels.py

prep_cels.py는 드로잉을 실제 평면 색상으로 압축하고 각 변형을 기본 이미지에 고정합니다. 그런 다음 build/check_alpha.png를 열고 마젠타색 위의 컷아웃을 확인하세요. 배경이 남아 있거나, 조각이 누락되었거나, 눈이 지워진 이미지는 다시 그리세요. 변경된 영역이 크다는 경고가 표시되면 모델이 몸체를 편집한 것입니다. variants.tsv의 4열에 창 x,y,w,h를 추가하세요.

색상이 변하고 있나요? 캐릭터 디자인에서 샘플링한 색상을 사용하여 config/palette.json ({"skin": [250, 220, 190]})을 추가할 수 있습니다. 가까운 색상만 여기에 스냅되며, prep_cels.py는 변경 후 다시 적용합니다.

5. 사운드

다음 중 하나를 선택하세요:

  • dula-voice를 사용하여 상대방의 자체 키로 음성을 생성합니다.
  • 기존 오디오 사용: audio/voice/<line id>.wav에 배치하거나 라인에 file을 설정합니다. mp3와 wav 모두 작동합니다.
  • 무음 초안 만들기: 라인에 seconds 값을 지정합니다.

입 모양은 이 오디오를 기반으로 계산되므로, 테스트를 만들기 전에 음성을 확정하세요.

선택 사항: ambience, bgm, sfx 및 songs. 상대방이 권리를 가지고 있는 자료만 사용하세요. 이 프로젝트는 음악을 생성하지 않습니다. 라이선스가 있는 음악이 없으면 악보는 생략하고 앰비언스와 음향 효과가 영화를 이끌도록 하세요.

6. 테스트

python $S/build_film.py
python $S/render.py --stills 1,3,5,8,12
python $S/render.py --range 0,20 -o output/pilot.mp4

build_film.py는 보이는 캐릭터가 말하지만 입을 움직일 수 없을 때 오류와 함께 중지되며, 이는 놓치기 쉬운 실수입니다. 테스트를 보여주기 전에 모든 스틸을 살펴보세요. 영화 전체가 완성될 때까지 기다렸다가 누군가에게 보여주지 마세요.

캐릭터를 바닥에 배치: ground를 추측하고 스틸을 렌더링한 다음 조정하세요. 계산하는 것보다 빠릅니다.

샷을 정지 상태로 두지 마세요. 비트가 의도적으로 정지된 것이 아니라면 각 샷에 움직이는 요소 하나를 추가하세요: 플레이트의 팬, bob 또는 shake, 드로잉 변경, 또는 비와 같은 오버레이. 마지막 샷은 fade_out으로 영화를 끝내세요.

7. 전체 영화 및 최종 확인

python $S/render.py
python $S/check_mouths.py

인계하기 전에 다음 각 항목을 확인하고, 확인할 수 없는 경우 명확히 말하세요:

  • 모든 샷의 실제 프레임을 확인했습니다
  • check_mouths.py가 멈춘 입을 보고하지 않음
  • 각 캐릭터가 샷 전체에서 여전히 동일한 사람처럼 보임 (얼굴과 비율이 색상보다 중요)
  • 대화 중인 사람들이 서로를 바라보고 있음
  • 화면을 가로질러 움직이는 단일 드로잉에 bob 또는 더 많은 드로잉이 있거나, 그렇지 않으면 미끄러지는 것으로 읽힘
  • 직접 들어봄. 들을 수 없는 경우 오디오가 귀로 확인되지 않았다고 말하세요

완전한 예시

이 저장소의 examples/rainy-slide에는 완성된 15초 영화의 프롬프트와 샷 목록이 있으며, docs/tutorial.md에 설명되어 있습니다. 이 파일에서 ../../examples/rainy-slide 및 ../../docs/tutorial.md에서 찾을 수 있습니다. 누군가 예시를 요청하면 이를 모델로 사용하세요.

페이싱

경험 법칙: 샷은 평균 35초, 캐릭터는 각 드로잉을 34프레임 동안 유지(초당 약 7개의 드로잉), 빈번한 클로즈업과 과장된 표정. hold는 드로잉당 프레임 수입니다.

일반적인 문제

증상원인 및 해결 방법
입이 바뀔 때 몸통 색상이 깜빡임변형이 prep_cels.py를 거치지 않음
걷기나 달리기가 키가 크게 또는 짧게 펄럭임드로잉 크기를 개별적으로 조정하지 마세요. 하나의 액터는 자동으로 하나의 배율을 공유합니다. align_head도 추가하세요
소품이 잘못된 색상을 띰팔레트 항목이 너무 가깝습니다. 제거하거나 SNAP을 낮추세요
말하는 동안 입이 열린 채로 있음두 상태 입은 0.5 임계값을 사용합니다. 오디오가 뭉개졌는지 확인하세요
조용한 단어가 닫힌 채로 있음한 번 큰 소리로 말하는 단어가 해당 라인의 스케일을 설정합니다. _m2를 추가하거나 라인의 mouth_open_at을 낮추세요
비나 바람 소리가 들리지 않음앰비언스는 기본적으로 작습니다. level_db를 지정하세요, 예: -35
지속적인 쉿 소리앰비언스 클립이 단순히 노이즈입니다. 교체하세요. 게인이 제한되어 있으므로 더 이상 증폭되지 않습니다
Codex가 참조 이미지가 손실되었다고 말함이미지 생성이 첫 번째 동작이어야 합니다. paint.py가 이를 처리하므로 다시 실행하세요

한계

이 방식은 복잡한 격투, 긴 연속 액션 또는 사실적인 회화 스타일에 적합하지 않습니다.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

관련 스킬