Communitygithub.com

MBehtemam/montagent-skills

Montagentにおけるカットアウトキャラクターアニメーション:パーツのリグから作られたマスコットやパペット、ポーズやジェスチャー、Visemesによるボイスラインへのリップシンク、まばたき。動いたり話したりするキャラクターが登場するMontagent動画で使用します。

montagent-skills とは?

このスキルは、Montagentでパーツのリグ(体、頭、2つに分かれた腕、顔のオーバーレイなど)から構築されたカットアウトキャラクターをアニメーション化するためのものです。キャラクターがポーズをとったり、ジェスチャーをしたり、話したり、まばたきしたりできるようにします。このスキルは、Montagentのループのビルドステップに組み込まれ、リグのベイク処理(各パーツの画面上の位置と回転を計算)、リップシンク(visemeファイルからの口の形状のマッピング)、まばたきのタイミング、登場やジェスチャーのアニメーションなどの機能を提供します。Montagentのベイクスクリプト(`bake_rig.py`)を活用し、親子関係や画像の動的変更がない環境を回避します。このスキルは、特に動いて話すキャラクターがいるショート動画の作成に役立ち、ユーザーに明確なレシピとチェック手順を提供します。対応プラットフォームは主にMontagentですが、`montagent-craft`などのツールとの連携も含まれます。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/MBehtemam/montagent-skills/tree/HEAD/skills/montagent-character

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

カットアウトキャラクターのアニメーション化

パーツのリグ(体、頭、2つに分かれた腕、顔のオーバーレイ(口の形状とまばたき)は頭のキャンバス上に描画)から構築されたキャラクターのレシピ。これらはmontagentのループのビルドステップに組み込まれます。まだロードしていなければ、先にmontagentをロードしてください。キャラクターがセリフを話すショート動画の場合は、計画を立てる前にキャラクターショート構造を開いてください。

リグが提供しなければならないもの

何よりも先にリグの説明を読んでください。必要なものは、すべてのパーツについて:その画像、サイズ、ピボット(パーツが回転する関節点で、元の描画上の点)、親、およびパーツが背面から前面に描画される順序です。また、音声のviseme IDから口の形状へのマッピングテーブルも必要です。各パーツの画像は、そのピボットがキャンバスの正確な中心になるようにパディングされていなければなりません。顔のオーバーレイは、頭のキャンバスとピボットを共有します。

提供された資料がパーツやピボットのない単一の描画のみである場合、ブラインドでリグをカットすることはできません。ユーザーにその旨を伝え、事前にカットされたリグを依頼してください。

リグをベイクする

Montagentには親子関係がなく、要素はその画像を変更できません。そのため、キャラクターはベイクされます。バンドルされたスクリプトが、描画されたすべてのフレームで各パーツの画面上の位置と回転をその親から計算し、各口の形状とまばたきを独自の要素として書き出し、それぞれのスパンで頭のトランスフォームで表示します。自分でこれを書かないでください。

python3 scripts/bake_rig.py <project> <rig> <spec> は、パーツごとに1つのトラックが追加されたプロジェクトを出力します。--helpを付けて実行すると、スペックの詳細が表示されます:キャラクターが立つ場所、名前付きポーズ、それらの間の動き、スイング、ホップ、音声とそのvisemeファイル、まばたき。スペックを変更するたびに再度実行してください。このスクリプトは、自身が書き込んだトラックのみを置き換えます。スペックはプロジェクトの隣に保管してください。それがキャラクターの本当のソースです。

そのレポートを読んでください。 マージされたすべての口のスパン、すべての描画フレームにおける子とその親の間の最大のギャップ、そして注目すべき瞬間(各動きの到着点と各関節の最大角度)がリストされています。位置は整数ピクセルなので、約1.5 pxまでのギャップは丸め誤差であり、丸い関節によって隠されます。それより大きいギャップは、リグのピボットが間違っていることを意味します。

