有名な画面効果にグリッチエフェクトというものがあります。今回はそれを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で埋めることで、ずらして描画した際の重なりをなくしています。
今回使用したのは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関数を利用することでより連続的なノイズを作ることができるとおもいます。
今回作ったエフェクトは↓のようなものです。元の図形は緑色の正方形が連続しているものです。
ちさと@chisao_62Processingで作るグリッチエフェクト https://t.co/M9iMhtMoj2
2021/01/11 23:29:31
以下コードです。get()で取得した範囲は真っ黒のrectで埋めることで、ずらして描画した際の重なりをなくしています。
- import java.util.Random;
- PImage img;
- int[] glitch = new int[4];
- Random random = new Random();
- void setup() {
- size(1920, 1080);
- img = createImage(width, height, ARGB);
- colorMode(HSB, 360, 255, 255, 255);
- noStroke();
- }
- void draw() {
- background(0);
- fill(156, 137, 172, 255);
- for (int i=0; i<9; i++) {
- for (int j=0; j<16; j++) {
- if ((i + j) % 2 == 0) {
- rect(120 * j, 120 * i, 120, 120);
- }
- }
- }
- glitch();
- }
- void glitch() {
- if (random.nextInt(10) >= 9) {
- if (random.nextInt(2) > 0) {
- glitch[0] = random.nextInt(1080);//y
- glitch[1] = random.nextInt(60);//dx
- glitch[2] = random.nextInt(100);//dy
- glitch[3] = random.nextInt(2) * 2 + 1;//n
- } else {
- glitch[0] = 0;
- glitch[1] = 0;
- glitch[2] = 0;
- glitch[3] = 0;
- }
- }
- switch(glitch[3]) {
- case 1:
- img = get(0, glitch[0], width, glitch[2]);
- fill(0, 0, 0);
- rect(0, glitch[0], width, glitch[2]);
- image(img, 30 - glitch[1], glitch[0]);
- if (glitch[1] > 30) {
- image(img, 30 - glitch[1] + width, glitch[0]);
- } else {
- image(img, 30 - glitch[1] - width, glitch[0]);
- }
- break;
- case 3:
- img = get(0, glitch[0], width, glitch[2]);
- fill(0, 0, 0);
- rect(0, glitch[0], width, glitch[2]);
- image(img, 30 - glitch[1], glitch[0]);
- if (glitch[1] > 30) {
- image(img, 30 - glitch[1] + width, glitch[0]);
- } else {
- image(img, 30 - glitch[1] - width, glitch[0]);
- }
- img = get(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
- fill(0, 0, 0);
- rect(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
- image(img, -30 + glitch[1], glitch[0] - glitch[2] / 2);
- if (glitch[1] > 30) {
- image(img, -30 + glitch[1] + width, glitch[0] - glitch[2] / 2);
- } else {
- image(img, -30 + glitch[1] - width, glitch[0] - glitch[2] / 2);
- }
- img = get(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
- fill(0, 0, 0);
- rect(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
- image(img, -30 + glitch[1], glitch[0] + glitch[2] / 2);
- if (glitch[1] > 30) {
- image(img, -30 + glitch[1] + width, glitch[0] + glitch[2] / 2);
- } else {
- image(img, -30 + glitch[1] - width, glitch[0] + glitch[2] / 2);
- }
- break;
- case 5:
- img = get(0, glitch[0], width, glitch[2]);
- fill(0, 0, 0);
- rect(0, glitch[0], width, glitch[2]);
- image(img, 30 - glitch[1], glitch[0]);
- if (glitch[1] > 30) {
- image(img, 30 - glitch[1] + width, glitch[0]);
- } else {
- image(img, 30 - glitch[1] - width, glitch[0]);
- }
- img = get(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
- fill(0, 0, 0);
- rect(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
- image(img, -30 + glitch[1], glitch[0] - glitch[2] / 2);
- if (glitch[1] > 30) {
- image(img, -30 + glitch[1] + width, glitch[0] - glitch[2] / 2);
- } else {
- image(img, -30 + glitch[1] - width, glitch[0] - glitch[2] / 2);
- }
- img = get(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
- fill(0, 0, 0);
- rect(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
- image(img, -30 + glitch[1], glitch[0] + glitch[2] / 2);
- if (glitch[1] > 30) {
- image(img, -30 + glitch[1] + width, glitch[0] + glitch[2] / 2);
- } else {
- image(img, -30 + glitch[1] - width, glitch[0] + glitch[2] / 2);
- }
- img = get(0, glitch[0] - glitch[2], width, glitch[2]);
- fill(0, 0, 0);
- rect(0, glitch[0] - glitch[2], width, glitch[2]);
- image(img, -30 + glitch[1], glitch[0] - glitch[2]);
- if (glitch[1] > 30) {
- image(img, -30 + glitch[1] + width, glitch[0] - glitch[2]);
- } else {
- image(img, -30 + glitch[1] - width, glitch[0] - glitch[2]);
- }
- img = get(0, glitch[0] + glitch[2], width, glitch[2]);
- fill(0, 0, 0);
- rect(0, glitch[0] + glitch[2], width, glitch[2]);
- image(img, -30 + glitch[1], glitch[0] + glitch[2]);
- if (glitch[1] > 30) {
- image(img, -30 + glitch[1] + width, glitch[0] + glitch[2]);
- } else {
- image(img, -30 + glitch[1] - width, glitch[0] + glitch[2]);
- }
- break;
- }
- }