scenario-maya-deformation について
キャラクターTD向けのMaya変形スキルで、スキンウェイト、変形テスト、補正変形、引き渡しを扱います。再生成可能なウェイトデータと、複数ポーズの数値・視覚レビューを組み合わせます。
主な機能
- 01領域別のスキンウェイト設定
- 02ウェイトマスク、ミラー、転送
- 03可動域全体の変形テスト
- 04補正変形のワークフロー
- 05ウェイト監査とJSON出力
活用シーン
- 01キャラクターのスキンウェイト作成と調整
- 02極端なポーズでの変形不良の特定
- 03深い曲げに対する補正形状の作成
- 04スキンウェイトの引き渡し準備
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-maya-deformationインストール後、Claude Code で/scenario-maya-deformationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/critique.mdexpert-notes.mdgui-paths.mdprocedures.mdsources.mdscripts/mx_skin.py詳細
Maya 変形(キャラクター TD)
高度な変形は、最初のウェイトを設定する前に決まります。ジョイントのピボットとエッジループが、スキニングで可能なことを左右します。次に、領域ごとにウェイトを設定し、数値とレンダーを使って極端なポーズで動きを評価し、すべての不具合を発生源で修正します。基本方針は、剛体の状態でブロックアウトし、問題を診断し、スムーズにして形を整え、ウェイトでは修正できない部分を補正し、すべてをデータから再生成できるように保つことです。ここで名前が挙がっている関連スキルが利用可能なスキルにない場合は、ユーザーにインストールを依頼してください
(npx skills add scenario-labs/skills --skill <name>)。無人で実行する場合は、ツールのスキーマをもとに進め、不足している点を明記してください。
必須の背景知識: scenario-maya-expert(実行チャネル、レビューループ、2027年のバージョン関連の落とし穴)。
モジュール scripts/mx_skin.py:ウェイトの入出力、領域のブロックアウト、マスク、ミラー、転送、ROMジェネレーター、変形メトリクス、補正、Skin Tools ラッパー。ステータス
(2026-09-24):純粋な Python 部分はオフラインで実行済みです(test_mx_skin_offline.py、すべて合格)。Maya の呼び出しはすべてまだ Maya で実行されていません(テスト:tests/code/maya-deformation/run_all.sh、mx_run.py 経由)。
import sys; sys.path.insert(0, "<skills>/scenario-maya-deformation/scripts"); import mx_skin as S
基本方針(専門家から得られた追加知見)
- ブロックウェイトはリグのテストです。 すべての頂点を最も近いジョイントに100%割り当ててポーズを付けます。「期待する最終結果に比較的近い見た目になるはず」です。そうならない場合は、まずピボット、配置、ループを修正します。リグの不具合をスムージングでごまかすのは、「本番ではやってはいけません」(Makauskas)。手首や足首に沿って走るループはモデラーの責任で、きれいな肘でのボリューム損失はリグの責任です(antCGi)。
- 領域全体を塗り、マスクで形を演出します。 判断ごとに1つのレイヤーを使います。ツイストジョイントは均一に塗り、肩をすくめる形状や肩・肘の形状はマスクで調整するため、ツイストを再スムージングしても肘は崩れません(Jao)。「マスクは実際のインフルエンスではなく」、レイヤーのアルファです(Makauskas)。ヘッドレスでは、
S.block_regionsが同じスタックを合成し、1回で書き込みます。 - 動きの中で評価し、テストごとに動きは1つにします。 体操のようなテストでは、10フレームごとにキーを設定し、2つおきのキーにポーズを付け、その間はバインド状態に戻します。曲げる動きと下げる動きを同時に行ってはいけません(Makauskas)。極端なポーズや「奇妙な」ポーズでエラーが見つかります。MLのポーズデータでは、約30度刻みで一度に1つのジョイントを動かします(Widup)。
- スムージングは無条件に有効ではありません。 疎な指ではボリュームが失われます。中央のループをスムージングしてから、Sharpenを適用します(Makauskas)。ここでの計測では[追加]、110度の肘の曲げによるストレッチはスムージングで3.9xから1.5xに減りましたが、肘の内側が潰れました(エッジ比0.19)。深い曲げには、スムージングの追加ではなく、補正シェイプが必要です。
- Skin Toolsのレイヤーはオーサリング時の状態です。 レイヤーが存在する間、Mayaでは従来のペイント、ミラー、コピー、ハンマー、最大インフルエンスの設定、正規化ツールが使用できません。Delete Skin Layersを実行すると、評価済みのウェイトが保持され、これが引き渡しの手順になります(Help)。「最終的には通常のMayaスキンのままです」(Jao)。
- スカルプトを始める前に、補正シェイプの空間を選びます。 変形前の補正は「元のキャラクターのメッシュを修正するようなもの」で、ほかのポーズでも維持されます。変形後の補正は、特定のポーズ結果を修正します。1つのジョイントが補正を担う場合はTransform Space(高速ですが、そのジョイントのエンベロープ内に制限されます)、複数のジョイントにまたがってサーフェスに追従させる場合はTangent Spaceを使います(Help。複数ジョイントにまたがる解釈は[追加])。まず極端なポーズを作り、次に中間のポーズを作ります(Help)。エンジンでは、スイングツイストのポーズ割合で駆動するセカンダリージョイントを用意し、それぞれにLODを割り当てます(Rudy)。
- リグが実際に動かすジョイントを読み取ります。 IK/FK制約やoffsetParentMatrixブレンドで駆動されるバインドジョイントは、コントロールを介してポーズを付けます。Pose Editorでは、ニュートラルポーズなしでインターポレーターを作成し、Driver Settingsでコントローラーの駆動属性を追加してから、Add Neutral Posesを実行します。手首が前腕を軸にツイストする場合はEuler Twistを使います(Help)。OPMによる駆動ではrotateが0のままになるため、ノードリーダーは
dagLocalMatrixを使います[追加]。 - 顔:まず予算を決め、回転にはジョイントを使います。 まずジョイント数とシェイプ数の予算を確認します。唇を少し開いたニュートラルポーズにすると、スキニングが「格段に簡単」になりました(Burton)。シェイプ中心の顔でも、目、まぶた、顎はジョイントで動かし、分割したシェイプの合計はマスターと正確に一致させます(antCGi)。ML Deformerは与えられたデータから学習します。Control Collectorにスキンジョイントを含め、最初にDelta Mushを削除し、ネットワークのサイズよりポーズのカバレッジを優先します(Widup)。
まず決めておくこと
| 入力 | 変更内容 | 指示がない場合のデフォルト |
|---|---|---|
| ターゲットランタイム | インフルエンス上限、DQ の許可、補正をシェイプまたはセカンダリジョイントのどちらにするか、フェイスシェイプまたはジョイント | Maya での映画向け:作成中は上限なし、最後に 0.01 でプルーニング[追加];ゲーム:エンジンまたはリードの上限(数値) |
| スケルトン(scenario-maya-rigging) | 領域、ツイストチェーン、ミラーのルール、バインドジョイントの駆動方法(コンストレイントまたは OPM) | バインドジョイントのみ、回転はゼロ、L_/R_ の命名、すべての四肢セクションにツイストジョイント(ソースでは 3~5 個) |
| メッシュ(scenario-maya-retopology-uv) | バインド方法、シェル | 水密な単一シェルでジョイントが内側にある場合は Heat Map、複数パーツまたは非多様体の場合は Geodesic Voxel |
| デフォメーションの要件 | スタイライズされたスクワッシュ(2 つのクラスター)、衣服、フェイスの範囲、ヒーローか背景か(ML Deformer) | ボディと衣服を別々のスキンメッシュとして使用;フェイスはジョイント上の顎、目、まぶた |
Skin Tools API(S.skin_tools_probe()) | レイヤーありまたは通常の方法 | メモリ内レイヤーを使った通常のクラスター;実際にペイントする人がいる場合にのみ実レイヤーを使用 |
ワークフロー
- インテーク時のゲート。
mx_validate.validate(profile="model")、mx_audit.verdict(r, symmetric=True)、S.bind_precheck(mesh, joints, method)。ゲート:エラー行がないこと、ジョイントが内側にあること、トランスフォームが固定されていること、 デフォーマー以外のヒストリーがないこと、X 軸対称であること。顔:唇が離れていること、眼球のジョイントが眼球の中心にあること(Burton)。 - 明示的にバインド。
S.bind(mesh, joints, method, skin_method=0, normalize=1):すべての フラグを渡してください。cmds と UI のデフォルトが異なり、normalizeWeightsに関するヘルプの説明にも矛盾があるためです。 ゲート:S.weights_verdict(S.audit_weights(...))が問題なしであること。S.export_weights_jsonでバックアップを作成します(OpenMaya による 書き込みは元に戻せません)。 - ブロックして診断。 最も近いボーンに基づく領域を使用し、スムージングなしで
S.block_regionsを実行します。基本的な カリステニクス(S.rom_schedule、S.key_rom)を行い、S.deformation_testを実行します。S.pose_snapshotsの後にmx_review.reviewをヘッドレスで実行し、目視確認します。ゲート:未加工のポーズが目標に近いこと。問題があれば数値と画像を添えて scenario-maya-rigging(ピボット)または scenario-maya-retopology-uv(ループ)に戻します。 - 領域、ツイスト、マスク。 順序:胴体、鎖骨と肩、上腕、前腕、手、親指、指、頭と首、脚、足(Makauskas)。ツイスト
チェーンは均等なランプにし、マスクはボーンに沿った範囲として設定します。API では
S.st_add_region_layerとS.st_floodを使用します。 頂点ではなくマスクの範囲を調整します。ゲート:監査で問題がないこと、ポーズごとに警告が減少すること、最悪のポーズを確認済みであること。 - ミラーリングとシェル。
S.mirror_skin(または Skin Tools の Mirror タブ)を使用します。衣服とアクセサリには、その下にあるボディを 適用します(S.copy_nearest、S.remap_by_closest。ボリュームスムージングはシェルに限定します)。ゲート:ミラーエラーが 0.01 未満であること、 対応付けられない要素がないこと、静止状態で貫通がないこと。 - 全可動域。 前腕と上腕の中間部分、ボーンボリューム、折り目、クロストーク、硬い靴底、衣服の貫通を確認します。続いて複合的な「奇妙な」
ポーズとアニメーターのような再生を行い、セッションがある場合は GUI でプレイブラストを作成します。ゲート:
error:がないこと、すべてのwarn:が修正済みまたは説明済みであること、references/critique.mdの評価が 2 以上であること。 - 補正。 キャンディラッパー:まずツイストを分配し、次に DQ またはウェイトブレンドスキニングを使用します。深い曲げ:前置きか後置きか、
そしてターゲット空間(スタンス)を選びます。
S.joint_drive(joint)を確認し、ドライブされている場合はコントロールを通してポーズを取らせます。 次に、ポーズを付けたスカルプトとS.corrective_driverからS.solve_pre_correctiveを実行するか、GUI の Pose Editor を使用します (上記のコントローラー駆動の順序で、まず極端なポーズを設定し、Regularization は 0.01 から始めます)。ゲート:静止時は 0、 コントロールを通して到達したポーズでは 1、残差が 1e-3 cm 未満であること。可動域テストを再実行します。 - 対象に含まれる場合は顔。 分割ジェネレーター(
S.split_targets、S.add_split_targets)を通してシェイプを作成するか、静止時のポーズがゼロのジョイントフェイスを使用します(Burton)。微調整時の スカッシュは 2 つのクラスターとして扱います(multi=True、UV Pin はクラスター 1 を読み取り、グループの逆行列を bindPreMatrix に設定します)。 ゲート:分割エラーが 1e-5 未満であること、数が予算内であること、二重変換テストに合格すること。 - 最終処理。
S.delete_skin_layers、S.prune_and_limitで目標上限まで減らし、可動域テストを再実行します。ウェイト JSON (およびレイヤー JSON)を出力し、mx_validate.validate(profile="rig")を実行して、新しいバージョンを保存します。
数値
| 値 | 対象 | 出典 |
|---|---|---|
| 10フレームごとにキーを設定し、2つ目のキーごとにポーズを設定する | 体操のタイミング | Makauskas [00:03:01] |
| 3(Makauskas)または5(Jao)のひねりジョイント | 上腕または前腕ごと | [00:07:57], [00:17:13] |
| 重みの合計は1e-4以内で1 | クラスターごとの各頂点 | 正規化(Jao、ヘルプ) |
| 0.01未満をプルーニング[追加] | 重みごと。ヘルプでは0.008を無視できる値としている | ヘルプ、プルーニング |
| インフルエンス上限4[追加]、BurtonのUnrealモバイルでは2 | 頂点ごと。ゲームのみ | Burton [00:51:55] |
| エッジ比率 < 0.7でピンチ、> 1.3でストレッチ[追加] | ポーズ時とバインド時のエッジ長 | ダイジェストのしきい値 |
| 断面積 < 0.7、周長 < 0.8[追加] | 四肢中央の断面とバインド時の比較 | キャンディの包み紙。LBSでは50/50、90度のひねりで面積が0.5に保たれる(実測) |
| 体積変化 > 10%[追加] | ボーン周辺の領域 | Makauskasは体積を目視で判断 |
| ミラーとの差 < 0.01[追加] | 頂点の重みとミラー側の頂点の重み | |
| 正則化0.01~1.0、3つのニュートラルポーズ(ニュートラル、スイング、ひねり) | ポーズエディター | ヘルプ |
| 30度刻み。ボディごとに1,500~2,000ポーズ、腕ごとに12~20ポーズ | ML Deformerのポーズデータ | Widup [00:15:50] [00:37:08] |
| 顔のジョイント24個 | Burtonの現世代ゲーム向けの顔 | [00:35:45] |
品質ゲート
測定可能な項目(ヘッドレス、mx_run):目標上限でS.weights_verdictがクリーンであること。S.deformation_testにerror:がないこと(純粋なスキニングではクロストークは起こりません)。警告が修正済み、または説明されていること。ミラー誤差 < 0.01であること。衣服のpenetration増加が0であること。コントロールを使って、静止時の補正が0、ポーズ時の補正が1であること。分割誤差 < 1e-5であること。引き渡し前にS.skin_layers_node(sc) == []であること。再インポートしたJSONで重みが再現されること(差分 < 1e-4)。視覚的な確認:すべてのROMポーズのS.pose_snapshotsをmx_review.reviewでレンダリングします(クレイとワイヤー、正面と斜め前の四分の三方向、各反復で同じカメラを使用)。または、GUIのプレイブラストを使用します。足を上げる動作では、肩をすくめたときの肩と三角筋、肘のしわ、手首のひねり、指、股間と膝、足、首、衣服を確認します。顔では、口角、頬のつぶれ、まぶたを確認します。references/critique.mdを使って評価してください。
よくある間違い
| 間違い | 見た目 | 修正方法 |
|---|---|---|
| 不適切なピボットをそのままにする | 手首の膨らみや、ポーズを変えても戻ってくる首のこぶ | 関節を動かす(scenario-maya-rigging)、ブロックを作り直す(Makauskas) |
| エッジ数だけを見て判断する | 剛性ウェイトではピンチがゼロなのに、パーツ同士が貫通している | 折り目、潰れた面、深刻度を確認する(critique.md) |
ライブクラスタの maximumInfluences を編集する | カスタムウェイトが予告なくリセットされる | S.prune_and_limit(Help:編集モードで -mi を使うとウェイトが消去されます) |
デフォルトのフラグで copySkinWeights を使う | closestComponent で関連付けられ、XY がミラープレーンになる | surfaceAssociation、influenceAssociation、mirrorMode="YZ" を渡す |
| レイヤー化されたクラスタに従来のツールを使う | 「blocked」エラーが発生する、または後からウェイトが上書きされる | 先に S.delete_skin_layers を実行するか、Skin Tools の同等機能を使う |
| メッシュの外側に末端ジョイントがある状態で Heat Map を使う | そのジョイントにウェイトが割り当てられない | ジョイントを内側に移動するか、事前チェック後にジオデシックを使う |
| 複合的な動きでテストアニメーションを作る | どのジョイントが問題を起こすのか分からない | セグメントごとに動きを1つにする(rom_schedule) |
| 疎らな指に Flood でスムージングをかける | 指がソーセージ状になり、ナックルが失われる | 中央のループをスムージングし、Sharpen を使う(Makauskas) |
| メッシュレベルのエラーをポスト補正としてスカルプトする | 修正がほぼ1つのポーズでしか現れない | 変形前に修正する(S.solve_pre_corrective):どのポーズでも維持されます(Help) |
| IK または拘束されたジョイントにニュートラルポーズを作成する | Pose Editor でニュートラルに戻れない、またはポーズに移行できない | 作成時にニュートラルポーズを設定せず、Driver Settings > Controllers から Add Neutral Poses を実行する(Help) |
.matrix のポーズリーダー、または駆動ジョイントへの setAttr | 補正がオンまたはオフのままになる、ポーズが拒否される、または元に戻る | S.corrective_driver(dagLocalMatrix)を使い、コントロール経由でポーズを設定する |
| ニュートラル時に唇を閉じる | ミラー転送とラップ転送が失敗し、唇がくっつく | 唇をわずかに開く(Burton);上唇と下唇のプロキシを分ける(Jao) |
| 分割シェイプが重なっている | 角で動きが二重になる | 頂点の所有権、差分シェイプ(スマイルではなく上げる)、合計テストを使う(antCGi) |
| ML Deformer の下に Delta Mush を残す | ML がスムージングを学習する | トレーニング前に削除する(Widup) |
| 最終メッシュを参照するピン留めコントロール | 依存関係の循環 | skinCluster1.outputGeometry から UV Pin を設定する(Maya LC) |
引き継ぎ
- scenario-maya-rigging から受け取るもの: バインドスケルトン(ジョイントのみ、回転値はゼロ、方向設定済み、ルートは1つ、L_/R_ の名前またはラベル)、ROM 用のコントロール、配置済みのツイストジョイント、バインドジョイントをコンストレイントと offsetParentMatrix のどちらでブレンドするかの指定。
mx_validate(profile="rig")が問題なしであること。scenario-maya-retopology-uv から受け取るもの:原点に配置され、フリーズ済みで、ヒストリがなく、対称で、すべてのジョイントを横切るループと UV を備え、唇が離れ、目が所定の位置にあるメッシュ。 - scenario-maya-animation に引き渡すもの: レイヤーを削除した新しいリグバージョン、ウェイトとレイヤーの JSON、ROM の判定 JSON、確認したシートまたはプレイブラスト、未検証の項目。インポートせず、リファレンスします。
- scenario-maya-pipeline-scripting に引き渡すもの(ゲーム用スキン): エンジン用に上限設定とプルーニングを行ったウェイト、インフルエンスとしてのバインドスケルトンのみ、LOD 割り当てを含むセカンダリジョイントのリスト、エンジンで必要な場合はジョイントとしての補正シェイプ。FBX エクスポートチェック用の監査 JSON。
- 差し戻すもの: ピボットと配置の問題は scenario-maya-rigging に、ループの問題は scenario-maya-retopology-uv に、ポーズ、数値、画像を添えて差し戻します。
Maya 2027 に関する注意事項
- Skin Tools(ngSkinTools ベース)が組み込まれています:Skin > Skin Tools。レイヤーを使うには明示的な初期化が必要です。Bind Skin の Initialize Skin Layers はデフォルトでオフです。ペイント設定はデフォルトでクラシックツールです。
- スクリプティング:
from ngSkinTools2 import api(Developer Help、2026-09-24 取得;まだインポートされていません):init_layers、Layers、assign_from_closest_joint、flood_weights(コンポーネント選択に作用します)、PaintModeSettings、NamedPaintTarget.MASK、export_json、import_json。 - Skin > Smooth Skin Weights は Skin Tools のアルゴリズムを使用し、複数レイヤーのクラスターではエラーになります。Rigid Bind のメニューは廃止されました(インフルエンスを1つにしてバインドします)。
performSkinCluster.melは削除されています。 - 1つのメッシュに複数の skinCluster がある場合は
skinCluster(multi=True)が必要です。ツールリストでは最新のクラスターが先に表示されます。 mlDeformerコマンド(2026)、ストレッチ解析用のdgaTension(2026.3)、Apply Mesh Compare(2026)。Bifrost 3.0 は 2027 に同梱されています。旧式の実験的なリギングモジュールには互換性がありません。
参考資料
references/procedures.md:ステージごとのコード(P1 から P16)、ステータス、テスト。実行時に参照します。references/expert-notes.md:専門家別の原則と意見の相違。判断の根拠が必要な場合に参照します。references/critique.md:レポートの読み方、領域別チェック、0 から 3 の評価基準。ステージ完了とする前に参照します。references/gui-paths.md:Skin Tools、Shape Editor、Pose Editor、ML Deformer のメニュー。GUI 操作時に参照します。references/sources.md:情報源、認証情報、URL、タイムスタンプ。主張の出典をたどる際に参照します。