過去作に新しいアイディアを取り入れてみる

2021年7月1日木曜日

Processing 作例 静止画 中級者向け

t f B! P L
透明度の高い渦巻の例

なにか作りたいけどアイディアが出ない。

そんなときは過去に作ったものに手を加えるというのも一つの方法です。
手を加えることで毎回何かが出来るわけじゃないけど、過去に作ったときとはまた違う視点で眺めることができ、「こうすればもっと面白くなりそう」とか「ここ、こうすれば良かったんじゃん」とかいろいろ発見があって楽しかったりします。

手を加えるにあたって、最近仕入れたアイディアを過去作に取り入れてみるというのも面白いです。
今回 Amy Goodchild (@amygoodchild)さんの公開されていたブログの Curved Line Jellyfish のアイディアを過去作 「In the Curve」 に取り入れてみましたので紹介させてください。

新しいアイディアをどう取り込むか

アイディアの選び方

新しいアイディアを取り込むにあたり、そのアイディアを徹頭徹尾忠実に再現しなければいけないということはありません。
そのアイディアのエッセンスだけ、あるいは主題からは外れた端っこの部分、そのアイディアから浮かんだ別のアイディア、何でも構いません。

今回参考とさせていただいた Amy さんのブログのアイディアの要点は以下の2つ。

  1. p5.js の curve() 関数を使って円周上の点を結ぶ曲線をいい感じにするには、アンカーポイントを円周の遠くに設定するとよい
  2. 透明度の高い線を大量に描くことで、スムーズに変化する面を作れる

2番目の「スムーズな面を作れる」という方なら、多くの線で構成されたものにすぐ取り込めるなという視点でこちらのアイディアだけをいただきました。

過去作の選び方

「多くの線で構成されたもの」で「面を作れる」ようなものということで、過去作の中の 「In the Curve」 を選びました。

過去作は一覧でまとめておくと後で見返すのに便利です。
OpenProcessing を使っている人なら自分のプロフィールページに作品のサムネイルが自動で並ぶので、特に何もしなくても一覧が作られます。

私の場合、Processing の作品をブログに載せてそれを一覧代わりに。派生の作品はコードと一緒にメモ(Emacs の org-mode)にまとめています。

アイディアの取り込み方

過去作の 「In the Curve」'curveVertex()' を使って複数の閉曲線を描くというものです。その複数の閉曲線を描く際に下記3つの変化を与えており、この変化具合の違いで異なる結果が得られるという作品です。

  • 少しずつ大きさを変える
  • 少しずつ形を変える
  • 少しずつ回転させる
Processing で作った、複数の閉曲線によるアートの例
Processing で作った、複数の閉曲線によるアートの例

この基本はそのままに、Amy さんのアイディアを取り込んで下記のような変更を加えました。

  • 線の数を増やす(元の250倍ぐらい)
  • 一本一本の線を細く、透明度を上げる
細い線を大量に描いた作例

この感じだと暗いバックに明るい線のほうが似合うと思ったので、'blendMode(ADD)' で線を描画、レンダラーも 'P2D' にしてスムーズなグラデーションがかかるようにしました。



画作りを工夫する

描いたものを何も考えずにキャンバスの中央にぽんと置く、今までそんな作り方ばかりしてきました。最近、それだとデザイン的に物足りない気がしてきて、デザイン関連の本を読んで勉強しつつ、配置を変えたり作品に合う背景を模索したりするようになりました。



今回いろいろ工夫を加えて作品のバリエーションを増やしてみました。




…でも、結局「キャンバスの中央にぽんと置く」は変わってない!!! 🤣

コード例(Processing)



このようにして出来た作品 「Don't Hung Up」 のコードです。
GPL で公開します。どうぞご自由にお使いください。このコードを利用して何か作品を作ってもらえるととても嬉しいです
元となった過去作の「In the Curve」のコードはこちらにあります。


/**
 * Don't Hung Up.
 * draws gradation color swirl with a large number of lines.
 * 
 * 
 * Processing 3.5.3
 * @author @deconbatch
 * @version 0.1
 * created 0.1 2021.04.08
 */

void setup() {
  size(980, 980, P2D);
  colorMode(HSB, 360.0, 100.0, 100.0, 100.0);
  smooth();
  rectMode(CENTER);
  noLoop();
}

void draw() {

  int   rotateMax  = 15000;
  int   pointMax   = floor(random(3.0, 10.0));
  float rotateDiv  = random(0.5, 2.0) * (random(1.0) < 0.5 ? 1.0 : -1.0);
  float hueBase    = random(360.0);
  float radiusBase = width * 0.3;

  translate(width / 2.0, height / 2.0);

  // draw background
  blendMode(BLEND);
  background((hueBase + 45.0) % 360.0, 90.0, 30.0, 100.0);

  // draw swirl
  blendMode(ADD);
  noFill();
  for (int rotateCnt = 0; rotateCnt < rotateMax; ++rotateCnt) {
    float rotateRatio = map(rotateCnt, 0, rotateMax, 0.0, 1.0);
    strokeWeight((1.0 - sin(PI * rotateRatio)) * 0.5);
    stroke(
           (hueBase + 90.0 * rotateRatio) % 360.0,
           20.0 + 30.0 * (1.0 + sin(TWO_PI * 3.0 * rotateRatio)),
           30.0 * (1.0 - sin(TWO_PI * 2.0 * rotateRatio)),
           30.0 * (1.0 + sin(TWO_PI * 2.0 * rotateRatio))
           );

    pushMatrix();
    rotate(TWO_PI * rotateRatio * rotateRatio * rotateDiv);
    translate(rotateRatio * width * 0.1, 0.0);

    beginShape();
    for (int pointCnt = 0; pointCnt < pointMax; ++pointCnt) {
      float pointRatio = map(pointCnt, 0, pointMax, 0.0, 1.0);
      float noiseVal = map(noise(pointCnt * 0.2), 0.0, 1.0, 0.6, 1.4);
      float x = radiusBase * noiseVal * rotateRatio * cos(TWO_PI * pointRatio);
      float y = radiusBase * noiseVal * rotateRatio * sin(TWO_PI * pointRatio);
      vertex(x, y);
    }
    endShape(CLOSE);

    popMatrix();
  }

  // draw fancy casing
  blendMode(BLEND);
  casing();

}

void casing() {
  fill(0.0, 0.0, 100.0, 0.0);
  strokeWeight(55);
  stroke(0.0, 0.0, 30.0, 100.0);
  rect(0.0, 0.0, width, height);
  strokeWeight(50.0);
  stroke(0.0, 0.0, 100.0, 100.0);
  rect(0.0, 0.0, width, height);
}


/*
Copyright (C) 2021- deconbatch

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>
*/


QooQ