スタジオブロス TECH BLOG

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

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

さて3dsmaxのPythonも3回目です。

今回もサンプルプログラムを改造して練習してみましょう。

help.autodesk.com

なぜ改造するのかというと、ここにあるサンプルはちょっと高度で長いので、「基礎から始める」には厳しいからです。

ではまず下のプログラムをご覧ください。今回はマテリアルと移動、スケールの設定です。

import MaxPlus as mp
def solidMaterial(color):
 m = mp.Factory.CreateDefaultStdMat()
 m.Ambient = color
 m.Diffuse = color
 m.Specular = mp.Color(1, 1, 1)
 m.Shininess = 0.5
 m.ShinyStrength = 0.7
 return m
obj = mp.Factory.CreateGeomObject(mp.ClassIds.Teapot)
obj.ParameterBlock.Radius.Value = 5.0
for i in range(10):
 node = mp.Factory.CreateNode(obj)
 m = solidMaterial(mp.Color(0, i*0.1,0))
 node.Material = m
 node.Position = mp.Point3(i*5, 0,0 )
 node.Scaling = mp.Point3(i*0.1+0.1, i*0.1+0.1, i*0.1+0.1)

これを3dsmaxのmaxscriptエディタにペーストして、CTRL+Eで実行します。

すると、ティーポットが10個がだんだん大きくなりながら色が変化して並んでいます。

マテリアルエディタを見ると・・・

ちゃんと黒からだんだん緑になる10個のマテリアルが生成され、色や鏡面反射の設定も自動でできています。

では1行づつ説明しましょう。(行数はMaxScriptエディタの画面を参考に

import MaxPlus as mp

これは前回とちょっと違います。サンプルの中のあちこちに「MaxPlus」が並んでいるので、このように書くとMaxPlusをmpで省略できるのです。

ちょっと飛んで13、14行ですが、これは前回でもやったので簡単に。ティーポットを作る準備をして、大きさを5に指定しています。この段階ではティーポットはできていません。

16~19行目ですが、

for i in range(10):

 node = mp.Factory.CreateNode(obj)

 m = solidMaterial(mp.Color(0, i*0.1,0))

 node.Material = m

pythonのfor命令ですね。インデントで17~19行を10回繰り返しています。

17行は14行で決めたティーポット「obj」を「node」に代入することで新規に生成します。この命令をfor繰り返せば、オブジェクトは自動で大量に作れるのです。

さて18行目が今回のメインです。

solidMaterialという関数を呼び出して、結果をmに代入しています。引数としてmp.Color(0, i*0.1,0)を送っています。

for命令でrange(10)なので、iが0~9に増えていきますので、i*0.1は0~0.9になりますね。3つの数字はRGBの真ん中なので緑です。

3~10行がマテリアルの設定の関数でcolorを受け取ります。

def solidMaterial(color):

 m = mp.Factory.CreateDefaultStdMat()

 m.Ambient = color

 m.Diffuse = color

 m.Specular = mp.Color(1, 1, 1)

 m.Shininess = 0.5

 m.ShinyStrength = 0.7

 return m

4行で新規の標準マテリアルを作ります。

m.Ambientが「周辺光」、m.Diffuse が「拡散反射光」で、それぞれ引数の「color」を入れてます。

m.Specular = mp.Color(1, 1, 1)は「鏡面反射光」を白に設定しています。

mp.Colorに(R, G, B)を入れれば色の指定になることが判りますね。

しかし値は0~255ではなく、0~1です。

m.Shininess、m.ShinyStrengthで「鏡面反射レベル」と「光沢」を設定しています。これまた数値が0~1です。maxだと0~100ですね。

return mは設定したマテリアルの情報を「m」として返す、ということです。

for命令でこの関数を10回呼び出すので、その度に違う緑のマテリアルを作って19行に戻って、node.Material = mで作ったティーポット(node)に設定しているということです。

20,21行で位置と大きさを変えています。

node.Position = mp.Point3(i*5, 0,0 )

node.Scaling = mp.Point3(i0.1+0.1, i0.1+0.1, i*0.1+0.1)

2行ともmp.Point3(x,y,z)という変数があります。色で使ったmp.Colorと同様に3つの値を入れる時に使います。

位置はXに5づつ移動、スケールは最初が0.1でそれに0~0.9を足していますね。

これでだんだん大きくなって色も変わるプログラムになるのです。

さて、何か不足してますね。そうです「回転」です。

3dmaxユーザーの方なら判ると思いますが、「コントローラ」が関わってくるので、ややこしいので、これだけ次回に説明します。