リファレンス / 3ds Max / 3ds Max Python チートシート

はじめに

  • 3dsMax
  • Python
  • pymxs
  • チートシート
3ds Max Python チートシート の章一覧

このチートシートについて

「あの操作、3ds Max の Python でどう書くんだっけ?」を 最短でコードに変換する ための逆引き集です。 Python の文法をゼロから学ぶ本ではなく、やりたいことから探して、貼って、すぐ動かす ことを目的にしています。

  • 対象読者: 3ds Max の作業を Python で自動化したい人。MaxScript を知っている人も、Python から入る人も読めるように書いています。
  • 基準環境: 3ds Max 2022(Python 3.7 / PySide2)
  • 使う API: pymxs(MaxScript を Python から呼ぶためのモジュール)。MaxPlus は 3ds Max 2022 で廃止されたので扱いません。

本書の使い方

  1. 章の一覧から やりたいこと に近いカテゴリを開く
  2. 見出しから該当のレシピを探す
  3. コードブロックを MAXScript エディタに貼り付けて実行 し、結果を MAXScript リスナー で確かめる

すべてのコードは、特記がない限り 凡例の 2 行を先頭に付けて、エディタで実行すれば動く 形で書いています。

MAXScript エディタで実行する

  1. [スクリプト] → [新規スクリプト] でエディタを開きます。
  2. [言語] メニューで [Python] を選びます(既定は MAXScript なので、切り替えないと Python のコードとして実行されません)。
  3. 凡例の 2 行とコードを貼り付け、[ツール] → [すべてを評価](Ctrl + E)で全体を実行します。一部だけ実行したいときは、その行を選んで [ツール] → [行/選択範囲を評価](Shift + Enter)を使います。
  4. 保存するときは .py ファイルにします(.py として保存したファイルは Python として扱われます)。

MAXScript エディタの「言語」メニュー。ここで Python を選ぶ

「ツール」メニューの「すべてを評価」と「行/選択範囲を評価」

結果をリスナーで確かめる

実行結果は MAXScript リスナー(F11)に表示されます。リスナーは上下 2 つの欄に分かれていて、結果が出るのは 下の白い欄 です(上のピンク色の欄はマクロレコーダの記録)。 Python で値を確かめたいときは print() で出します。たとえばエディタで次を実行すると、

b = rt.getNodeByName("Box001")
print(b)

リスナーの下の欄に $Box:Box001 @ [40.000000,20.000000,0.000000] のように表示されます(座標はシーンによって変わります)。

エディタで実行した print の結果が、リスナーの下の欄に表示されている

リスナーの下の欄に直接入力して実行することもできます。欄の上にある [MAXScript] / [Python] で [Python] を選ぶと、プロンプトが >>> になり Python のコードを受け付けます。1 行だけ試すときに便利です。

ほかの実行方法

保存した .py ファイルは、メニューの [スクリプト] → [スクリプトを実行] で選んでも実行できます。 MaxScript から実行するなら python.ExecuteFile を使います。相対パスだとスクリプトフォルダなど決まった場所から探されるので、フルパスで指定するのが安全です。

python.ExecuteFile @"C:\tools\hello.py"
  • ⚠️ 3ds Max は シングルスレッド なので、スクリプトが終わるまでビューポートや UI が更新されません。作ったオブジェクトをすぐビューポートに出したいときは rt.redrawViews() を呼びます。

凡例

すべてのコードは、先頭に次の 2 行がある前提で書いています(各コードブロックでは省略します)。

import pymxs
from pymxs import runtime as rt

rt は pymxs.runtime の短縮名で、MaxScript のグローバル(関数・クラス・変数)はほぼすべて rt. の下にあります。ただし print / assert は pymxs からは呼べないため Python 標準のものを使い、$Box001 のようなパス名は rt. に直接の対応がありません(次章で rt.getNodeByName などの代用を扱います)。

各コードには、対応する MaxScript を # MXS: のコメントで 1 行添えています。MaxScript を知っている人は、そこから意味をつかんでください。

b = rt.Box(length=20, width=20, height=20)   # MXS: b = box length:20 width:20 height:20
記号 / 表現 意味
rt pymxs.runtime。MaxScript の世界への入口
rt.selection 現在の選択(MaxScript の selection)
rt.getNodeByName("Box001") 名前が Box001 のノード(MaxScript の $Box001。完全一致のみで、$Box* のようなワイルドカードは使えません)
# MXS: 同じことを MaxScript で書いた場合
「⚠️」 ハマりやすい挙動・注意点

選択中のオブジェクトを使うコードは、何か 1 つ以上選んでから 実行してください。

収録している章

第 1 部 基礎 — pymxs に慣れる

章 内容
pymxs の基本 rt / $ の代わり / Name 値 / 配列のインデックス / 値の型 / as 変換 / undo や animate のコンテキスト
MaxScript との連携 rt.execute / MaxScript から Python を呼ぶ / 参照渡し(byref) / max コマンド

第 2 部 シーン操作の逆引き

章 内容
選択・取得 選ぶ・集める・条件で絞り込む
変形・配置 位置 / 回転 / スケール / 行列 / 座標系 / 位置合わせ / ピボット
生成・複製 プリミティブ / 複製(copy / instance / reference) / シェイプ / ライト・カメラ
階層・グループ・レイヤ 親子 / グループ / レイヤの作成と移動
表示・名前・色・ユーザ定義 表示と非表示 / フリーズ / リネーム / ワイヤフレームカラー / ユーザ定義プロパティ
モディファイヤ 追加 / 取得 / パラメータ変更 / 削除 / スタックの集約
メッシュ・ポリゴン 頂点 / 面 / 選択 / 法線 / UV / 大量処理を速くする
マテリアル・マップ 作成と割り当て / マップ / マルチ/サブオブジェクト / 集計
アニメーション 時間 / キー / コントローラ / ベイク

第 3 部 Python ならではの使い方

章 内容
ファイル・データ パス / シーンファイル / インポート・エクスポート / JSON・CSV
Qt UI PySide2 のウィンドウ / 3ds Max を親にする / ドッキング / 進捗表示
コールバック・イベント 一般コールバック / ノードイベント / 時間変更 / タイマー
レンダリング・ビューポート・バッチ レンダリング / 出力設定 / ビューポートのキャプチャ / 3dsmaxbatch
モジュール管理・デバッグ sys.path / reload / 起動スクリプト / pip / 調べ方 / 例外

誤りや不明点を見つけたら

記述の誤りや、わかりにくい・動かないといった点に気づいたら、各章の末尾にあるコメント欄か お問い合わせフォーム からお知らせください。

関連

  • MaxScript 版のチートシート「MaxScript チートシート — やりたいこと逆引き」(同じ「やりたいこと」を MaxScript で書く逆引き集)も用意しています。

← 3ds Max Python チートシート へ