2017年02月23日

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

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

「PainterInterface」の機能はだいぶ調べたのでそろそろ「MicroPaint」プログラムに戻りたい。

下の画像がこのチュートリアルでの完成版の「MicroPaint」だ。

fig01

これを使ってビューポート上でオブジェクトの表面にペイントする事ができる。

使い方はまず「Pick Mesh」ボタンを押して、ペイントしたいオブジェクトをビューポートで選択する事から始める。

fig02

次に「Edit」メニューから「Get UV Coordinates」を選ぶと選択したメッシュのUVマップを取得して輪郭をキャンバスに謬画し、その画像をビットマップのテクスチャマップマテリアルとしてメッシュに貼り付ける。

fig03

これで準備は完了だ。

fig04

後はブラシの色やサイズを設定して「3D PAINT」ボタンを押してオブジェクトの上にカーソルを持っていって、

fig05

ストロークすると、

fig06

それにあわせてキャンバスがペイントされ、

fig07

終わるとオブジェクトのマテリアルが更新される。

fig08

さて、コードを調べてみたい。

「3D PAINT」ボタンは「checkbutton」としてこのように定義されてるのは今まで通りだ。

checkbutton paint3D "3D PAINT" width:90 height:50 highlightcolor:(color 200 200 255) pos:[bitmapX+5,180]

これがクリックされると、下のハンドラが呼び出される。

on paint3D changed state do startPainting3D()

そしてここからさらに「startPainting3D()」が呼び出される。

fn startPainting3D =
(
  if thePainterInterface.InPaintMode() or theObj == undefined then
  (
    thePainterInterface.EndPaintSession()
    paint3D.checked = false
  )
  else
  (
    paint3D.checked = true
    thePainterInterface.pointGatherEnable = TRUE
    thePainterInterface.initializeNodes 0 #(theObj)
    thePainterInterface.offMeshHitType = 2
    thePainterInterface.ScriptFunctions startStroke paintStroke endStroke cancelStroke SystemEndPaintSession
    thePainterInterface.startPaintSession()
  )
)

ここでは「InPaintMode()」でペイントセッション中かどうかを判断して、セッション中ならセッションを終了してチェックボタンをOFFの状態にする。また、ペイント対称のオブジェクトが選択されていない時も同じ処理になる。それ以外の時はいろいろ設定してからセッションを開始する。

この設定で不思議なのは「pointGatherEnable」をTRUEにしてる事と「offMeshHitType」を2にしている事だ。ポイントを収集させてるけどプログラムのどこを見ても収集したポイントを使ってる様子が無い。また、メッシュ上を塗るのにメッシュ外からのストロークが必要なのかちょっと疑問だ。0で良かったんじゃないのかな?残りの設定は「initializeNodes()」でペイント対象のオブジェクトを設定して、「ScriptFunctions()」でセッション中に呼び出されるハンドラを設定している。

続きはまた次回。

明日は更新をお休みします。

maxまとめページ



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

トラックバックURL

この記事にコメントする

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

Archives