Quartz Composer - Conway's Game of Life - 宇宙大決戦
9月から半分Macユーザになったので、Macの開発環境も触ってみよう思い、まずは楽しそうなQuartz Composerに手を出してみた。
基本的には、Patchと呼ばれる部品をつなぎ合わせてプログラミングしていくものだが、ProgrammableなPatchも三種類(JavaScript, GLSL, Kernel Language?)用意されていて、後者二つは最近流行?のベクトル指向な言語。
以前から、GPUのシェーダ言語でライフゲームを書いて見たかったので、テーマはライフゲームに決定。 KOF2007の懇親会で、小波先生、池上さんとライフゲームの話題で盛り上がったのも理由。
メインとなるKernel Languageのコードは以下。
画像のある一点の色を決めるコードを書けば、あとは勝手にベクトル化してくれているはず。
(たぶん、ベクトル化のために)普通のif文は使えないので、compare関数を使う。
kernel __color conway(sampler image)
{
float self = sample(image, samplerCoord(image)).r;
float lives;
lives = sample(image, samplerCoord(image) + vec2( 1, -1)).r;
lives += sample(image, samplerCoord(image) + vec2( 0, -1)).r;
lives += sample(image, samplerCoord(image) + vec2(-1, -1)).r;
lives += sample(image, samplerCoord(image) + vec2( 1, 0)).r;
lives += sample(image, samplerCoord(image) + vec2(-1, 0)).r;
lives += sample(image, samplerCoord(image) + vec2( 1, 1)).r;
lives += sample(image, samplerCoord(image) + vec2( 0, 1)).r;
lives += sample(image, samplerCoord(image) + vec2(-1, 1)).r;
const float dead = 0.0;
const float alive = 1.0;
float compare4 = compare(lives - 3.5, alive, dead);
float r = compare(
self - 0.5,
compare(lives - 2.5, dead, compare4),
compare(lives - 1.5, dead, compare4)
);
return __color(r, r, r, 1);
}それから、1step前の状態が必要なので、JavaScriptで以下のようなPatchも作成。 フレームをまたがって値を保持するには、ObjectかMathのプロパティに値を入れておけばよい。
function (__image output) main (__image input, __image initial, __number dummy) {
var result = {output: Object.prev || initial};
Object.prev = input;
return result;
}後は適当にPatchを組み合わせていけば、完成。
Apple Remoteでコントロールしたり、スクリーンセーバにしたり、1フレームで3step進めたりしなければ、もうちょっと単純になる。

ライフゲームのルールについてはWikipediaを参照していただくとして、自分の周囲9マスから次の状態を決定する、という非常にローカルで単純なルールから、あまりに複雑で大域的な発展が繰り広げられる様は、宇宙や生命といった壮大なものを連想させる。

ライフゲーマー必見!ものすごい勢いで宇宙を浸食するmaxと、MITが開発したグライダーガンの、宇宙を賭けた闘い。
参考:
Sun, 18 Nov 2007 04:17 カテゴリ tech, life, image processing
タグ lifegame
2 comments »
-
By りんぼく 26/10/2009 at 16h43
-
By nanki 27/10/2009 at 20h33
!!! これはきれいですね。
私もQuartz Composerを少々かじっており、興味深く拝見させていただきました。 そこで上のコードを参考に私も作ってみました。 そのムービーを下記にアップしてあります。 よろしかったらご覧ください。
http://www.vimeo.com/7260509