作品解説
この作品は、当初は都市を生成できないだろうか、ということで始めたものでした。 さすがに都市は無理だろう…ということで、 まずは建物を作る習作としてコーディングを始めました。
しかし、作ってみると結構大変で、特に 3D 関連の処理で 文字数を大幅に消費してしまいました。
translate とか関数名長すぎ。
pushMatrix や popMatrix 関数は、後で push や pop 関数で 代用できる(もちろん、このプログラムでは、という意味で)と教えてもらいましたが、 それでも未だに 1 ツィートに収めることができていない状況です。
80 文字程オーバーで、つぶやきProcessing できず。
— Koji Saito (@KojiSaito) March 24, 2020
描画部分メイン↓
T=translate;R=random;P=pushMatrix;Q=popMatrix
z=R(10)-20;w=R(50)+10;t=R(200)+50;x=int(R(10)-5)*50;fill(-1);stroke(0);P();T(x,500-t/2,z);box(w,t,R(50)+10);Q();fill(200);noStroke();P();T(x,500,z-t/2);box(w,0,t);Q() pic.twitter.com/gleTSKURxz
ソースコードおよびその解説
この作品の全ソースコードは以下の通りです:
def setup():size(500,500,P3D)
T=translate
R=random
def draw():
background(-9)
randomSeed(0)
T(250,0,-200)
rotateY(frameCount*.01)
for i in [0]*50:
x=int(R(9)-5)*50
z=R(9)-20
w=R(50)+9
t=R(200)+50 # 建物の高さ
# 建物部分の描画
push()
T(x,500-t/2,z)
box(w,t,R(50)+9)
pop()
# 影の描画
push()
fill(200)
noStroke()
T(x,500,z-t/2)
box(w,0,t)
pop()
このプログラムでは、randomSeed 関数を使って乱数の種を 0 としてから 描画処理を行っています。 そのため、draw 関数内での乱数、 つまり関数 R は、ある意味配列のように機能することとなります。
i 番目の建物の x,z,w,t はいつも同じ値となります。 それぞれが建物の x 座標=横の位置、 z が奥行き方向の位置、 w は建物の厚さ、 最後の t が建物の高さとなります。
建物の影は、box(w,0,t) として、 高さの無い単なる長方形により描かれています。