さて3dsmaxのPythonも3回目です。
今回もサンプルプログラムを改造して練習してみましょう。
なぜ改造するのかというと、ここにあるサンプルはちょっと高度で長いので、「基礎から始める」には厳しいからです。
ではまず下のプログラムをご覧ください。今回はマテリアルと移動、スケールの設定です。
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ユーザーの方なら判ると思いますが、「コントローラ」が関わってくるので、ややこしいので、これだけ次回に説明します。