基礎から始める3dsmax/Python(MaxPlus)プログラミング①

今週から「Brosのブロブロ」は毎週月曜と木曜の更新になります。今後ともよろしくお願いします。

さて、MayaでPython講座をやってきましたが、やはり3Dツールとしては3dsMaxの方も外せないでしょう。
「基礎から始める…Python」というタイトル通りに全く初めての方でも解る解説をしますが、3dsMaxの基本操作や知識は省略します。

まず、3dsmaxで使えるスクリプトは基本「MAXScript」というのがあります。
これは他の言語とは互換がなく、3dsMaxだけで使えるプログラミング言語です。Mayaでも「Mel」という独自のプログラミング言語があります。

独自のプログラミング言語では限界が出てしまい、やはりMaya同様に汎用的なPythonを使えると将来が明るい兆しが見えるでしょう。
それについてはここを含めて、参考にできる本やサイトがいっぱいありますのでここでは省略します。

3dsMaxでPythonを使うには2通りあります。
1つは「pymsx」で、もともとのMAXScriptをPythonで操作するもの(ラッパーといいます)で、MAXScriptでできることは全て可能です。

2つめが「MaxPlus」で、Max SDKをベースしにています。SDKというのはC++言語で3dsMaxのプラグインを作成するためのもので、大きく機能を拡張できますが、難易度が高いので、Pythonだけでできるメリットがあります。

では、いろいろ実験してみましょう。
今回は3dsmax2017を使います。
メニューから「スクリプト」→「MaxScriptリスナー」を実行します。このウインドウからプログラムを実行したり確認したりします。

起動すると2016だと、

2017ですと、

こうなります。なので、2017でPythonのモードがちゃんとできたので、こちらを使いたいと思います。

では、pymxsから実験しましょう。

まずメニュー下のラジオボタンで「Python」に切り替えて、import pymxsとキーボードで入力して、CTRL+Enterで実行します。
「>>>」と下に出ると正常に動作しています。これは3dsMaxにpymxsのライブラリ(3dsMaxの特有の機能)を読み込む命令です。
このように1行づつ実験的に入力→実行もできます。

間違えると以下のようにエラーが出ます。
エラーメッセージを含めてBSキーやDelで消して訂正して再実行できます。
※注意:ラジオボタンが「MaxScript」へ戻る場合があります。

エディタ上で右クリックから「すべてクリア」でエディタをクリアできます。

スクリプトはCTRL+Zで実行を戻せます。

では、プログラムを追加します。

rt = pymxs.runtime
tea = rt.teapot()

で実行します。

図のように、3dsMaxお馴染みのティーポットができました。
pymxs.runtimeは「ランタイム」をrtという値で設定しています。ランタイムは「プログラムとかを動かすときに必要な外部の部品」という意味です。
tea = rt.teapot()でteaという値でティーポットを作成します。ランタイムの「rt.」を付けなければなりません。

1行ごとに実行は面倒なので、VisualStudioCodeで作ります。

先ほどのティーポットを作成するのに1行追加しています。
tea.radius=10
これは大きさを10に設定する命令です。
これをmax02.pyなど「py」を拡張子にして保存します。

「MaxScriptリスナー」メニューの「ファイル」→「スクリプトを起動」します。

メインメニューの「スクリプト」→「スクリプトを起動」でもOKです。

ところが、ファイルが見つかりません・・・

これはエラーではなく、3dsmaxは基本はMaxScriptを実行するようになっているので、拡張子が「mse」「mcr」がデフォルトなのです。
Pythonに切り替えれば開くことができます。

大きさ10のティーポットができました。

では、今度は「MaxPlus」でやってみましょう。以下の4行をエディタで作成します。

import MaxPlus
obj = MaxPlus.Factory.CreateGeomObject(MaxPlus.ClassIds.Teapot)
node = MaxPlus.Factory.CreateNode(obj)
obj.ParameterBlock.Radius.Value = 10.0

1行目はMaxplusを使うライブラリを読み込みします。
2行目でティーポットのオブジェクトを作成する準備をします。
3行目でティーポットを生成

4行目でRadiusで大きさを10にします。

実行すると先ほどのpymxsで行ったのと同じ結果になります。
パッと見るとpymxsの方が簡単そうで、MaxPlusはだいぶ複雑です。

次回にもう少し詳しく解説していきます。