2018年10月25日

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

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

まだまだいろいろ粗が目立つわけだけど、ビットマップの解像度を落すとその粗がかなり目立ってくる。塗り潰されるべき部分に謎の亀裂が・・・。

fig01

この亀裂周辺のポリゴンを選択してUVマップを確認してみると、

fig02

不連続UVエッジの上側の矢印の部分ははみ出し塗りがされているのに下側の部分ははみ出し塗りがなされていない。これが亀裂の原因のようだ。

fig03

そこでこの多角形の部分について「paintFace()」に渡された「vface」を確認してみると、3つ目の値が全て0で、全てのエッジが連続UVエッジになってしまっている。これでははみ出し塗りはしないわけだ。
fig04

そこでさらに遡って「paintFace()」を呼び出している「doPaint()」でこの面に該当する「map」データを抽出してみた。

fn doPaint = (
  local theMesh = snapshotAsMesh theObj
  local theChannel = 1
  local maps = #()
  crossFaceMaps &maps theMesh theChannel mt2b
  checkBitmap = #{}
  edgecheck = #{}
  edgeBitmap = bitmap bitmapX bitmapY color:white

  for map in maps do (
    vface = #()
    bbp = undefined
    for i = 1 to map[1].count do (
      p = map[1][i]
      bp = [p.x * bitmapx,bitmapy - p.y * bitmapy,int(map[3][i])]
      if (bbp == undefined ) or ((bp[1]-bbp[1])^2 + (bp[2]-bbp[2])^2) >= 1 then append vface bp
      bbp = bp
    )
    
    dse = (vface[1].x - vface[vface.count].x)^2 + (vface[1].y - vface[vface.count].y)^2
    if dse < 1.0 then deleteItem vface vface.count
    if vface.count >2 then paintFace vface map[2] 
  )
),

これがそのデータ。これを見るとこの多角形は4つの頂点で構成されていて、4つ目の点と最初の点を結ぶエッジが不連続UVエッジになっている。それらの座標値は[0.595691,0.74008]-[0.616064,0.746651]だ。しかしその前のエッジが[0.616976,0.743821,1]-[0.616064,0.746651]でほぼ長さが0のエッジだ。「doPaint()」ではエッジの長さが0の時は頂点を追加しなかったり除去したりしているので、どうやらこのあたりが元凶のようだ。

#([0.595691,0.74008,1], [0.606716,0.728838,1], [0.616976,0.743821,1], [0.616064,0.746651,1])
(matrix3 [0.26302,0.359304,-0.0766335] [0.114066,-0.198268,-0.237607] [-37.0834,-47.7961,58.5569] [0,0,0])
#(false, false, false, true)

続きはまた次回。

maxまとめページ



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

この記事にコメントする

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

Archives