플랫 컬러 애니메이션
하나의 드로잉이 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가 이를 처리하므로 다시 실행하세요 |
한계
이 방식은 복잡한 격투, 긴 연속 액션 또는 사실적인 회화 스타일에 적합하지 않습니다.