有名な画面効果にグリッチエフェクトというものがあります。今回はそれをProcessingで描画した図形にかける方法です。

 今回使用したのはPImageという機能で、これによって画像を表示したりそれにエフェクトを足したりすることができます。今回は前回(http://blog.livedoor.jp/chisato_tofu/archives/25967168.html)の7セグマトリクスにエフェクトをかけたいため、Processingの画面をPImageで扱える形に変更する必要があります。そのために今回はget()関数を利用しています。
 get()関数はget(x,y,dx,dy)とすることで、(x,y)から(dx,dy)分の色を取得できます。今回はこれをランダムに決められた値分移動させることで、それっぽいエフェクトにしています。今回は自分の趣味でrandom関数を使用しましたが、noise関数を利用することでより連続的なノイズを作ることができるとおもいます。

 今回作ったエフェクトは↓のようなものです。元の図形は緑色の正方形が連続しているものです。

 以下コードです。get()で取得した範囲は真っ黒のrectで埋めることで、ずらして描画した際の重なりをなくしています。
  1. import java.util.Random;

  2. PImage img;
  3. int[] glitch = new int[4];
  4. Random random = new Random();


  5. void setup() {
  6.   size(1920, 1080);
  7.   img = createImage(width, height, ARGB);
  8.   colorMode(HSB, 360, 255, 255, 255);
  9.   noStroke();
  10. }

  11. void draw() {
  12.   background(0);
  13.   fill(156, 137, 172, 255);
  14.   for (int i=0; i<9; i++) {
  15.     for (int j=0; j<16; j++) {
  16.       if ((i + j) % 2 == 0) {
  17.         rect(120 * j, 120 * i, 120, 120);
  18.       }
  19.     }
  20.   }

  21.   glitch();
  22. }


  23. void glitch() {
  24.   if (random.nextInt(10) >= 9) {
  25.     if (random.nextInt(2) > 0) {
  26.       glitch[0] = random.nextInt(1080);//y
  27.       glitch[1] = random.nextInt(60);//dx
  28.       glitch[2] = random.nextInt(100);//dy
  29.       glitch[3] = random.nextInt(2) * 2 + 1;//n
  30.     } else {
  31.       glitch[0] = 0;
  32.       glitch[1] = 0;
  33.       glitch[2] = 0;
  34.       glitch[3] = 0;
  35.     }
  36.   }

  37.   switch(glitch[3]) {
  38.   case 1:
  39.     img = get(0, glitch[0], width, glitch[2]);
  40.     fill(0, 0, 0);
  41.     rect(0, glitch[0], width, glitch[2]);
  42.     image(img, 30 - glitch[1], glitch[0]);
  43.     if (glitch[1] > 30) {
  44.       image(img, 30 - glitch[1] + width, glitch[0]);
  45.     } else {
  46.       image(img, 30 - glitch[1] - width, glitch[0]);
  47.     }
  48.     break;

  49.   case 3:
  50.     img = get(0, glitch[0], width, glitch[2]);
  51.     fill(0, 0, 0);
  52.     rect(0, glitch[0], width, glitch[2]);
  53.     image(img, 30 - glitch[1], glitch[0]);
  54.     if (glitch[1] > 30) {
  55.       image(img, 30 - glitch[1] + width, glitch[0]);
  56.     } else {
  57.       image(img, 30 - glitch[1] - width, glitch[0]);
  58.     }
  59.     img = get(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
  60.     fill(0, 0, 0);
  61.     rect(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
  62.     image(img, -30 + glitch[1], glitch[0] - glitch[2] / 2);
  63.     if (glitch[1] > 30) {
  64.       image(img, -30 + glitch[1] + width, glitch[0] - glitch[2] / 2);
  65.     } else {
  66.       image(img, -30 + glitch[1] - width, glitch[0] - glitch[2] / 2);
  67.     }
  68.     img = get(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
  69.     fill(0, 0, 0);
  70.     rect(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
  71.     image(img, -30 + glitch[1], glitch[0] + glitch[2] / 2);
  72.     if (glitch[1] > 30) {
  73.       image(img, -30 + glitch[1] + width, glitch[0] + glitch[2] / 2);
  74.     } else {
  75.       image(img, -30 + glitch[1] - width, glitch[0] + glitch[2] / 2);
  76.     }
  77.     break;

  78.   case 5:
  79.     img = get(0, glitch[0], width, glitch[2]);
  80.     fill(0, 0, 0);
  81.     rect(0, glitch[0], width, glitch[2]);
  82.     image(img, 30 - glitch[1], glitch[0]);
  83.     if (glitch[1] > 30) {
  84.       image(img, 30 - glitch[1] + width, glitch[0]);
  85.     } else {
  86.       image(img, 30 - glitch[1] - width, glitch[0]);
  87.     }
  88.     img = get(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
  89.     fill(0, 0, 0);
  90.     rect(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
  91.     image(img, -30 + glitch[1], glitch[0] - glitch[2] / 2);
  92.     if (glitch[1] > 30) {
  93.       image(img, -30 + glitch[1] + width, glitch[0] - glitch[2] / 2);
  94.     } else {
  95.       image(img, -30 + glitch[1] - width, glitch[0] - glitch[2] / 2);
  96.     }
  97.     img = get(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
  98.     fill(0, 0, 0);
  99.     rect(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
  100.     image(img, -30 + glitch[1], glitch[0] + glitch[2] / 2);
  101.     if (glitch[1] > 30) {
  102.       image(img, -30 + glitch[1] + width, glitch[0] + glitch[2] / 2);
  103.     } else {
  104.       image(img, -30 + glitch[1] - width, glitch[0] + glitch[2] / 2);
  105.     }
  106.     img = get(0, glitch[0] - glitch[2], width, glitch[2]);
  107.     fill(0, 0, 0);
  108.     rect(0, glitch[0] - glitch[2], width, glitch[2]);
  109.     image(img, -30 + glitch[1], glitch[0] - glitch[2]);
  110.     if (glitch[1] > 30) {
  111.       image(img, -30 + glitch[1] + width, glitch[0] - glitch[2]);
  112.     } else {
  113.       image(img, -30 + glitch[1] - width, glitch[0] - glitch[2]);
  114.     }
  115.     img = get(0, glitch[0] + glitch[2], width, glitch[2]);
  116.     fill(0, 0, 0);
  117.     rect(0, glitch[0] + glitch[2], width, glitch[2]);
  118.     image(img, -30 + glitch[1], glitch[0] + glitch[2]);
  119.     if (glitch[1] > 30) {
  120.       image(img, -30 + glitch[1] + width, glitch[0] + glitch[2]);
  121.     } else {
  122.       image(img, -30 + glitch[1] - width, glitch[0] + glitch[2]);
  123.     }
  124.     break;
  125.   }
  126. }