2019年05月07日

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

令和元年おめでとうございます。

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

さて、GWも終わったのでそろそろ本体に作ったポリゴンを広げる仕組みを組み込んで行きたい。

そこでどこに組み込んだらいいのかを検討してみた。

パーティクルペイントのメインになるのは「doPaint()」で、ペイント対象のメッシュを「snapshotAsMesh()」で取得して、それを「crossFaceMaps()」でブラシ立方体で切り抜いてペイントするUVマップを生成してそれを「paintFace()」に渡してペイントしている。

fn doPaint = (
  local theMesh = snapshotAsMesh theObj
  local theChannel = 1
  maps = #()
  crossFaceMaps  theMesh theChannel mt2b
  checkBitmap = #{}
  for map in maps do (
    if map[1].count >2 then paintFace map[1] map[2]
  )
)

UVマップの輪郭を膨らませた形状は処理を通して変ることが無いので一度生成すればいい。そして「crossFaceMaps()」で生成したブラシ立方体でクリッピングしたUVマップのエッジと、UVマップの輪郭を膨らませて作ったエッジの対応が取れるようにしておく必要がある。

そして3Dメッシュの面をブラシ立方体でクリップして生成した多角形を座標変換を使ってUVマップに変換した直後に膨らましたエッジでその面を広げて輪郭が膨らんだUVマップをそこで生成してしまえば、「paintFace()」の段階では単純にその面を塗りつぶす事だけ考えれば済むはずだ(アンチエイリアス処理も含めて)。

「crossFaceMaps()」では3Dメッシュの面をブラシ立方体でトリミングした多角形の頂点のリストを「vlist」に取得して、それを「meshop.getBaryCoors()」でその面の重心座標に変換し、それにUVマップ上の対応する面の重心座標からビットマップ座標に変換するマトリクスをかけてビットマップ上の多角形の頂点リストを「maplist」に取得している。そして最終的にブラシ立方体内に存在する全多角形のリストと、各多角形内の点をビットマップ座標からワールド座標に変換するマトリクスをセットにし、「maps」にまとめるようになっている。

fn crossFaceMaps theMesh theChannel mt2b =
(
  invBrushTransform = inverse( brushtransform)
  crossfaces = selectcrossface()
  for faceIndex in crossfaces do (
    vlist = #()
    sufFace = getFace theMesh  faceIndex
    append vlist (getVert theMesh sufFace.x)
    append vlist (getVert theMesh sufFace.y)
    append vlist (getVert theMesh sufFace.z)
    mg2w=(matrix3 [vlist[1].x,vlist[1].y,vlist[1].z] [vlist[2].x,vlist[2].y,vlist[2].z] [vlist[3].x,vlist[3].y,vlist[3].z] [0,0,0])
    texFace = meshop.getMapFace theMesh theChannel faceIndex
    tv1= meshop.getMapVert theMesh theChannel texFace.x
    tv2= meshop.getMapVert theMesh theChannel texFace.y
    tv3= meshop.getMapVert theMesh theChannel texFace.z
    mg2t=(matrix3 [tv1.x,tv1.y,1] [tv2.x,tv2.y,1] [tv3.x,tv3.y,1] [0,0,0])
    mg2b = mg2t * mt2b
    mb2g = inverse mg2b
    mb2w = mb2g * mg2w
    clipface &vlist invBrushTransform 
    if vlist.count == 0 then continue
    maplist =  #()
    for v in vlist do (
      mp = (meshop.getBaryCoords theMesh faceIndex v) * mg2b
      append maplist mp
    )
    append maps #(maplist , mb2w)      )
),

だからビットマップ上でマップの輪郭を膨らませた多角形を生成するなら、「maplist」が生成されるタイミングで行えば良さそうだ。

続きはまた次回。

maxまとめページ



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

この記事にコメントする

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

Archives