validateは、キャラクターがホールドする各ポーズにR-EASE-INERTを報告し、口とまばたきのトラックのスパン間にN-TRACK-GAPを報告します。どちらも予想されるものです(findingsガイドを参照)。

ベイク結果は次のようになります:各パーツはそのピボットを中心とし、移動する場所にのみキーフレームが設定され、各口またはまばたき要素はそのスパンにわたって頭のトランスフォームをコピーします。

{
  "frame": {"width": 640, "height": 360}, "fps": 30, "background": "#2E3440", "duration": 2000, "output": "out/baked.mp4",
  "tracks": [
    {"name": "set", "layer": 0, "elements": [
      {"id": "set", "type": "image", "start": 0, "end": 2000, "source": "media/still.png", "x": 0, "y": 0, "origin": "top-left", "width": 640, "height": 360, "fit": "literal"}
    ]},
    {"name": "puppet-torso", "layer": 10, "elements": [
      {"id": "puppet-torso", "type": "image", "start": 0, "end": 2000, "source": "rig/parts/torso.png", "x": 320, "y": 330, "origin": "center", "fit": "literal", "width": 80, "height": 280}
    ]},
    {"name": "puppet-head", "layer": 12, "elements": [
      {"id": "puppet-head", "type": "image", "start": 0, "end": 2000, "source": "rig/parts/head.png", "x": 320, "y": 190, "origin": "center", "fit": "literal", "width": 90, "height": 160, "rotation": [{"t": 0, "v": 0}, {"t": 500, "v": 6.0, "ease": "linear"}, {"t": 1000, "v": 0.0, "ease": "linear"}]}
    ]},
    {"name": "puppet-mouth", "layer": 13, "elements": [
      {"id": "puppet-mouth-0", "type": "image", "start": 400, "end": 700, "source": "rig/parts/mouth_open.png", "x": 320, "y": 190, "origin": "center", "fit": "literal", "width": 24, "height": 60, "rotation": [{"t": 400, "v": 4.8}, {"t": 500, "v": 6.0, "ease": "linear"}, {"t": 666, "v": 4.0, "ease": "linear"}]}
    ]}
  ]
}

レシピ

すべてのレシピは、答えではなく開始範囲を示します。各レシピはルックステップで終わります:montagent-craftをロードし、次に進む前に手順に従って確認してください。

角度は、描画されたレストポーズからの度数で、それぞれ親に対して相対的であり、画面上で時計回りを正とします。したがって、視聴者の右側の腕は負の角度で上がり、左側の腕は正の角度で上がります。

セットに立たせる

  • 背景: フルフレームのセット画像。originをtop-leftに設定し、フレームサイズで最下層の0, 0に配置します。originを明示的に設定してください。
  • 足を床につける: リグのルート(足でピボットするボディ)は、床が壁の影のラインと交わる場所、またはその少し前に配置します。高さ1080のセットでは、床の上端は通常、下から80〜85%の位置にあるため、足はそのさらに5〜10%下に配置します。
  • サイズ: キャラクターはフレーム高さの55〜75%で、スペックのスケール(フレームpx / 描画px)で設定します。パディングされた描画ではなく、目に見えるキャラクターを測定してください。描画の高さ×スケールは過大評価になります。
  • 配置: 単独で立つ場合を除き、プロップやカードとは反対側の、フレームの3分の1の位置にオフセンターに配置します。
  • 確認: 静止した瞬間のframeで、足が床にしっかりとついており、浮いたり沈み込んだりしていないこと、頭がフレームの上端から少なくとも5%以上離れていることを確認します。

登場:ホップイン

  • ホップ: 2〜3回、それぞれ300〜450 ms、徐々に低くなります:最初はキャラクターの高さの8〜12%、最後は4〜6%。水平移動は同じスパンをease-outでカバーし、最後のホップは優しく着地します。
  • ポーズ: ホップ中は腕を下ろします。描画フレームに着地し、最初のジェスチャーの前に150〜300 msホールドします。
  • タイミング: 音声が始まる前に、少なくとも200 msの余裕を持って終了します。
  • 確認: 登場部分でframe --from --to --keyframesを実行します。各着地のコマで足が床に触れていること、および体より遅れたり先に動いたりするパーツがないことを確認します。

