ようやく納得できる作品に
1 月弱、つぶやき Processing を続けているうちに、 抽象的な表現よりも、具体的なものを描きたい、という気持ちが強くなってきました。 空や雲の表現などもそのひとつです。
Processing に限らず、ジェネラティブアートでは抽象的な作品をよく目にします。 音楽再生ソフトやスクリーンセーバーで表示されることも多いかと思います。
つぶやき Processing 的には、抽象的な表現の方が文字数が少なくて済む印象があります。 あえて難易度の高いものに挑戦するというのも面白く、 また、出来上がった作品の善し悪しについても、 多くの人が判断できます。
この作品を作った当時は、このように明確な考えというのはまだ無かったと想いますが、 それでも具体的な表現を、ということで試行錯誤していました。
天体であれば、生成的でもあるし、かつ、具体的な表現になるのでは?と思い、 とりかかったのがきっかけです(フラクタルノイズで惑星を描く、なんていうのは ジェネラティブアートの定番ですし)。
試行錯誤を経て、自分でも満足できる作品として、つぶやけたのがこの作品でした。
#つぶやきProcessing 銀河(Galaxy)
— Koji Saito (@KojiSaito) March 4, 2020
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 pic.twitter.com/CTvk47GPpy
完成版のソースコード(清書版)
完成版は、マルチステートメントにすることで文字数を圧縮してますので、 改行を補って見やすくしたソースコードを以下に示します:
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)