銀河(2020.03.04)

ようやく納得できる作品に

 1 月弱、つぶやき Processing を続けているうちに、 抽象的な表現よりも、具体的なものを描きたい、という気持ちが強くなってきました。 空や雲の表現などもそのひとつです。

 Processing に限らず、ジェネラティブアートでは抽象的な作品をよく目にします。 音楽再生ソフトやスクリーンセーバーで表示されることも多いかと思います。

つぶやき Processing 的には、抽象的な表現の方が文字数が少なくて済む印象があります。 あえて難易度の高いものに挑戦するというのも面白く、 また、出来上がった作品の善し悪しについても、 多くの人が判断できます。

 この作品を作った当時は、このように明確な考えというのはまだ無かったと想いますが、 それでも具体的な表現を、ということで試行錯誤していました。

天体であれば、生成的でもあるし、かつ、具体的な表現になるのでは?と思い、 とりかかったのがきっかけです(フラクタルノイズで惑星を描く、なんていうのは ジェネラティブアートの定番ですし)。

試行錯誤を経て、自分でも満足できる作品として、つぶやけたのがこの作品でした。

完成版のソースコード(清書版)

 完成版は、マルチステートメントにすることで文字数を圧縮してますので、 改行を補って見やすくしたソースコードを以下に示します:

W=510;R=random
def setup():size(W,255);noStroke()
def draw():
 fill(0,9);rect(0,0,W,W)
 r=0
 randomSeed(0)
 filter(BLUR,2)
 for i in range(999):
    t=i*2.52-frameCount*2e-3
    x=r*cos(t)+R(30)+240
    y=.4*r*sin(t)+R(9)+140
    fill(255,255-r);circle(x,y,1)
    r+=0.2

変数 t が極座標におけるそれぞれの星の角度を表しています (半径は変数 r です)。

2.52 というのは約 144.5 度を表すラジアンです。 これだけの角度を増分しつつ r を少しずつ増やしていくと、 5 本の腕を持つ螺旋を描くことができます。

備考: 正五角形のそれぞれの頂点への中心部からの角度は 72 度づつであり、 その正五角形の頂点を一つ飛ばしに巡回していくと考えて下さい (144 = 72 × 2)。

付録 - 最初のバージョンのソースコードと creative coding に対する私の印象

 この作品も最初からこのような形ではありませんでした。 最初のものはもっと宇宙っぽいイメージで作成していました。 銀河の形ももうすこし厚みのある形でした。

 このような作品をまずは作り、それから各種のパラメータを調整しつつ、 最終的な形に仕上げていきました。

このような行為は従来であればクリエイティブコーディング(creative coding)などと 呼ばれるのでしょうが、 近年ではポエティックコンピュテーション(poetic computation)という呼び方も 現れてきています。

ニューヨークにある“詩的プログラマー”の楽園、SFPC http://boundbaw.com/world-topics/articles/4

プログラミングそのものは、何であれクリエイティブだと思うし、 ことさらメディアアートやジェネラティブアートのようなプログラミング「だけ」を 「クリエイティブ」と呼ぶことに少々疑問もあります (だって、それ以外のプログラマは「クリエイティブでない」のかい?)。

それよりも、上で紹介したリンクにあるように、 「そもそもcomputationということ自体が詩的なものなんだ。」 という言葉の方が、私にはより実態を表していると感じられて仕方がありません。

def setup():size(510,510);noStroke()
def draw():
    fill(0,10);rect(-5,-5,520,520)
    r=0
    f=frameCount*0.003
    randomSeed(0)
    filter(BLUR,2)
    for i in range(1000):
        t=i*2.52+f
        x=r*cos(t)+random(35)+240
        y=0.4*r*sin(t)+random(20)+245
        fill(255,255-r)
        circle(x,y,1)
        r+=0.2
    for i in [0]*300:
        fill(255)
        circle(random(510),random(510),1)