아홀로틀 스티커
모든 것은 순수 Python (numpy + Pillow) + ffmpeg로 처리됩니다. GPU나 Blender는 필요 없습니다. 저장소 루트는 engine/, kit/, out/ 폴더가 있는 디렉토리입니다.
pip install numpy pillow # ffmpeg는 PATH에 있어야 함
python engine/build.py 301 --force # 특정 스페셜(id) 하나 렌더링
python engine/build.py 12,40-45 --force # 여러 개 렌더링
python engine/build.py # 아직 렌더링되지 않은 모든 것 (재개 가능)
python engine/sheet.py 301-310 # 리뷰 시트 -> ref/sheet_sel_N.png (커버 + 각 3프레임)
python engine/manifest.py # 스티커 추가 후 out/stickers.json 갱신
python engine/tornado.py 我没事 # 물 토네이도 스티커 ("-" = 텍스트 없음); engine/fetch_mc.py 먼저 실행 필요
출력: out/NNN_文字.gif 및 커버 out/_封面/NNN_文字.png
스티커 추가하기
engine/specs.py에 스티커 한 줄씩 추가 (기존 id가 변경되지 않도록 해당 섹션 끝에 추가):
S('摸鱼', 'flagwave', 'happy', [], hold='fish', s=0.7)
# 텍스트 모션 표정 fx 추가
S('别催了', 'rage', 'angry', ['steam'], style='red', tmode='shake')
S('暴富', 'spin', 'money', ['coins', ('float', 'money', 3, 4)], style='gold')
문구를 표현할 모션을 선택한 다음 표정, 효과 02개, 최대 1개의 소품/모자를 추가합니다. 텍스트는 25자로 유지하고 (6자 이상은 두 줄로 줄 바꿈되어 작아짐) /를 사용하여 강제 줄 바꿈을 합니다.
- 모션 (
engine/motions.py,engine/motions2.py, 총 75개): nod shake hop jump flip spin sink popup peek hide tremble rage tantrum dance wag bow kowtow doze flop melt dash slidein look lookup wave cheer clap belly flipover float zoom pounce approach tilt shrink puff grow drift buoy sway headbang headbob roll circle stare shy turnaway think boing wobble faint run launch stretch slosh petrify glitch squish hiccup shakeoff nuzzle rise recoil bonk, 그리고 소품 동작 swing flagwave offer chomp drink read typing scan umbrella (hold=사용). - 표정 (
motions.py의 FACES): normal smile happy joy love star shock surprise angry rage sad cry sob teary sleep sleepy tired meh dead dizzy smug wink focus struggle blep drool money awkward side cool eat shy tiny up grin catface blank pout sparkle determined worried xd — 또는 딕셔너리 형태{'L': 'big', 'R': 'big', 'mouth': 'o'}. - 효과 (
engine/fx.py): hearts question exclaim shock anger sweat panic zzz notes tears stream rain bulb confetti fireworks stars steam gloom sparkles speed fire sun moon blush coins snow leaves check cross boom bubbles ghost dots loading bolt flash thumb plus1 flowers swirl skull twinkle brokenheart; 일반 효과는 아이콘 이름을 사용:('float', 'diamond', n, size),('pop', 'pin', size, (dx, dy)),('stay', 'clock', size, (dx, dy)),('say', 'mail'),('orbit', 'star', n, (rx, ry), size),('fall', 'flower', n, size). - hold= (들고 있는 복셀 소품): pickaxe sword wrench flag fish rod heart diamond emerald cookie apple melon carrot potion bulb book cup boba phone laptop gift cake tnt grass brick bowl popcorn torch rtorch magnifier mail key trophy controller bucket umbrella …
- wear=[...] (모자/얼굴 장비): party crown nightcap shades glasses band helmet halo horns phones bow chef grad flowers mask towel ice
- style= 텍스트 색상: pink (기본값) blue purple red green gold gray cyan — 분위기에 맞게 선택 (슬프면 파랑, 화나면 빨강, 돈이면 금색, 완료면 초록, 피곤하면 회색, 밤이면 보라).
- tmode= 텍스트 애니메이션: stay (기본값) wave bounce shake shiver pulse droop swing zoom spin pop type slam
건네주기 전에 검토하기
렌더링한 후 리뷰 시트를 열어 실제로 확인하세요. 다음을 체크합니다:
- 커버(첫 프레임)에 전체 텍스트 와 아홀로틀이 모두 보이는지;
- 소품/효과가 스티커 크기에서 읽을 수 있고 텍스트 밴드에 가려지지 않는지 (머리 위의 모든 것은 텍스트와 공간을 공유함);
- 흰 배경이 흰색으로 유지되었는지 (ffmpeg가 색조를 바꾸면 익스포터가 전체 프레임 팔레트로 재시도);
- 파일 크기가 ≤ 1000 KB인지 (익스포터가 64 → 24 색상으로 자동 축소).
주의사항
- 루프 중간에 프레임을 벗어나는 모션(launch, sink, dash, popup, slidein, glitch)은
pop/slam/type텍스트와 함께 사용하지 마세요 — 커버에서 아홀로틀이 화면 밖에 있을 수 있습니다. - 한 모션에 너무 많은 스티커는 반복적으로 느껴집니다: 각 모션은 세트 내에서 약 6회 사용으로 제한 (
python -c "import sys; sys.path.insert(0,'engine'); import specs, collections; print(collections.Counter(s['motion'] for s in specs.all_specs()).most_common(10))"). - 앞다리는 작고 머리 아래에 있습니다; 다리만으로 하는 동작은 거의 읽히지 않으므로 소품이나 효과와 함께 사용하세요.
- 소품 좌표는 머리 로컬 모델 픽셀입니다: 얼굴은 z = -10, 머리 상단은 y = 9, +x는 보는 사람의 왼쪽입니다.
- 이 사용자층에 맞는 유머는 데드팬(难绷)이며 과장된 비명이 아닙니다.
물 토네이도
engine/tornado.py는 연못과 같은 수면(하나의 윤곽선, 같은 색상, 흰 물줄기가 벽을 타고 올라감)으로 깔때기를 그리고, 나선형 띠를 회전시키며, 물방울을 튀기고 아홀로틀을 3D로 회전시키면서 바닐라 Minecraft 아이템(철/거북이 헬멧, 아홀로틀 양동이, TNT)도 함께 3D로 만듭니다. python engine/fetch_mc.py를 한 번 실행하여 자신의 Minecraft 클라이언트(1.21.2+ jar)에서 텍스처를 복사하세요 — 이 텍스처는 커밋되지 않습니다.