美西螈(ウーパールーパー)ステッカー
すべて純粋Python(numpy + Pillow)とffmpegで動作。GPUやBlenderは不要です。リポジトリルートには engine/、kit/、out/ ディレクトリが含まれます。
pip install numpy pillow # ffmpeg は PATH に含める必要があります
python engine/build.py 301 --force # 指定IDを1つレンダリング
python engine/build.py 12,40-45 --force # 複数IDをレンダリング
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 の該当セクション末尾に、1行につき1ステッカーを追加します(既存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')
フレーズに合わせたモーションを選び、次に表情、0~2個のエフェクト、最大1個の小道具/帽子を選びます。テキストは2~5文字に抑えます(6文字以上は2行に折り返され小さくなります)。/ で強制的に改行できます。
- モーション (
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=を読み取ります) - 表情 (
FACESin 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 — または辞書{'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が色味を変えた場合、エクスポーターは自動的にフルフレームパレットで再試行します)
- ファイルサイズが1000KB以下であること(エクスポーターは自動的に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)からそれらのテクスチャをコピーしてください。これらはコミットされません。