kb

Mayaノート

  • maya

Maya学習メモ。

基本ルール

作業単位

Windows > Settings/Preferences > Preferences > Settings の Working Units で設定。

種類 設定 既定値
Linear centimeter centimeter
Angular degrees degrees

名前

  • 大文字と小文字の区別あり

  • ノードやアトリビュートの名前は基本的にキャメルケースで付ける

  • 区切り文字は_を用いる
    |:はネームスペースの表現に使用される。

  • Nice、Long、Shortの三種類
    基本はLongで名前を付けるとNiceが法則に基づいて生成される。
    (Shortは元からあるアトリビュートのみ?)

    Long Nice Short
    rotationOrder Rotation Order ro
    keyableValue Keyable Value  

ファイル名

  • 英数字記号(-または_

  • バージョン番号は.の後に任意の桁数の数字で

    <filename>.0001.mb
    または
    <filename>.01.mb
    

    増分保存は桁数を考慮してくれる。

ノード

DAGノード
DAG階層を構成する親子関係を持ったノード。
トランスフォームノードやシェイプノードがこれにあたる。
DGノード
階層構造を持たず多くの入力と出力で接続されるノード。
マテリアルノードやプリミティブ(polySphere等)ノードがこれにあたる。

コンストラクション ヒストリ

操作に応じたノードが作成され、操作対象のノードに接続される。
3ds Maxのモディファイアスタックのようなイメージ。
チャンネルボックスの INPUTS に表示され、下から上に向かって評価される。

基本操作

座標系の切り替え

以下のいずれでも可能。

  • ツール設定から

  • トランスフォームツールが有効な時にCtrl+Shiftを押しながら右クリック

  • トランスフォームツールのホットキーを押しながら左クリック

回転とスケール操作の中心

回転の中心
Rotate Tool 🗖 > Rotate Center
スケールの中心
Scale Tool 🗖 > Scale Center

オブジェクトの変換合わせ

Modify > Match Transformations > Match All Transforms

インスタンスコピー

メニューから
Edit > Duplicate Special Options 🗖
スマート複製(Shift+ツール
Move Tool 🗖 > Smart Duplicate Settings > Geometry Type
インスタンス解除
Modify > Convert > Instance to Object
既存のオブジェクトをインスタンス化
  1. インスタンス化したいオブジェクトを選択

  2. 元になるオブジェクトを選択

  3. Modify > Replace Objects Options 🗖

Orthographic Viewでの作業

  1. View > Camera Tools > Tumble Tool 🗖

  2. LockedSteppedをオフ

ホットキー

オブジェクト表示
HotKey 機能 ApplicationCommand
H 選択オブジェクトの表示状態を切り替え Toggle Show/Hide
Ctrl+H 選択オブジェクトを非表示 Hide Selection
Alt+H 選択していないオブジェクトを非表示 Hide Unselected Objects
Shift+H 選択オブジェクトを表示 Show Selection
Ctrl+Shift+H 最後に非表示にしたオブジェクトを表示 Show Selection
Ctrl+1 選択オブジェクトの分離表示状態を切り替え Toggle Isolate Select
ビュー表示設定
HotKey 機能 ApplicationCommand
0 既定の精度で表示 Default Quality Display
1 粗精度で表示 Low Quality Display
2 中精度で表示 Medium Quality Display
3 スムーズ精度で表示 High Quality Display
4 ワイヤーフレーム表示 Display Wireframe
5 シェーディング表示 Display Shaded
6 シェーディングとテクスチャ表示 Display Shaded And Textured
7 すべてのライトの使用 Display Light
Alt+5 ワイヤーフレーム表示とシェーディング表示の切り替え Toggle Wireframe On Shaded Cmd
Alt+P パースと正投影の切り替え Camera Mode Toggle
スナップ操作
HotKey 機能 ApplicationCommand
C カーブスナップの切り替え Curve Snap Press
V ポイントスナップの切り替え Point Snap Press
X グリッドスナップの切り替え Grid Snap Press
J 移動、回転、スケールツールのスナップを切り替え Move Rotate Scale Tool Toggle Snap Mode

モデリング

頂点選択と移動を同時に

以下のいずれでも可能。

  • Move Tool 🗖 > Tweak Mode をオン

  • Modeling Toolkit > Tweak/Marquee を選択

  • Move Toolで中ボタンドラッグ

ホットキー

HotKey 機能 Application Command
F7 複数のコンポーネントタイプを選択する Multi-Component
F8 オブジェクトモードとコンポーネントモードを切り替える Object/Component
F9 頂点を選択する Vertex
F10 エッジを選択する Edge
F11 面を選択する Face
F12 UVを選択する UV
Ctrl+F9 現在の選択コンポーネントを頂点選択に変換 To Vertices
Ctrl+F10 現在の選択コンポーネントをエッジ選択に変換 To Edges
Ctrl+F11 現在の選択コンポーネントを面選択に変換 To Faces
Ctrl+F12 現在の選択コンポーネントをUV選択に変換 To UVs

3ds Maxとの対応

3ds Max Maya
Detach Edit Mesh > Extract
(Separate extracted faces = True)
Detach To Element Edit Mesh > Extract
(Separate extracted faces = False)
Detach As Clone Edit Mesh > Duplicate
(Separate duplicated faces = True)

UV

3ds Maxとの対応

3ds Max Maya
Map Channel UV Set
Peel Unfold
Seamsの設定 Cut and Sew > Cut
Pack Layout

テクスチャとUV Setの割り当て法則

最初に見つかった空でないUV Setが割り当てられる。
UV Setを複数持つ場合は Relationship Editor の UV-centric UV linking で明示的に割り当てる。
複数のUV Setを持つブレンドシェイプターゲットをリビルドした際など、空のUV Setがあると意図しないテクスチャの表示になるので注意する。

スキニング

スキニング後のオブジェクト分割

  1. 対象オブジェクトのインフルエンスノードをセット化しておく。

  2. 対象オブジェクトを複製し、ヒストリを削除。

  3. 複製したオブジェクトを分割。(ヒストリの削除を忘れずに)

  4. 最初に取得したインフルエンスノードで各オブジェクトをバインドする。
    Bind Skin Options の Remove unused influences はオフにしておく。

  5. 元のスキンオブジェクト→複製・分割したスキンオブジェクトの順に選択し、Skin > Copy Skin Weights を実行。
    オプションの値は以下の通り。

    項目
    Surface Association Closest point on surface
    Influence Association 1 One to One
    Influence Association 1 None
    Influence Association 1 None
    Normalize True
  6. Skin > Edit Influences > Remove Unused Influences を実行して不要なインフルエンスを除去。

スキンオブジェクトの結合

Mesh > Combine をオプションの Combine Skinning をオンにした状態で実行する。

ブレンドシェイプ

コンストラクション ヒストリでblendShapeskinClusterより上にしないよう注意する。
オプションの Deformation order がAutomaticの場合、最初のblendShapeは、自動的にskinClusterの下に差し込まれるが、二つ目以降は上に追加される。
二つ目以降のblendShapeを追加する場合は Deformation order をPre-deformationにしておくこと。
間違えて上に追加してしまった場合は 右クリック > Inputs > All inputs… で List of input operations ウィンドウを開き、項目を中ボタンでドラッグして並べ替える。

リギング

ジョイント作成

親のオブジェクトのみを変換する

変換ツールのオプションを開きPreserve Childrenをオン

子の移動で親ジョイントの方向を子に向ける

Move Tool 🗖 > Joint Orient Settings > Automatically Orient Joints をオン

階層

  • トランスフォームノードをジョイントノードの親にする際は必ずMatch Transformationsでトランスフォームノードの変換をジョイントノードに合わせてから親子付けを行う。

フリーズ

  • ピボットの役割を担うトランスフォームノードはRotateをオフにしてフリーズする。

  • IKFKスイッチコントローラはScaleをオフにしてフリーズする。
    (子のブレンド用トランスフォームノードの移動量を0.0-1.0に保つため)

  • エイムコンストレイントのWorld Up Objectに指定するノードはオフセットした状態でフリーズすると挙動がおかしくなるのでピボット用トランスフォームノードを挟む。
    (ノードエディタで同様の仕組みを再現しても同じようになる。フリーズの仕方でマトリクスの値がおかしくなる?)

    • 親トランスフォームノード(フリーズ可)
      • ピボット用トランスフォームノード(フリーズ不可)
        • アップベクトル用トランスフォームノード(フリーズ可)
    • なんやかんや
    • トランスフォームノード
      • エイムコンストレイント(ここにアップベクトル用トランスフォームノードを設定したい)

Segment Scale Compensate

  • ゲームエンジンが非対応なので基本的にオフにする。

ワイヤーカラー

  • Drawing Overridesに設定したワイヤーカラーの優先順位

    シェイプノード > レイヤーノード > トランスフォームノード

チャンネル コントロール

  • 編集されたくないアトリビュートはロックする。

  • Nonkeyableはオートキーやセットキーから除外されるだけ。

  • visibilityアトリビュートはNonkeyable Displayedがいいかも。

  • Nonkeyable Hiddenはチャンネルボックスの項目数が変わるので使用しない。

アニメーション

ホットキー

再生コントロール
HotKey 機能 ApplicationCommand
, 前のキーに移動 Prev Key
. 次のキーに移動 Next Key
Alt+, 1フレーム戻る Prev Frame
Alt+. 1フレーム進む Next Frame
Alt+K 最小フレームに移動 Play Range Start
Alt+L 最大フレームに移動 Play Range End
/ 再生状態の切り替え Playback Toggle
アニメーション操作
HotKey 機能 ApplicationCommand
S キーを設定する Set Key
Shift+W 移動キーを設定する Set Key on Translate
Shift+E 回転キーを設定する Set Key on Rotate
Shift+R スケールキーを設定する Set Key on Scale

MEL

基本

構文
  • 大文字と小文字が区別される。

  • 文字列以外の空白は無視される。

    print
        (1
      +
    1);
    
  • 文字列は継続行のトークン\を使用することで複数行にわたる表現が可能。

    {
      string $str = "Hello \
      World\n";
    }
    
    識別子
変数名
var_name = ( letter | "_" ) , { letter | digit | "_" } ;
digit    = ? 0-9 ? ;
letter   = ? a-zA-Z ? ;
プロシージャ名
proc_name = ( letter | "|" | ":" | "." | "_" ) , { letter | digit | "|" | ":" | "." | "_" } ;
digit     = ? 0-9 ? ;
letter    = ? a-zA-Z ? ;
switch case
  • case文の:の後に空白が無いとエラーになる。
コメント
ラインコメント
// コメント
ブロックコメント
/*
コメント
*/
リテラル表現
int int $var = 1;
float float $var = 0.5;
string string $var = "foo";
vector vector $var = <<0, 1, 0>>;
matrix matrix $var[2][2] = <<1, 0; 0, 1>>;
配列
  • 単一の型のみで構成される。

  • 変数名の後に角括弧[]を付けることで宣言する。

    {
      int $flags[];
    }
    
  • 基数は0

  • リテラル表現は中括弧で囲む。

    {
      int $indices = {1, 2, 3, 4};
      int $characters = {"a", "b", "c", "d"};
    }
    
ベクトル
  • 3次元ベクトルのみ。

  • リテラル表現は<<>>で囲む。

    {
      vector $pos = <<0, 1, 0>>;
    }
    
  • 値の取得はアクセサを用いる。

    {
      print($pos.x);
      print($pos.y);
      print($pos.z);
    }
    
  • 要素の再設定にアクセサは使えない。
    代わりに以下のように設定する。

    {
      $pos = <<$pos.x, 2, $pos.z>>;
    }
    
型判定
  • 変数の型を判定するにはwhatIsを用いるしかない?

    string $array[] = {"a", "b"};
    whatIs "$array";
    // Result: string[] variable //
    
  • グローバル変数にのみ有効。
    ローカル変数の型を判定する方法は無さそう。

スコープ

変数
  • プロシージャの外で宣言した変数はグローバル変数になる。

  • プロシージャ、およびブロック({})内で宣言した変数は暗黙的にローカル変数になる。

  • globalキーワードを使用して宣言した変数は常にグローバル変数になる。

  • 一度宣言したグローバル変数の型はMayaを再起動するまで変更も削除も出来ない。
    スクリプトエディタでコーディングする際は全体を{}で囲んだ方がよい。

ローカルプロシージャ
  • globalキーワードを省略したプロシージャはローカルプロシージャになる。

  • ローカルプロシージャは外部スクリプトファイルでのみ使用可能。
    スクリプトエディタではブロック内で宣言したとしてもグローバルになる。

コントロールのイベントコマンド
  • おそらくevalコマンドと同様にグローバルスコープで実行されている。

  • ローカルプロシージャを呼び出すためにはグローバルプロシージャを経由しなければならない。

外部スクリプトファイル

  • 全体を{}で囲むと二回目移行起動しない等、うまく動作しない。
    スクリプトファイルを一つのブロックと見なした方がいいのかも。

  • トップレベルにローカル変数は定義できない模様。
    以下のような構造になっている必要がある?

    • ファイル({}無し)

      • ローカルプロシージャ

      • グローバルプロシージャ

      • グローバル変数

ノード操作
球を作成
{
  string $obj[] = `polySphere -n "Sphere"`;
}
球を選択
{
  // 戻り値無し
  select -r "Sphere";
}
選択ノードを取得
{
  string $selection[] = `ls -sl`;
}
選択ノードを階層順でリスト化(簡易版)
string $all[] = `ls -dag -l`;
string $selection[] = `ls -l -sl`;
string $ordered[];
for ($n in $all) {
  if (stringArrayFind($n, 0, $selection) >= 0) {
    $ordered[`size $ordered`] = $n;
  }
}
選択ノードの種類を取得
{
  string $type = `nodeType "Sphere"`;
  // または
  string $type[] = `ls -sl -st`;
}
選択ノードの親を取得
{
  string $selection[] = `ls -sl`;
  string $parents[] = `listRelatives -p $selection`;
}
選択ノードの子を取得
{
  string $selection[] = `ls -sl`;
  string $children[] = `listRelatives -c $selection`;
}
選択ノードのシェイプノードを取得
{
  string $selection[] = `ls -sl`;
  string $shapes[] = `listRelatives -s $selection`;
}
選択ノードのシェイプからインスタンスノードを取得
{
  string $selection[] = `ls -sl`;
  string $shapes[] = `listRelatives -s $selection`;
  string $instances[] = `ls -ap $shapes`;
}
選択ノードのヒストリノードを取得する
{
  string $selection[] = `ls -sl`;
  string $nodes[] = `listHistory $selection`;
}
アトリビュート操作
アトリビュートの一覧を取得
{
  string $selection[] = `ls -sl`;
  string $attributes[] = `listAttr $selection`;
}
アトリビュートの値を取得
{
  float $translateX = `getAttr "Sphere.translateX"`;
}
アトリビュートの値を設定
{
  // 戻り値無し
  setAttr "Sphere.translateX" 2.0;
}
レンダリング設定
レンダリング設定ノードを選択
{
  // defaultRenderGlobals
  select -r "defaultRenderGlobals";

  // defaultRenderQuality
  select -r "defaultRenderQuality";

  // defaultResolution
  select -r "defaultResolution";
}
レンダリングイメージサイズを変更
{
  setAttr "defaultResolution.width" 960;
  setAttr "defaultResolution.height" 540;
}
GUI
現在作成されているウィンドウの名前を取得
{
  string $windows[] = `lsUI -wnd`;
}

トラブルシューティング

プリミティブを作成してもポリゴンが表示されない

原因
initialShadingGroupノードがロックされているため
解決策
問題のあるファイルで以下のスクリプトを実行。
{
  string $node = "initialShadingGroup";
  if (`objExists $node`) {
    lockNode -l false -lu false $node;
  }
}
参考
maya2022でポリゴンが表示されないバグの対処法|C-GAME