Autocollants Axolotl
Tout est en Python pur (numpy + Pillow) plus ffmpeg ; pas de GPU, pas de Blender. La racine du dépôt est le dossier qui contient engine/, kit/ et out/.
pip install numpy pillow # ffmpeg doit être dans le PATH
python engine/build.py 301 --force # rend une spécification (par id)
python engine/build.py 12,40-45 --force # plusieurs
python engine/build.py # tout ce qui n'est pas encore rendu (reprise)
python engine/sheet.py 301-310 # feuille de révision -> ref/sheet_sel_N.png (couverture + 3 images chacune)
python engine/manifest.py # rafraîchit out/stickers.json après avoir ajouté des stickers
python engine/tornado.py 我没事 # l'autocollant tornade aquatique ("-" = pas de texte) ; nécessite d'abord engine/fetch_mc.py
Sortie : out/NNN_texte.gif et la couverture out/_封面/NNN_texte.png.
Ajouter un autocollant
Une ligne par autocollant dans engine/specs.py (ajouter à la fin de la bonne section pour que les ids existants restent stables) :
S('摸鱼', 'flagwave', 'happy', [], hold='fish', s=0.7)
# texte mouvement visage fx extras
S('别催了', 'rage', 'angry', ['steam'], style='red', tmode='shake')
S('暴富', 'spin', 'money', ['coins', ('float', 'money', 3, 4)], style='gold')
Choisissez le mouvement qui illustre la phrase, puis un visage, 0 à 2 effets, et au plus un accessoire/chapeau. Gardez le texte entre 2 et 5 caractères (6+ passe sur deux lignes et devient petit). Utilisez / pour forcer un saut de ligne.
- mouvement (
engine/motions.py,engine/motions2.py, 75 au total) : 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, et les actions d'accessoire swing flagwave offer chomp drink read typing scan umbrella (elles lisenthold=). - visage (
FACESdans motions.py) : 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 — ou un dict comme{'L': 'big', 'R': 'big', 'mouth': 'o'}. - fx (
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 ; les génériques prennent un nom d'icône :('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= (accessoire voxel tenu) : 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=[…] (chapeaux/équipement facial) : party crown nightcap shades glasses band helmet halo horns phones bow chef grad flowers mask towel ice
- style= couleur du texte : pink (par défaut) blue purple red green gold gray cyan — adaptez à l'ambiance (triste en bleu, en colère en rouge, argent en gold, terminé en green, fatigué en gray, nuit en purple).
- tmode= animation du texte : stay (par défaut) wave bounce shake shiver pulse droop swing zoom spin pop type slam.
Révision avant de livrer quoi que ce soit
Rendez, puis ouvrez la feuille de révision et regardez-la. Vérifiez que :
- la couverture (première image) montre le texte complet et l'axolotl ;
- l'accessoire/effet se lit à la taille du sticker et n'est pas caché derrière la bande de texte (tout ce qui est au-dessus de la tête partage l'espace avec le texte) ;
- le fond blanc est resté blanc (l'exportateur réessaie avec une palette pleine image lorsque ffmpeg le teinte) ;
- le fichier fait ≤ 1000 Ko (l'exportateur réduit automatiquement de 64 à 24 couleurs).
Pièges
- Les mouvements qui quittent le cadre en cours de boucle (launch, sink, dash, popup, slidein, glitch) ne doivent pas utiliser de texte
pop/slam/type— la couverture attraperait l'axolotl hors écran. - Trop d'autocollants avec le même mouvement semble répétitif : gardez chaque mouvement à environ 6 utilisations dans l'ensemble (
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))"). - Les pattes avant sont petites et situées sous la tête ; les gestes de pattes seuls se lisent à peine — associez-les à un accessoire ou un effet.
- Les coordonnées des accessoires sont en pixels du modèle local à la tête : le visage est à z = -10, le sommet de la tête à y = 9, +x est la gauche du spectateur.
- L'humour qui marche avec ce public est pince-sans-rire (难绷), pas les cris exagérés.
La tornade aquatique
engine/tornado.py dessine l'entonnoir comme la même eau que la mare (un contour, même couleur, la ligne d'eau blanche monte le long des parois), fait tourner des bandes en spirale, projette des gouttes et fait tourbillonner l'axolotl en 3D avec des objets vanilla Minecraft rendus en 3D (casque en fer/tortue, seau d'axolotl, TNT). Exécutez python engine/fetch_mc.py une fois pour copier ces textures depuis votre propre client Minecraft (jar 1.21.2+) — elles ne sont jamais commitées.