scenario-maya-groom について
XGen Interactive Groomを使うAgent向けのMaya 2027グルーミングスキルです。毛流れ、束構造、マスク、レンダリング、動きを扱い、数値検査とレンダーレビューを組み合わせます。
主な機能
- 01ガイドに基づく毛流れ設計
- 02階層的な束とノイズの設定
- 03生え際マスクと密度の確認
- 04Arnoldヘアシェーダーとレンダーレビュー
- 05ワイヤー駆動の動きとキャッシュ検査
活用シーン
- 01リアルまたは様式化された毛髪のグルーミング
- 02参照の毛流れからヘア記述を構築
- 03毛髪のカバレッジと本数予算の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ scenario-labs/ skills --skill scenario-maya-groomインストール後、Claude Code で/scenario-maya-groomを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/critique.mdexpert-notes.mdgui-paths.mdprocedures.mdsources.mdscripts/mx_groom.py詳細
ヘアと毛皮のグルーミング(XGen Interactive Groom、Maya 2027)
経験豊富なグルーミングでは、まず数本のガイドで流れを整え、次にルートを緩めにしたさまざまなプロファイルのクランプ階層を作り、最後にリファレンスに見える箇所(毛先、飛び毛)だけを崩します。実際のヘアシェーダーを使い、近距離からのライティングを横から当てたレンダーで判断します。Interactive Groom のブラシにはストローク API がないため、エージェントはデータを使ってグルーミングします(フローシートからガイドを作成してスタックに接続し、マスクを画像として書き出し、モディファイアの値を設定します)。書き出したストランドの数値とレンダーを使って判断します。コード:
scripts/mx_groom.py(import mx_groom as G)。ここに記載されている関連スキルが利用可能なスキルにない場合は、ユーザーにインストールを依頼してください
(npx skills add scenario-labs/skills --skill <name>)。無人で実行する場合は、ツールスキーマを参照して作業を進め、不足している点を明記してください。
必須の背景知識: scenario-maya-expert(実行チャネル、レビューループ、2027 バージョンでの注意点)。
ステータス(2026-09-24): ここに記載された Maya の呼び出しはすべて、まだ Maya で実行していません(2027 が未インストールです)。mx_groom の純粋なレイヤーはオフラインテストに合格しています(tests/code/maya-groom/test_mx_groom_offline.py)。2027 のヘルプから引用されていない名前は、実行時に G.NAME_CANDIDATES から解決されます。
方針(経験者ならではの要点)
- まずガイドで流れを作り、リファレンスに描いた矢印から写します(Fernandez)。流れは圧力です。隣り合う毛は圧縮のカーブを共有し、反対方向からの流れはより直線的な帯状の部分で合流します。短い毛皮は急に曲がり、長い毛はゆっくり曲がります。大きな形状ごとに、流れとクランプのどちらが形を作るのかを決めます。
- ルートは緩めにし、クランプはすべて変化をつけ、2 段階にします(Fernandez)。長さの最初の約 14 % ではアトラクションをかけません。そうしないと根元が細まり、地肌が線状に露出します。大きなクランプ 1 つにつき、小さなクランプを 3〜5 個作ります。3 段階目は長い毛やたてがみに限ります。サイズとプロファイル(
G.CLUMP_PROFILES:spike、onion)に変化をつけます。 - マスクとタイトさは別の調整項目です(Fernandez 05、06)。マスクは三角形にするか四角形にするかを決めます。四角形のクランプは、より緩い大きなクランプの中にある、小さくタイトなクランプです。どちらのマスクも下げます。タイトさ(IG Clump strength[追加])を 0 にすると、収束させずにクランプの形を保ちます。マスクを 0 にするとクランプがなくなります。ガイドがまっすぐだと両者が似て見えるため、ノイズのあるガイドでテストします(
G.clump_follow)。 - ノイズを加えるレベルによって、どこが崩れるかが決まります(Fernandez 07)。クランプレベルのノイズ(二次 Clump の Noise、毛先側半分)は、大きなクランプを崩しつつ、小さなクランプと根元を保ちます。Noise モディファイアでは小さなクランプも崩れるため、使う毛は少数にします(Giovannini:ボディでは 0、5 % の割合で 3)。周波数に変化をつけます。ほつれは少数の毛に限ります。飛び毛のクランプは、新しいシステムではなく、プライマリのマスクに穴を開けて作ります。
- 生え際は、密度だけでなく、細いエッジの毛にトランジションと産毛のディスクリプションを組み合わせることでリアルに見えます(Hadi Karimi)。1 つの密度マップをすべてのディスクリプションで共有し、毛の種類ごとに独自のディスクリプションを用意します。
- 短い補完レイヤーで頭皮を隠します(Giovannini)。ボディのガイドを 2/3 の長さにカットすれば、長い毛を「異常に高密度」にする必要はありません。
- 動きは少数のワイヤーに反映させ、毛自体は動かしません(Flood)。Linear Wire の inGuide からワイヤーを書き出します。フレーム 1 の静止ポーズで Reference State を更新します。Curve to Spline では Align to Normals をオフにします。
- Standard Hair のリアリティはメラニン、粗さ、IOR で作ります(Arnold hair ドキュメント)。diffuse は 0、tint は白、indirect scale は 1 に保ち、リボンモードを使います(Min Pixel Width が機能するのはこのモードのみです)。ブロンドの毛には Extra Depth を使います。コストを左右する調整項目は 4 つあります(MPW、transparency depth、specular samples、AA)。不透明度を 1 未満にすると、コストが大幅に上がります。
まず決めること
どのノードを使うより先に、brief.json に回答を記入します。
| 入力 | 変更内容 | 指定がない場合の既定値 |
|---|---|---|
| ターゲット | Arnold strands、Unreal strands、またはカード(MtoA は XGen Card プリミティブをレンダリングしません) | Arnold strands |
| 髪のタイプ | body、fill、fringe、strays、brows、upper and lower lashes、transition、fuzz のそれぞれを説明します。顔のクローズアップでは、産毛を含めるかどうかを決めます(Hadi) | body + brows |
| スタイル | リアル調:ランダムなクランプポイント、Randomness > 0、メラニン。スタイライズ調:ガイド上のクランプ(FlippedNormals)、メラニンを 0 にしたフラットな Base Color[追加]。どちらの場合も、defined-to-soft の範囲からポイントを選び、同じシルエットにします(Fernandez 07) | リアル調 |
| モーションとその担当者 | 静的な追従、キー設定またはシミュレーションされたワイヤー、リグまたは CFX 部門(Flood)、あるいはグルームファイル(2027 help) | 頭皮に追従 |
| 静止画またはアニメーション | 静止画の類似性:頭部に生やします(Hadi)。アニメーションまたはリアルタイム:クリーンな UV を持つ頭皮キャップを使います | 頭皮キャップ |
| カメラ距離 | Scattering Mode:クローズアップでは Accurate(10~30 % 遅くなります)、混在するショットでは Adaptive | Adaptive |
| 予算 | スプライン数と GPU メモリ(xgmSplineQuery)、Unreal のシミュレーションガイド | 数値を指定 |
| リファレンス | 流れの矢印とクランプ数はリファレンスに基づきます | 確認する。確認できない場合は、想定する見た目を記述する |
| 新規または継承 | 新規作業には Interactive Groom を使用します。継承したアセット、またはスプライン以外のプリミティブには、レガシー XGen のみを使用します | Interactive Groom |
ワークフロー
ヘッドレスの mayapy(mx_run --plugins mtoa,xgen,abc の順)では、ガイド、マスク、Alembic、
Unreal タグ、Lint、分析、Arnold レビューを扱います。GUI ブリッジでは、メニューのクエリと、
プローブでヘッドレスでは評価されないと判明した処理を扱います(IG は GPU で計算されます)。
references/procedures.md の P16 は、すべてのゲートがアサートされる
1 本のスクリプトでジョブ全体を実行します(G.gate は例外を発生させます)。
- プローブとレシピ(インストールごとに 1 回)。 ヘッドレスと GUI で
G.probe()を実行します。コマンドが ドキュメント化されていないメニューアクションはクリックせず、読み取ります。ブリッジ経由でG.menu_recipe(name)を呼び出し、アイテムのコマンド文字列(cmds.menuItem(item, q=True, command=True))を クエリして保存します。Attribute Editor のボタン(Make Wires Dynamic、Reference State Update、Rebuild)は、G.button_recipe(name, node)を使います。Export Cache はダイアログを開くため、G.recipe_sourceの@path@テンプレートを書き込みます。ゲート: プローブ JSON が保存されていること。recipe_status()に、プランで必要なレシピが記録済みとして表示されること。 - スカルプ。
G.scalp_check(scalp, for_unreal=...)を実行します。ゲート:error:行がなく、 境界エッジ(生え際)があり、UV が一意であること。 - フローシートとカウント。 リファレンスからフローシート(
base、whorl、part、direction、長さの領域)を書き起こし、大きなクランプの数と、大きなクランプごとの小さなクランプの数を数えます。ゲート:G.check_flow_sheet(flow) == []であること。 - ガイド。
g = G.make_guides(scalp, flow, spacing=..., cvs=8, collide=head)を実行します。まずは少数で 行います(FlippedNormals)。symmetric=Trueにするのは、トポロジーが対称な場合のみです(Hadi)。ゲート:G.gate(G.measure_curves(...)["verdict"])が通り、貫通が 0 で、途切れがパートと つむじの箇所だけであること。 - ディスクリプションと接続。 髪の種類ごとに
G.create_description(scalp, "hair_body")を実行します(レシピを 使用し、名前を変更)。G.wire_guides(desc, g["curves"])を実行します。スタック下部にある Guide モディファイアーが ガイドを補間し、そのinGuideには Curve to Spline が接続されます。このモディファイアーは、パートに必要な リージョンマップを保持します。ディスクリプション自体に Curve to Spline を接続すると、各カーブが 1 本の毛に 変換され、その下のすべてが無効になります。これは、ストランドを正確に再現する場合やキャッシュに限って使います。ゲート:G.wiring_verdictが通ること。接続後に髪のフローシートエラーが減り、InGuide_base キャッシュにすべてのガイドが 保持されていること。 - スタック、密度、マスク。 下から上へ、ベース(Numbers に応じた CV 数)、Scale、Guide、プライマリーおよび
セカンダリーの Clump(
G.build_clumps)、共有に設定したストランドの Noise、長さのばらつき、Collision。 生え際にはG.write_hairline_maskを使います(band=True:遷移部分)。全ディスクリプションで 1 つのマップを 共有し(G.connect_texture)、G.patchesでプライマリーのマスクに穴を設け、はみ出したクランプを処理します。 ゲート:G.gate(G.lint()["lines"])が通ること。coverageパス(透けて見える割合)とスプライン数が 予算内であること。 - クランプとばらつきの調整を一度に 1 レイヤーずつ行います(Giovannini)。インストールごとに 1 回、P5b の 2 つのテストで
Clump Scale の規約、密度を左右するノブ、各ノイズレベルで変化する内容を確認します。スタック途中のキャッシュを
エクスポートしてから、
G.hierarchy_from_states(3~5)、G.breakup_report、G.measure_abcを実行します。 Clump の前後で Noise をそれぞれ 1 回レンダリングします(2027 ヘルプ)。ゲート:breakup_verdictとstrand_verdictに問題がないこと。横から光を当てたクローズアップがreferences/critique.mdの基準を満たし、三角形と四角形の比率がリファレンスと一致すること。 - シェーダーとレンダー。
G.hair_shader(desc, preset=...)(デフォルトのhairPhysicalShaderを置き換えます)、G.curve_render(desc, "ribbon", min_pixel_width=...)、 フリッカーを含めて 4 つのノブを対象にするG.cost_sweepを実行します。XGen をレンダリングする前に保存します。ゲート:G.review(...)のシートを基準に照らして評価し、シェーダーのwarn:がないこと。 - モーション。 静的な追従、キー設定したワイヤー(Flood)、またはダイナミクス(Linear Wire、Make Wires Dynamic)。 キャッシュにはバージョンを付けます。ゲート: 静止フレーム、中間フレーム、最終フレームでレンダリングし、 貫通がないこと。
- 納品(引き継ぎ)。
数値
| 値 | 対象 | 出典 |
|---|---|---|
| 最初の約14%の長さでは、クランプの引き込みがありません | 毛束の長さ、クランププロファイル | Fernandez 02 [00:17:56] |
| スパイク:長さの中間で0.01、オニオン:中間の膨らみは約0.9 | 従来の Clump Scale ランプ(半径の読み取り) | Fernandez 02 [00:05:38]、フレーム 00:06:00、00:10:51 |
| 大きなクランプ1つにつき小さなクランプ3~5個、階層は2段、長い髪では3段 | クランプ階層 | Fernandez 03 [00:01:31]、[00:09:11] |
| 2段目のクランプ密度は7.5、クランプノイズは2、Cut randomは最大10 | 実際のリアルタイム用頭皮アセット | Giovannini [00:09:43]~[00:11:25] |
| はみ出し毛は5%(最大20%)、はみ出し毛のノイズは3、全体は0 | 毛の割合 | Giovannini [00:09:28]、[00:11:59] |
| ノイズマスクは0.1~0.5(1ではクランプが消えます) | 従来の Noise modifier | FlippedNormals [00:32:05] |
| ノイズ使用時はCVが20本、カールでは24~36本 | modifierまたはベースのCV数 | FlippedNormals [00:28:52]、2027 help |
| ランダムな長さは0.8~1.2、クランプのカットは0.2 | 1を中心にバランス、小さなクランプレベル | Fernandez 08 [00:09:33]、[00:15:34] |
| メラニン:ブロンドは0.2、赤毛または茶色は0.5、黒髪は1.0 | Standard Hair | Arnold hair doc |
| IORは1.55(1.4~1.6の範囲は濡れた場合のみ);Shiftは0~10度、実測値は2.3~3.7、合成では0 | Standard Hair | Arnold hair doc |
| Unreal:Sub Steps 40、Iterations 10、Collision Radius 3.5、Bend Scale tip 0.1 | UE 5.3時代の値[推定] | Giovannini [00:51:04]~[00:54:27] |
| Nucleus Space Scaleは0.01 | cm単位のシーン | maya-version-deltas 2.8 |
品質ゲート
コード内。 G.lint()(プラグインの順序、スタック、クランプの接続とプロファイル、ノイズの配置、予算、
シェーダー)、G.measure_abc(cache)["verdict"](根元のつまみ、プロファイルの多様性、大きなもの1つあたりの小さなものの数、はみ出し毛、毛先の
ノイズ、頻度とほつれ、長さのバランス、流れ、貫通)、G.wiring_verdict、
G.breakup_verdict、G.unreal_verdict(G.inspect_abc(abc))。G.gateを使うと、いずれも
アサーションにできます。[added]と記されたしきい値は、このスキルのデフォルト値です。各行に対応するルールが記載されています。
ビジュアル。 G.review(hair, out, head=head, scalp=scalp, closeups=[...])は、実際のシェーダーを使ってレンダリングします:
ビューティー(ドームライトとグルームに沿ったキーライト、Schneider)、逆光(はみ出し毛、ハロー)、シルエット、カバレッジです。
ビューポートのキャプチャは、G.viewport_aa(True)(FlippedNormals、Fernandez)の実行後に限ります。references/critique.mdを参照して、
流れ、次にクランプ、最後に毛を評価します(Fernandez)。
よくある間違い
| 間違い | こう見える | 修正方法 |
|---|---|---|
| ガイドが接続されていない、または説明で Curve から Spline 経由になっている | 髪がフローシートを無視する、またはカーブごとに髪が1本だけになる | G.wire_guides(Guide モディファイアー)を実行し、その後 wiring_verdict を実行します |
| 根元が固まっている | 頭皮に固まりの間のはげた線ができる | 根元を緩める Clump Scale ランプ(Fernandez) |
| どこも同じ形の房で、すべて三角形になっている | 「CG」らしい規則性 | Radius Variance、プロファイル、四角い房(Fernandez 02、05) |
| まっすぐなガイドでマスクとタイトさを判断している | 2つのノブが同じ働きをしているように見える | Clump の下にノイズを追加し、G.clump_follow を実行します(Fernandez 06) |
| 大きな房を崩すためのストランドノイズ、ボディ上のノイズ | 小さな房がフリッズに溶け込んでしまう | 房レベルのノイズ、ストランドノイズは一部に適用します(Fernandez 07、Giovannini) |
| ノイズの周波数が1種類で、あらゆる場所がほつれている | 不自然で均一なフリッズ | 周波数を変え、少数の髪だけをほつれさせます(Fernandez 05) |
| はみ出した毛を新しいシステムだけで作る | はみ出した毛が房と関係しない | メインのマスクに穴を作ります(Fernandez 03) |
| ストランドを伸ばす | 房の内側で交差する | 小さな房レベルでスケールを調整するか、カットします(Fernandez 08) |
| 房のギザギザや配置の悪さ | 房の縁が階段状になる | すべてのレベルで Map Subdivision Level を上げ、新しい Seed を設定します(2027 help) |
| セカンダリの密度がプライマリ以下 | セカンダリの房がセルをまたいで漏れ出す | プライマリを複製して密度を上げ、Use Control Map を選択します(2027 help) |
| 房がパートをまたいでいる | 房がパートをまたぐ | Guide region map を房のコントロールマップとして使うか、説明を分けます |
| Multiple Transforms と Write Final Width を使わずにキャッシュする | 他のアプリでカーブが正しく表示されない | 両方をオンにします(2027 help、Flood)。Epic の反対のアドバイスも確認してください |
デフォルトの hairPhysicalShader をそのまま使う | 髪に間接拡散反射がない(Ai Kd Ind のデフォルト値は 0) | aiStandardHair を使うか、Ai Kd Ind を上げます(2027 help) |
| エイリアスのあるビューポートで判断する | 密度と房を誤って判断する | 最初に G.viewport_aa(True) を実行します |
ハンドオフ
- scenario-maya-retopology-uv から受け取るもの: 頭皮のみのキャップ(生え際に開いた境界があるもの)、0〜1の範囲で固有の UV、Unreal 用の UV セット
map1、フリーズ済みで履歴なしのもの。G.scalp_checkに合格していること。 - scenario-maya-animation から受け取るもの: リファレンスされたリグ、フレーム 1 のレストポーズから始まるショット、アニメーションされたボディの Alembic(
-uvWrite、-stripNamespaces)、およびリグがワイヤを所有する場合はワイヤのキャッシュ。 - scenario-maya-lighting-rendering に渡すもの: 新しいグルームのバージョン、割り当てとリントを済ませた aiStandardHair、リボン設定、ショットごとにバージョン管理されたキャッシュ、レビューシート、未検証の項目。髪を肌に合わせる必要がある場合は scenario-maya-lookdev も参加させます。
- scenario-maya-pipeline-scripting(Unreal)に渡すもの:
groom_group_id、groom_guide(フィルではなく実際のガイド)、およびgroom_root_uv(UV セットmap1)を含む<asset>_ue5.abc、再インポート時に問題のないunreal_verdict、および Unreal の開始値(Numbers)。
Maya 2027 に関する注意事項
- レガシーのディスクリプションは Interactive Groom ツールでは動作しません。一度に 1 つずつ変換してから、それぞれを Rebuild します(Giovannini)。
- IG のデフォルトのシェーダーは
hairPhysicalShader(Ai Kd Ind 0)です。Standard Hair には MtoA 5.6.0 でscattering_modeが追加されました。XGen の前に MtoA を読み込みます。 - IG の計算には GPU を使用します。Apple Silicon でのヘッドレス評価は未検証です(要確認)。Maya の並列処理には既知の制限があり、XGen シーンのバッチレンダリングで「誤った結果が出る可能性があります」。
- Alembic は Ogawa のみです。Epic のスクリプトは Python 2 と API 1.0 用です。
mx_groomの移植版を使用します。macOS では Arnold GPU は使用できません。Arnold RenderView は Maya IPR に代わるものです。Ctrl は Control を意味し、Command ではありません。
参考資料
references/procedures.md:各ステージのコード、P5b のクランプテスト、ジョブ全体の P16 が記載されています。グルームのコードを書く前に読み込みます。references/critique.md:レンダリング結果と数値からグルームを評価するための基準です。各ゲートで読み込みます。references/expert-notes.md:専門家ごとの原則と、選択を決める条件を含む見解の相違が記載されています。選択肢を比較するときに読み込みます。references/gui-paths.md:メニュー、エディター、ブラシ、ホットキー(コンピューター操作エージェント)が記載されています。references/sources.md:すべての出典、認証情報、URL、最適なタイムスタンプが記載されています。