ジェスチャー

ジェスチャーは名前付きのポーズであり、そのポーズへの出入りの動きです。各動きにリードイン時間(スペックのin)を設定して、ポーズが出発するまで保持されるようにします。

  • 腕を下ろす: 腕を広げたレストポーズから、各上腕を体に向かって40〜55°回転させ、前腕をさらに5〜15°回転させます。
  • 手を振る: 上腕をレスト状態から横に40〜50°上げ、前腕をさらに25〜35°上げます。前腕を肘から15〜20°ずつ、周期350〜450 msで少なくとも2回の完全なスイング(800 ms以上)振ります。高く上げすぎると、スイングの内側の極限で手が頭の後ろに隠れます。頭は腕の上に描画されます。
  • 何かを指さす: 上腕を対象に向かってほぼ水平にします(腕を前に出して下げた状態から10〜25°上)。前腕は真っ直ぐから20°以内にし、手が対象の近い端を指すようにします。それを指す単語の1〜3フレーム前に到着します。
  • 応援: 両方の上腕を40〜50°上げ、前腕をさらに20〜30°上げます。さらに曲げると、オーバーシュートのピークで手が頭の後ろに隠れます。
  • 動き: 250〜400 msでインします。オーバーシュートベジェ[0.34, 1.56, 0.64, 1]で到着し、ease-in-outでレストに戻ります。フォロースルーのため、上腕の到着から2〜4フレーム後に、前腕のみを指定する2番目の動きを追加します。
  • 決して静止しない: 強調された単語で頭を2〜5°傾けます。短いスイングまたは250〜400 msの往復動きにします。何も動かずに1.5秒以上ポーズをホールドするキャラクターは、静止画のように見えます。
  • 確認: 各ジェスチャーについて、ベイクレポートでその関節の極限としてリストされた瞬間にframe --atを実行します。手が頭やフレーム端に干渉していないこと、音声がなくてもポーズが意図したジェスチャーとして読み取れることを確認します。次に、最も上げたポーズの肩と肘でframe --cropを実行し、実際のスケールでギャップや緩んだパーツがないか確認します。

Visemesからのリップシンク

ベイクは、音声のvisemeファイルから口を書き込みます。各viseme IDは、リグのテーブルを通じて口にマッピングされ、無音時はくちばしや唇が静止した状態(オーバーレイなし)です。スペックで音声要素とvisemeファイルを指定してください。口はその要素の開始位置とソース範囲に従うため、音声を移動して再度ベイクすると同期が保たれます。

  • 最短の形状: 2フレーム。ベイクはそれより短いものを前の形状にマージし、各マージを報告します。6秒のセリフで12個のマージは正常です。
  • リード: 0 ms。レンダリングを見たときに口が遅れていると感じた場合、1フレーム(30 fpsで33 ms)リードさせてください。それ以上はやらないでください。
  • タイミング: 音声ファイルをプローブします。その長さがvisemeファイルの指定された持続時間と一致しない場合は、プローブを信頼します。
  • 確認: 話された3つの単語の真ん中でquery --atを実行し、各時点で1つの口要素がオンになっていることを確認します。次に、最長のポーズの真ん中とセリフ終了後にquery --atを実行し、どれもオンになっていないことを確認します。

まばたき

  • 長さ: 3フレーム(30 fpsで100 ms)、最大4フレーム。
  • リズム: 2〜4秒ごと、不規則に、決してビートに合わせないでください。大きな動きが着地した直後に1回、セリフの休止中に1回入れます。8秒ごとに少なくとも2回。
  • 避けること: ジェスチャーの到着と同じフレームでのまばたきは、到着を隠してしまうので避けてください。
  • 確認: まばたきの中間フレームでframe --atを実行し、閉じた目が頭の傾きに正確に重なっていることを確認します。

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

関連スキル