2018年12月06日

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

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

アンチエイリアスのサンプリングポイントとして1ピクセルの四隅を取ってみたんだけどよく考えてみるとこれは極端すぎたようで、結果がイマイチな感じだ。

AA無しでサンプリングしていたのはピクセルの中心点なんだからそれを4分割してサンプリングするならそれらの中心点に取るのが自然な考え方だったな。

fig1

そこでピクセル座標のオフセットを±0.25に変更した。

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: (
      return BrushColor
    )
    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
      )
    )
  )
),

これがAA無しの結果で、

fig2

これが変更前のAA結果。

fig3

そしてこれが修正後の結果。より円に近くなっているのがわかる。

fig4

続きはまた次回。

maxまとめページ



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

この記事にコメントする

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

Archives