5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GenerativeArtに触れてみたので環境構築と感想など

Last updated at Posted at 2017-06-11

g_art_1889.jpg

#はじめに
大学時代に舞台を作ったりしていたので、最近メディアアート系にちょっと興味が湧きました。
そこで、仕事終わりに1週間ほどGenerativeArtを触ってみました。

以下の本を読んだので、その紹介をします。

[普及版]ジェネラティブ・アート―Processingによる実践ガイド

下記サイトで

  • Introduction
  • Chapter1
  • Chapter6
    は無料で見ることができるようです。

##自己紹介

大阪のエンジニアで2年目になろうかといういわゆる新人です。
なので間違い、指摘等ありましたらコメントいただけると嬉しいです。

##GenerativeArtとは

厳密な定義は本を読んでいただくのが一番ですが、
ざっくり言うとプログラムから作るアート作品です。

具体的には、下記のような作品などです。

g_art_000.jpg

ボタンをポチッとするだけで毎回違った作品が生まれてくるのがすごく素敵ですね。

##Processingとは
Javaの上に作られた言語です。

なのでJavaっぽい構文で書きますが、
教育用、ノンプログラマーであるアーティスト用に開発されているため、
かなり直感的に書くことができます。

なので、Processingを使うとGenerativeArtのような作品は作りやすいみたいですが、
他の言語でももちろん作品は作れます。

#Processingのインストール

私の環境:OS X EL Captain 10.11.6
上記を前提に記載しています。

Download Processing
上記から、Ver3.3.4(2017年6月9日時点)をダウンロードしました。

ダウンロードしたら、解凍すると
Processing.appができるので、
それをアプリケーションフォルダに入れて実行するだけです。簡単でした。

私は、入力補完をして欲しかったので、下記を参考に、
Sublime Text3で実行しました。

エディタとして Sublime Text 2 を利用する

設定が完了すれば、Sublime Text3上でCtrl + Bで実行できるので楽チンです。

#本の章構成

概要
Introduction Chapter1 そもそもGenerativeArtとは何か、について記載されています。
Chapter2 Processingの導入方法、使い方についてです。
Chapter3 そもそも、『線を引く』、ということはなんなのかを再定義します。線を引くという行為の中にランダム性を導入し、作品が勝手に動き出すようになっていきます。
Chapter4 次は、線から進んで、円を描く中にもランダム性を盛り込みます。
Chapter5 線や円は2次元でしたが、奥行きを足すことで3次元空間を作り、球を描きます。その中に複雑性、ランダム性を持ち込みます。
Chapter6 オブジェクト思考(ただしクラスとインスタンスのみ)を導入し、物体同士がインタラクションすることによる複雑性を作り出していきます。
Chapter7 ライフゲーム(※)を作り、そこにVisual的な要素を追加していくことで、見てて飽きない不思議な自律性を発見できます。
Chapter8 フラクタル(※)について考えていきます。回帰的なコーディングによって、美しい自己相似を発見することができます。

(※)ライフゲーム:眺めているだけで面白い、セルオートマトンの一種です。詳しくはライフゲームの奥深さ。単純なルールでフラクタルや自己複製が起きる神秘を読んでみてください。

(※)フラクタル:葉っぱや木の枝の生え方など、部分的に見えている形が全体の形と相似になっている幾何学という学問で使われる専門用語。(説明が難しい。。。)

注意点
本に記載されているコードは、インデントが崩れていたり、強調されていない部分がさらっと書き換わっていたりするので、ご注意ください。。

#Chapter6のコードはこちら

無料部分なので、私が書いたコードを載せておきます。


// グローバル変数
int _num = 10;
Circle[] _circleArr = {};

//setup()は起動時に1回だけ呼ばれる関数です
void setup() {
    size(500, 300); //キャンバスの大きさを指定
    background(255); //背景を白紙に設定。RGBで(255, 255, 255)を指定と同じ意味になる
    smooth(); //アンチエイリアスを有効に
    strokeWeight(1); //線の太さを設定
    fill(150, 50); //塗りつぶしの設定。fill(150, 150, 150, 50)と同じ。前の3つはRGBの値で、4つ目は透明度
    drawCircles(); //_numの数だけ新しい円を作成する自作の関数
  }

//draw()は毎フレーム呼ばれる関数です
  void draw() {
    background(255); //背景を白紙に戻す
    for (int i = 0; i < _circleArr.length; ++i) {
        Circle thisCirc = _circleArr[i];
        thisCirc.updateMe();
    }
    drawCircles();
}

//mouseReleased()はマウスをクリックし、話した瞬間に呼ばれる関数です
void mouseReleased() {
    drawCircles();
    println("circle_num : "+_circleArr.length);
}

void drawCircles() {
    for (int i = 0; i < _num; ++i) {
        Circle thisCirc = new Circle();
        thisCirc.drawMe();
        _circleArr = (Circle[])append(_circleArr, thisCirc);
    }
}

//Circleクラスを定義
class Circle {
    float x, y, radius,alph;
    color linecol, fillcol;
    float xmove, ymove;
    float dis, overlap;

    //Circleクラスのコンストラクタ。new Circle()した瞬間に呼ばれます
    Circle () {
        x = random(width); //widthはキャンバスの横の大きさ。定義しなくても使える
        y = random(height); //heightはキャンバスの縦の大きさ。定義しなくても使える
        radius = random(100) + 10;
        linecol = color(random(255), random(255), random(255));
        fillcol = color(random(255), random(255), random(255));
        alph = random(255);
        xmove = random(10) -5;
        ymove = random(10) -5;

    }

    void drawMe() {
        noStroke(); //輪郭線を引かない
        fill(fillcol, alph); //塗りつぶしの設定
        ellipse(x, y, radius*2, radius*2); //x, y の位置に、直径がraduis*2の円を描く
        stroke(linecol, 150); //線の色と太さの指定
        noFill(); //塗り潰さないことを設定
        ellipse(x, y, 10, 10);
    }

    //マウスで生成した円が衝突していたら、重なっている長さを半径として円を生成
    void updateMe () {
        x += xmove;
        y += ymove;
        if (x > (width+radius)) { x = 0 - radius; }
        if (x < (0-radius)) { x = width+radius; }
        if (y > (width+radius)) { y = 0 - radius; }
        if (y < (0-radius)) { x = width+radius; }

        boolean touching = false;
        for (int i = 0; i < _circleArr.length; ++i) {
            Circle otherCirc = _circleArr[i];
            if (otherCirc != this) {
                dis = dist(x, y, otherCirc.x, otherCirc.y);
                overlap = dis - radius - otherCirc.radius;
                if (overlap < 0) {
                    touching = true;
                    float midx, midy;
                    midx = (x + otherCirc.x)/2;
                    midy = (y + otherCirc.y)/2;
                    stroke(0, 100);
                    noFill();
                    overlap *= -1;
                    ellipse(midx, midy, overlap, overlap);
                }
            }
        }
    }
}

結果はこんな感じになります。
クリックするたびに円が増えていきます。実際に動かしてみたらとても綺麗です。

#他にも作ったもの

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?