





コードと絵をかきながらつらつらと考えていたあれこれ雑記。
このアルゴリズムは2021年2月にprocessingのコミュニテイにはじめて参加したすぐ後に、現在のコンセプト「プログラミングを画材にする」と銘打って制作をはじめたとき、1番はじめに作ったものだ。
コミュニティに参加したきっかけはちょうど大学を卒業したタイミングでprocessing community japanがオンラインイベントを開催していたからだ。大学2年の初夏にプログラミングを大学の図書館の本で独学ではじめて卒業までずっと黙々と1人でコードを書いていた。卒業するのでせっかくならsnsで同じツールを使う人たちと情報交換がしてみたくなった。タイミング良くイベントが開催された。大学の専攻は全く関係のない別の分野であったし周りにプログラミングをしている人は誰もいなかったので本当に長いこと1人とパソコン1台とで孤立した世界に籠っていた。このイベントで行われたワークショップで「ランダム性を利用してモチーフの色や大きさの比率のパターンを大量に生成し、アイデアを得るガチャを作る」というのを聴いて自分でもやってみようと思ったのだ。
まず生成するモチーフを決めるところから。
何にするか考えた時に、はじめの一歩なので容易に取り組めるものにしたいと思った。最初に大変なものを作ると二回目から辛くなる。そこで、
・デフォルトで用意されている図形の関数のみで作れるもの
・たくさんあることでモチーフとして成立するもの
・ある程度ランダム性を必要とするもの
本棚しか思いつかなかった。
本と棚ならProcessingにあらかじめある直方体を描写するbox()関数だけを使って作れる。必要なのは直方体の3辺の長さと位置座標の計算だけ。
この作品は2つのコードからできている。1つは本を床に平積みに重ねて置いたもの。もう一つはそれを90°回転して本を直立させて棚に詰めたもの。
本棚のコードの大雑把な骨組みはこう
Shelf bookshelf;
void setup(){
bookshelf = new Shelf(,,,);
}
void draw(){
bookshelf.display();
}
//棚
class Shelf{
Books[] books;
Shelf(float w,float h,float d,float num){//横幅、高さ、奥行き、棚の数
books = new Books[num];
for(int i=0;i<num;i++){
books[i] = new Books(,,,);
}
}
void display(){
box();//天板⭐︎
box();//底板⭐︎
box();//右板⭐︎
box();//左板⭐︎
box();//背板⭐︎
box();//中の棚板*num個⭐︎
for(int i=0;i<books.length;i++){
books[i].display();
}
}
}
//積み上げた本
class Books{
Books(float w,float h,float d,float num){//本一冊の横幅、高さ、奥行きの最大値、積み上げる冊数
}
void display(){
box();//表表紙⭐︎
box();//中綴じ⭐︎
box();//裏表紙⭐︎
box();//背表紙⭐︎
}
}
位置座標をいろいろ計算しているところは長くなるのでここでは省略。
描写に使っている図形関数はbox()一種類だけ(⭐︎マークがついているところ)。ほとんどfor文だけでなんやかんやしているだけの超絶シンプル、自分の入門用に単純な構造のアルゴリズムとして作った。ちなみにonly box()シリーズは今の所あと二つある。
このコードを書いた当時、コードは出力結果(レンダリング画像)を得るための手段で過程であった。だが長く続けて別の価値を感じている。これは最近のクリエイティブコーディング界隈の動向に触れてアルゴリズムとは、について考える機会が度々あったからだ。
このBooksクラスについて解説すると四つの直方体で作られた本を繰り返しで上にどんどん積み上げていくだけである。processingのxz軸面を地面としたとき、横向きに床に置いた本の上に次の本をのせていく。y軸が高さ。最初は作りやすさから選んだモチーフだったが今になって思い返すとこれは私の毎日の行動の習慣そのままなのである。子供の頃からそれなりに本を読むのが好きだった。図書館や本屋で知らない分類の本棚にいき表紙のタイトルを眺めて歩くのはなにより楽しい。一人暮らしで引っ越す際は実家の押し入れ丸々二つ分を占領して本をつめこんで来た。今の一人暮らしの部屋の本棚もとっくに入りきらない満杯なので床に平積みである。本を買って読んでは日々一冊一冊積み上げている。自分の興味があるものしか読まないし、読んだあとは相当重要ではない限り端から忘れていくので別になにか知識も知恵も身についてはいない。たぶん毎日している行動、部屋で毎日目にしている形をそのまま作るのが座標もイメージしやすく作りやすかったのだろう。無意識は恐ろしいというやつだ。
ゲームグラフィックに心奪われてからかなり経つが、3DCGをやりたいだけならわざわざコードから書かずともblenderなりmayaなりUnrealEngineなりもっと効率的に短時間で何倍も質のいいものが作れるソフトを使えばいいのだ。そっちの方が仕事やお金にもなる。でもそれには全く心惹かれない。なぜか。そもそも3DCGに惹かれているわけではなかったみたいだからだ。なぜなら3DCGのアニメには心が動かない。私が惹かれたのは、ゲームを動かすアルゴリズムの方だった。グラフィックや操作を介して見え隠れする物理エンジン、アルゴリズム、条件分岐のルール、ランダム性、ポリゴンの構造。自然を観察している時と同じ楽しさがプログラムにはあった。コミュニティに属しながら制作を続けて得た気づきがある。プログラミングは習得したものしか読めないが、言い換えると習得したもの同士の間では立派にコードの文字だけでも情報伝達のツールとして成り立つのだ。ChatGPTなどが誰でも好きに使えるようになったので全く知らない人でもコピペしてコードの内容を詳しく解説させられるのだからこれからは習得者に限られない。アルゴリズムそのものが意味をもつ媒体になれる。静止画、一枚絵の絵画で表現が難しいのは「時間経過」と「行動の足跡(物語)」である。これを表すために動画や漫画がある。絵画はどうしても一瞬の切り取りと思われるのが大体だ。物語を絵で語るのは結構大変。それでも絵画の歴史を見ていくと、一枚の静止画で時間経過や多重視点やらを表そうと試行錯誤したものはいろいろある。コードは実行順が明確だ。実際に実行せずとも文字だけで把握できる。小説のように文字で行動や時間を表せる。これは全く予期していなかった収穫だった。はじめは実行結果ばかりを重要視してきたのに絵に足りない能力を補える副産物がついてきた。でも思えばそこに惹かれたからゲームが好きになったのだろう。たくさんのクリエイティブコーダーのコードを読んできて実際にその文字列そのものに感じるものがあった。
コードを書いているとどこまでコンピュータに任せられてどこから人の手でやらなければならないのか考えながら作業する。そうすると人間と機械の違いに過程で考えることになる。
例えば記憶と計算が人間がコンピューターに自らの脳みその機能の補助として持たせた人間と共通する人間を写した能力であるが、この記憶、つまりデータの保持について機械にはなく人間だけがもつ特殊な能力と行動に気づいたり。それは「存在しないデータを想像する」こと。
人類は謎が好き。いつも謎に飢えている。大昔に謎文明があったんじゃないかとか宇宙人がこっそり地球で暮らしてるとか、神様がこれこれこうして世界を作ったかとか悪いことをしたら死後の裁判で罰を喰らうとか、他人の気持ちを想像して気遣ったり逆に勝手に妄想して空回りしたり、死んだ人間の怨念を怖がったり。
存在しないデータを想像して創造するのだ。空想、妄想、幻想、夢想。コンピューターにとっての存在しないデータが何に当たるのか上手い例えが見つからないしこの問答については最近買い漁って積み本になっているAI関連の本をこれから消化しながらゆっくり考えていこうと思っているところだ。勝手に変数を増やさないことなのか、一度消えたデータを二度と思い出さないことなのか、架空のデータを自己判断で作ることなのか、どれも違う気がする。そんなようなことを本というモチーフを生成しながら思い浮かべたり。
2025/1/7