スタジオブロス TECH BLOG

スタジオブロススタッフからの最新ツール情報やチュートリアル・TIPSなどを紹介します

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

前回で3dsmaxでPythonを使う基本操作を学びました。

今回は次のステップに移ります。

MaxPlusは日本語だけでなく、英語でも解説の文献がほとんどありません。

頼りになるのはここです。

help.autodesk.com

(「ページを表示できません」と出たら右上の「日本語」をクリックして「English」に変更してください)

ここに様々なMaxPlusのサンプルプログラムがあり、それとHelpで命令や処理の詳細を調べるのが良いかと思います。

例えば、「demoHelloWorld.py」をクリックすると、そのソースコードが表示されます。

右上に「English」ボタンがあり、ここを「日本語」に切り替えると・・・

残念ですが、日本語の解説はありません。ですが、「Bing翻訳」ボタンがあり、変換をしてくれます。

まず、前回もやりました、「スクリプト」→「MaxScriptリスナー」を起動します。そのメニューから「マクロレコーダー」を起動します。

以下のようにピンクの画面が上に現れます。

マクロレコーダーは3dsMaxの操作をすると、その際に使ったMaxScriptコマンドを表示する機能です。ここからプログラムを作成するためのヒントを得ることができます。

例えば、作成→ティーポットのボタンをクリックします。

するとレコーダーには、

と記録されます。これで半径=radius、セグメント=segsということが判ります。ドラッグしてティーポットを作ると、

radiusが29.5799で位置がpos:[x,y,z]で決まることが判ります。

これをDelキーで消して、Undoすると・・・

このように表示されます。選択=select、削除=delete、そして操作にはexecute.actionという番号が付いていて履歴を取っていることが判るでしょう。

さらにサンプルを見てみると・・・

MaxPlus.Point3という命令で座標を決めているということが判ります。

ここまでのまとめで、前回の最後のプログラムを改造します。

import MaxPlus
obj = MaxPlus.Factory.CreateGeomObject(MaxPlus.ClassIds.Teapot)
node = MaxPlus.Factory.CreateNode(obj)
obj.ParameterBlock.Radius.Value = 10.0
obj.ParameterBlock.segs.Value = 1
node.Position = MaxPlus.Point3(1,2,3)

これを実行します。

このように大きさが10、セグメント1、座標が(1,2,3)のティーポットをPythonで作成できました。

前回、ParameterBlock.Radius.Valueが大きさなら、マクロレコーダーでSegsがセグメントなのが判ったので応用して、ParameterBlock.segs.Valueにしただけです。

プログラムの流れですが、先ほどティーポットを作る手順のようにまず、MaxPlus.Factoryで作るものを決めて、そこからCreateNodeでオブジェクト生成するようです。

では次のサンプルです。

import MaxPlus
obj = MaxPlus.Factory.CreateGeomObject(MaxPlus.ClassIds.Cylinder)
obj.ParameterBlock.Radius.Value = 10.0
obj.ParameterBlock.Height.Value = 30.0
node = MaxPlus.Factory.CreateNode(obj)
mod = MaxPlus.Factory.CreateObjectModifier(MaxPlus.ClassIds.Bend)
mod.ParameterBlock.BendAngle.Value = 45.0
node.AddModifier(mod)

3dsMaxといえばモディファイアですよね。それをプログラムで作るサンプルです。

実行すると・・・

円柱を作って、Bendモディファイアで変形しています。

5行目までは、ティーポットとほぼ同じですから簡単ですね。

CreateGeomObject(MaxPlus.ClassIds.???)の???でプリミティブが決まるのでしょう。

また、CreateObjectModifier(MaxPlus.ClassIds.???)でモディファイアを設定しています。

BendAngle.Valueが角度を決める変数です。

HELPでCylinderを検索してみましょう。

すると、HeightSegmentsという命令で高さセグメントを決めているようです。

さらにTwistファイアをかけて、マクロレコーダーを見ると・・・

命令は「Twist」のようです。

では、先ほどのプログラムを書き換えてみましょう。

import MaxPlus
obj = MaxPlus.Factory.CreateGeomObject(MaxPlus.ClassIds.Cylinder)
obj.ParameterBlock.Radius.Value = 10.0
obj.ParameterBlock.Height.Value = 30.0
obj.ParameterBlock.heightsegs.Value = 3.0
node = MaxPlus.Factory.CreateNode(obj)
mod = MaxPlus.Factory.CreateObjectModifier(MaxPlus.ClassIds.Bend)
mod.ParameterBlock.BendAngle.Value = 45.0
node.AddModifier(mod)
mod2 = MaxPlus.Factory.CreateObjectModifier(MaxPlus.ClassIds.Twist)
mod2.ParameterBlock.angle.Value = 45.0
node.AddModifier(mod2)

実行すると・・・

追加したのは5行目で高さのセグメントを3にして、さらに7,8,9行目をコピーして、10,11,12行にして、ClassIds.TwistにしてTwistモディファイアを追加しています。

Helpで調べると「angle」で角度を決めることが判りました。

いかがでしょうか。3dsMaxでPythonもなかなか面白くなってきましたね。

では、また来週!