2017年08月03日

ビットマップペイントツールのチュートリアルをやってみた その75 3dsmax 2017

引き続きMAXScriptマニュアルに載っている「チュートリアル-ビットマップペイントツールを9つの簡単なステップで作成する」 の続きを考えて見たい。

前回作った構造体には外から見える変数とファンクションが全部で15ある。

  • maxFaceRadius:ペイントする面の最大外接円半径
  • brushsize:ペイントブラシの大きさ
  • BrushShape:ペイントブラシの種類(1:円、2:四角)
  • BrushColor:ペイントブラシの色
  • theObj:ペイントするメッシュオブジェクト
  • brushtransform:ペイントブラシの変換マトリクス
  • bitmapX:テクスチャビットマップのXサイズ
  • bitmapY:テクスチャビットマップのYサイズ
  • temp_bitmap_filename:テクスチャブッとマップのファイル名
  • theBitmap:ビットマップ
  • fn init():初期化
  • fn doPaint():ペイント
  • fn redraw():表示の更新
  • fn saveimage():ビットマップの保存
  • fn close():終了処理

これは元のプログラムを暫定的に切り分けて構造体化しただけなので、まだ詰める必要がある。特に「init()」は前提になるパラメータがあるので、それらは引数にしといた方がいいかな。「init()」は下のコードで、ペイント対象のオブジェクトである「theObj」のマテリアルとして「Standard」を生成して割り当てて、ディフューズマップにビットマップテクスチャを割り当てている。この辺は元になったチュートリアルのコードのままなんだけど、ペイント自体はビットマップに対して行っているから多フレームのテクスチャアニメーションを生成する時なんかはいちいち割り当てないでもいいかも知れない。

それから「ヴォリューム選択」と「編集可能メッシュ化」のモディファイヤを追加している。これらのモディファイヤは処理が終わったら取り除かなくちゃならないので、その処理が「close()」メソッド内に記述されている。そしてUVマップ座標からビットマップ座標に変換するマトリクスを「mt2b」として定義している。この変数は構造体内のプライベート変数になっている。

 fn init = (
   theBitmap = bitmap bitmapX bitmapY color:white filename:temp_bitmap_filename
   if theObj.material == undefined do theObj.material = Standard()
   if theObj.material.diffusemap == undefined do
     theObj.material.diffusemap = bitmapTexture filename:temp_bitmap_filename
   showTextureMap theObj.material true
      
   if theObj.modifiers[#Vol__Select] == undefined do (
     addModifier theObj (volumeselect())
   )
   if (classof theObj) != Editable_mesh do (
     addModifier theObj  (Turn_to_Mesh ())
   )

   mt2b=(matrix3 [bitmapX,0,0] [0,-bitmapY,0] [0,bitmapY,1] [0,0,0])
 ),

構造体を使った例では「bitmapX」「bitmapY」とか「 temp_bitmap_filename」とかをデフォルト値で済ませてしまっているので定義してないけど、「theObj」はデフォルト値を指定していないので、「init()」を呼び出す前にセットしないとエラーになるので、構造体を生成してから「init()」を呼び出すまでにペイント対象である「$GeoSphere001」をセットしている。

pt = objectPaint()
brush = $Box001
pt.theObj =  $GeoSphere001
pt.BrushShape = 1
pt.brushsize = 10
pt.BrushColor = red
pt.init()
sliderTime = 0f
for i = 0 to 15 do (
  sliderTime = i
  pt.brushtransform = brush.transform
  pt.doPaint()
)
pt.saveimage()
pt.close()

また、「doPaint()」を呼び出す前にペイントするブラシについてもセットしておかないとちゃんとペイントされない。特に重要なのは「brushtransform」でブラシの位置と向きを指定する事だ。上のプログラムでは「$Box001」がアニメーションしているので、「sliderTime」でタイムスライダを1フレームずつ動かして、その時の「$Box001」の変換マトリクスをこれにコピーして「doPaint()」する事でそのフレームの時のブラシの位置でペイントするようになっている。

ペイントが終わったら「saveimage()」でビットマップを保存してやると、同時にマテリアルのビットマップも更新されて表示が更新される。

最後に「close()」で「init()」で追加したモディファイヤを除去して処理の終了だ。

ペイントを1フレーム間隔で行うとブラシの速度によってはとびとびのペイントになってしまう場合は、タイムスライダーの単位を秒単位とかに切り替えて刻みを細かくとってやったりなんかも出来るね。

次回はこの構造体を使っていろいろやってみたい。

続きはまた次回。

定期更新は8月20日までお休みします。

maxまとめページ



take_z_ultima at 11:30│Comments(0)3ds Max | CG

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 

Archives