ruby-processingでProcessing->Examples->3D->Imageの写経

 写経してみたw;
けど、バグってるorz*1
2次元配列の作成部分でバグっていたw;ので、修正。


case :Zoom
when :Explode
  def setup
    size 640,360,P3D
    @img = load_image "eames.jpg"
    @cellsize = 2
    
    @culumns = @img.width/@cellsize
    @rows = @img.height/@cellsize
  end

  def draw
    background 0
    @culumns.times{|i|
      @rows.times{|j|
        x = i*@cellsize + @cellsize/2
        y = j*@cellsize + @cellsize/2
        loc = x + y*@img.width
        c = @img.pixels[loc]
        
        z = (mouse_x / mouse_y.to_f) *  brightness(c) - 20.0
        
        push_matrix
        translate x+200, y+100, z
        #fill red(c),green(c),blue(c),204
        fill c
        no_stroke
        rect_mode CENTER
        rect 0,0,@cellsize,@cellsize
        pop_matrix
      }
    }
  end
when :Extrusion
  def setup
    size 640,360,P3D
    extrude = load_image "ystone08.jpg"
    extrude.loadPixels
    @w = extrude.width
    @h = extrude.height
    #@rows = Array.new(@w, Array.new(@h))            #<=バグっているので修正
    @rows = Array.new(@w){|i| Array.new(@h)}
    @h.times{|y|
      @w.times{|x|
        @rows[x][y] = (brightness(extrude.get(x,y))).to_i
      }
    }
    @angle = 0.0
  end

  def draw
    background 0
    @angle += 0.005
    
    translate width/2,0,-128
    rotate_y @angle
    translate -@w/2.0,100,-128
    
    @h.times{|y|
      @w.times{|x|
        stroke @rows[x][y]
        point x,y,(-@rows[x][y])
      }
    }
  end
when :Zoom
  def setup
    size 640,360,P3D
    no_fill
    
    stroke 255
    img = load_image "ystone08.jpg"
    @w = img.width
    @h = img.height
    #@pixels = Array.new(@w, Array.new(@h))         #<=バグっているので修正
    @pixels = Array.new(@w){|i| Array.new(@h)}
    @h.times{|y|
      @w.times{|x|
        @pixels[x][y] = img.get(x,y)
      }
    }
    @nmx,@nmy = 0.0,0.0
    @res = 5
    @sval = 1.0
  end

  def draw
    background 0
    
    @nmx += ((mouse_x - @nmx)/20)
    @nmy += ((mouse_y - @nmy)/20)
    
    @sval += mouse_pressed? ? 0.005 : -0.01
    
    #constrain(value, min, max)
    #valueがminとmaxの間に収まるように強制する
    #[min..value..max]
    @sval = constrain @sval,1.0,2.5
    
    translate width/2+@nmx*@sval-100, height/2 + @nmy*@sval -200, -50
    scale @sval
    rotate_z PI/9.0 - @sval + 1.0
    rotate_x PI/@sval/8.0 - 0.125
    rotate_y @sval/8.0 - 0.125
    
    translate -width/2, -height/2, 0
    
    0.step(@h-1, @res){|y|
      0.step(@w-1, @res){|x|
        rr = red @pixels[x][y]
        gg = green @pixels[x][y]
        bb = blue @pixels[x][y]
        tt = rr+gg+bb
        stroke rr,gg,bb
        line(x,y,tt/10-20, x,y,tt/10)
      }
    }
  end
end

*1:ExtrusionとZoomが同様のバグっぽいので上手く動いてない