2019年06月20日

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

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

やっと不連続UVをカバーできるようになったので、改めてアンチエイリアス問題に取り組みたい。

とりあえず前回のプログラムをちょっと修正してアンチエイリアスをやってみた。太字部分が修正箇所。

struct objectPaint (
  public
    maxFaceRadius = 40.0,
    brushsize=10,
    BrushShape = 2,
    BrushColor = black,
    BlankColor = white,
    theObj,
    brushtransform,
    bitmapX = 512,
    bitmapY = 512,
    temp_bitmap_filename = (getDir #preview +"/microPaint_temp2.tga"),
    theBitmap,
    checkBitmap,
    overpaint = 0.01,
  fn run = (
    pt.BrushShape = ParticlePaint_Rollout.BrushShape.state
    pt.brushsize = ParticlePaint_Rollout.BrushSize.value
    pt.BrushColor = ParticlePaint_Rollout.inkColor.color 
    pt.BlankColor =  ParticlePaint_Rollout.blankColor.color 
    pt.init()
    pstart = ParticlePaint_Rollout.StartFrame.value
    pstop =ParticlePaint_Rollout.StopFrame.value
   fn pcol px py mb2w ovr = (
      case BrushShape of (
        1: (

                   :

        )
        2: (
          gr = 0.0
          if ovr then (
            return BrushColor
          ) else (
            p1 = [px-0.25,py-0.25,0]
            p2 = [px-0.25,py+0.25,0]
            p3 = [px+0.25,py-0.25,0]
            p4 = [px+0.25,py+0.25,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]
            if bcol == undefined then bcol = BlankColor
            return ((BrushColor * gr) + (bcol * (1.0 - gr)))
          )
        )

はみ出しぶんのペイントする面「bareas」をペイントする面「maps」の後ろに追加して1つのリストにまとめた。これで以前に作ったアンチエイリアスのプログラムで処理が出来るはず。

    fn crossFaceMaps theMesh theChannel mt2b =
    (
      invBrushTransform = inverse( brushtransform)
      crossfaces = selectcrossface()
      maps = #()
      bareas = #()

            :

          for v in vlist do (
            mp = v * mw2b
            append maplist mp
          )

          append maps #(maplist , mb2w)
        )
        
        maps = maps + bareas
      )
    ),

そこで「paintFace()」に渡すマップリストは「maps」だけで良くなったので「bareas」の方は削除した。

    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]
      )

    ),

「pcol()」の最後のパラメータにfalseを与えるとアンチエイリアスがONになる。そのうちパネルにコントロールで追加しないとね。

    fn drawline x1 x2 y mb2w = (
      if y<1 then y += bitmapY
      if y> bitmapY then y -= bitmapY
      for x = x1 to x2 do (
        if not checkBitmap [x+y*bitmapX] do(
          pcolor = pcol x y mb2w false
          if pcolor != undefined then (
            setPixels theBitmap  [x,y] #(pcolor)
            checkBitmap [x+y*bitmapX] = true
          )
        )
      )
    ),

これがAAなしのもので、

fig 1

こっちがAAをONにしたもの。256X256のビットマップにペイント。

fig 3

ビットマップの一部を拡大してみたもの。こっちがAA無しで、

fig 2

こっちがAAをONにしたもの。

fig 4

とりあえず動きはしたけどたった1枚の画像なのに処理時間が異常に増えて止まってんじゃないかと何度か疑うほどになってしまったのでもっと効率化しないとダメだな。

続きはまた次回。

maxまとめページ



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

この記事にコメントする

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

Archives