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
- 既存のオブジェクトをインスタンス化
-
-
インスタンス化したいオブジェクトを選択
-
元になるオブジェクトを選択
-
Modify > Replace Objects Options 🗖
-
Orthographic Viewでの作業
-
View > Camera Tools > Tumble Tool 🗖
-
LockedとSteppedをオフ
ホットキー
オブジェクト表示
| 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があると意図しないテクスチャの表示になるので注意する。
スキニング
スキニング後のオブジェクト分割
-
対象オブジェクトのインフルエンスノードをセット化しておく。
-
対象オブジェクトを複製し、ヒストリを削除。
-
複製したオブジェクトを分割。(ヒストリの削除を忘れずに)
-
最初に取得したインフルエンスノードで各オブジェクトをバインドする。
Bind Skin Options の Remove unused influences はオフにしておく。 -
元のスキンオブジェクト→複製・分割したスキンオブジェクトの順に選択し、Skin > Copy Skin Weights を実行。
オプションの値は以下の通り。項目 値 Surface Association Closest point on surfaceInfluence Association 1 One to OneInfluence Association 1 NoneInfluence Association 1 NoneNormalize True -
Skin > Edit Influences > Remove Unused Influences を実行して不要なインフルエンスを除去。
スキンオブジェクトの結合
Mesh > Combine をオプションの Combine Skinning をオンにした状態で実行する。
ブレンドシェイプ
コンストラクション ヒストリでblendShapeをskinClusterより上にしないよう注意する。
オプションの 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