2019年01月10日

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

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

とりあえず前回作ったファンクションを組み込んでみた。ブラシタイプ「BOX」は縁だけアンチエイリアスかければいいんだろうけどとりあえず全部かかってる。

fn inoutMesh p = ( 
  pin = false
  for i = 1 to maps.count while not pin do (
    v = #()
    append v ( maps[i][1][1] - p )
    append v ( maps[i][1][2] - p )
    append v ( maps[i][1][3] - p )
    c = (cross v[3] v[1])[3]
    if c == 0.0 then (
      pin = true 
    ) else (
      if c < 0.0 then dr = -1 else dr = 1
      pout = false
      for j = 1 to 2 while not pin do (
        c = (cross v[j] v[j+1])[3]
        if c == 0.0 then (
          pin = true
        )
        if c < 0.0 then d = -1 else d = 1
        if dr * d < 0 then (
          pout = true
        )
      )
      if not pout then pin = true
    )
  )
  return pin
),

fn pcol px py mb2w ovr = (
  case BrushShape of (
    1: (
      gr = 0.0
      if ovr then (
        p = [px,py,1.0] * mb2w
        if distance p brushtransform.pos <= BrushSize/2 then gr = 1.0
      ) else (
        p1 = [px-0.25,py-0.25,1.0] * mb2w
        p2 = [px-0.25,py+0.25,1.0] * mb2w
        p3 = [px+0.25,py-0.25,1.0] * mb2w
        p4 = [px+0.25,py+0.25,1.0] * mb2w
        if distance p1 brushtransform.pos <= BrushSize/2 then gr += 0.25
        if distance p2 brushtransform.pos <= BrushSize/2 then gr += 0.25
        if distance p3 brushtransform.pos <= BrushSize/2 then gr += 0.25
        if distance p4 brushtransform.pos <= BrushSize/2 then gr += 0.25
      )
      if gr > 0.0 then
      (
        bcol = (getPixels theBitmap [px,py] 1)[1]
        return ((BrushColor * gr) + (bcol * (1.0 - gr)))
      ) else (
        return undefined
      )
    )
    2: (
      gr = 0.0
      if ovr then (
        return BrushColor
      ) else (
        p1 = [px-0.25,py-0.25,1.0]
        p2 = [px-0.25,py+0.25,1.0]
        p3 = [px+0.25,py-0.25,1.0]
        p4 = [px+0.25,py+0.25,1.0]
        if  inoutMesh p1 then gr += 0.25
        if  inoutMesh p2 then gr += 0.25
        if  inoutMesh p3 then gr += 0.25
        if  inoutMesh p4 then gr += 0.25
        bcol = (getPixels theBitmap [px,py] 1)[1]
        return ((BrushColor * gr) + (bcol * (1.0 - gr)))
      )
    )
    3: (
      p = [px,py,1.0] * mb2w
      bcol = (getPixels theBitmap [px,py] 1)[1]
      theFactor = (distance p brushtransform.pos) / (BrushSize / 2.0)
      if theFactor <= 1.0 then (
        theFactor = sin ( 90.0 * theFactor)
        return ((bcol * theFactor) + (BrushColor * (1.0 - theFactor))) 
      ) else (
        return undefined
      )
    )
  )
),

これがその結果。全然うまく行ってないな。

fig1

ちなみにこれがアンチエイリアスなしの場合。どうもメッシュの内外判定がうまく行ってないみたいだな。

fig2

続きはまた次回。

maxまとめページ



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

この記事にコメントする

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

Archives