WORK 94
どける
People walk from left to right. Each carries one grey weight, and the weight keeps growing. At first it sits in front of them, and while it is in front it slows them by its size. When it grows past a certain point, the walker gives one small flash — says it — and the weight swings round to their side and walks on with them. It does not vanish. It does not stop growing. Only it is no longer in front. Weights at the side press on the next lane, and the others step out of the way a little; the narrow line slowly opens into a wide one. After a day, it starts again in the morning. From one sentence in Miyamoto Yuriko's 'Men... are tired' (1922): the tired and the failing are never forgotten, and yet they do not stand at the head of the mind and block the way.
左から右へ、人が歩いていく。ひとりにひとつ、灰色の重さを持っていて、重さはだんだん増える。はじめ重さは前にあって、前にある間は、その大きさぶん歩みが遅くなる。ある重さまで来ると、その人は一度だけ小さく光る——言う。すると重さは横へ回って、そのまま一緒に歩く。消えない。増えるのも止まらない。ただ、前にはいない。横に回った重さはとなりの道を押して、まわりの人は少しよける。細かった列は、ゆっくり太い帯になる。一日ぶん歩いたら、次の朝にやり直す。宮本百合子『男…は疲れている』(1922)の一文から——つかれたもの、おとろえたものの存在が決してわすれられることはなくとも、意識の、真っ先に立って行く手を遮りはしない。
// #94 どける / Stepping Aside
// 消さずに、前から横へ。
export default function sketch(p) {
const W = 720, H = 720;
const DAY = 3600;
const N = 48;
let walkers = [];
let rings = [];
let trail;
let t = 0;
function reset() {
walkers = [];
rings = [];
for (let i = 0; i < N; i++) {
walkers.push({
x: p.random(-40, 160),
y: H / 2 + p.random(-26, 26),
v0: p.random(0.2, 0.26),
f: p.random(0, 0.05),
r: p.random(0.00012, 0.00034),
th: p.random(0.22, 0.55),
said: false,
side: p.random() < 0.5 ? -1 : 1,
a: 0,
});
}
trail.clear();
t = 0;
}
function weightPos(w) {
const rad = 3 + 16 * w.f;
const d = 5 + rad;
return { x: w.x + Math.cos(w.a) * d, y: w.y + Math.sin(w.a) * d, rad };
}
p.setup = () => {
p.createCanvas(W, H);
trail = p.createGraphics(W, H);
p.noStroke();
reset();
};
p.draw = () => {
p.background(18, 18, 22);
for (const w of walkers) {
w.f = Math.min(1, w.f + w.r);
if (!w.said && w.f > w.th) {
w.said = true;
rings.push({ x: w.x, y: w.y, age: 0 });
}
const target = w.said ? w.side * Math.PI / 2 : 0;
w.a += (target - w.a) * 0.03;
const ahead = Math.max(0, Math.cos(w.a));
const v = w.v0 * (1 - 0.8 * w.f * ahead) * (1 - 0.08 * w.f);
if (w.x < W - 56) w.x += v;
}
// 横にいる重さは、となりを押す
for (const w of walkers) {
let push = 0;
for (const o of walkers) {
if (o === w) continue;
const wp = weightPos(o);
const dx = w.x - wp.x, dy = w.y - wp.y;
const reach = wp.rad + 7;
if (Math.abs(dx) < reach && Math.abs(dy) < reach) {
push += (dy === 0 ? (Math.random() - 0.5) : Math.sign(dy)) * 0.12;
}
const ex = w.x - o.x, ey = w.y - o.y;
if (Math.abs(ex) < 5 && Math.abs(ey) < 5) push += (ey === 0 ? 0 : Math.sign(ey)) * 0.04;
}
w.y = Math.max(30, Math.min(H - 30, w.y + push));
}
trail.noStroke();
for (const w of walkers) {
trail.fill(230, 220, 200, 10);
trail.circle(w.x, w.y, 1.6);
}
p.image(trail, 0, 0);
for (const w of walkers) {
const wp = weightPos(w);
p.fill(120, 122, 132, 150);
p.circle(wp.x, wp.y, wp.rad * 2);
}
for (const w of walkers) {
p.fill(245, 236, 215, w.said ? 235 : 170);
p.circle(w.x, w.y, 3.2);
}
for (const r of rings) {
r.age++;
const k = r.age / 50;
p.noFill();
p.stroke(255, 236, 190, 200 * (1 - k));
p.strokeWeight(1);
p.circle(r.x, r.y, 4 + 30 * k);
p.noStroke();
}
rings = rings.filter(r => r.age < 50);
t++;
if (t >= DAY) reset();
};
}