風呂瀬 信五

p5.jsとWebカメラ:光と動きが織りなす、鑑賞者と対話するアートの詩学

マウスやキーボードによる入力が、鑑賞者の「意図」をコードに伝える言語だとすれば、Webカメラは鑑賞者の「存在」そのものを捉える眼差しです。画面の向こう側にいる身体の微細な動き、部屋に差し込む光の変化、その場の空気の揺らぎ。そうした偶発的で生命的な要素を、どのようにしてコードの世界に招き入れ、作品との対話へと昇華させられるでしょうか。インタラクティブな表現を追求する中で、より深い身体性や偶有性を作品に与えたいと願うとき、Webカメラという「眼」の創造的な使い方が問われます。本記事では、p5.jsを用いてWebカメラの光と動きを捉え、鑑賞者との間に静かな対話を生み出すための技術と詩学を探求します。

コードと身体、そして視線の交錯

デジタルアートの多くは、スクリーンという明確な境界線の内側で完結します。私たちはそのガラスの向こう側にある世界を眺め、マウスやキーボードという定められたプロトコルを通じて、その世界に干渉します。しかし、Webカメラを作品に組み込むことは、その境界線を曖昧にする行為に他なりません。カメラが捉えるのは、コードが生成した架空の風景ではなく、鑑賞者が存在する「いま、ここ」の現実です。

このとき、鑑賞者はもはや単なる操作者ではありません。彼/彼女は作品を「見る者」であると同時に、作品から「見られる者」となり、その身体そのものがアートの一部を構成する素材となります。この視線の交錯こそが、インタラクティブアートに予期せぬ深みをもたらします。鑑賞者の無意識の身じろぎや、ふとした表情の変化が、作品に予測不可能な揺らぎを与えるのです。それは、アルゴリズムだけでは決して生み出せない、一度きりの生命の痕跡と言えるでしょう。

p5.jsでWebカメラを扱う基本:光を捉える最初のステップ

p5.jsは、こうした現実世界との接続を驚くほどシンプルに実現してくれます。Webカメラからの映像入力を受け取るために必要なコードは、ほんの数行です。中心となるのは createCapture() という関数で、これによりカメラからの映像ストリームをp5.jsオブジェクトとして扱うことができます。

まずは、Webカメラの映像をキャンバスに表示する基本的なスケッチを見てみましょう。

let capture;

function setup() {
  createCanvas(640, 480);
  // Webカメラからの入力を開始
  capture = createCapture(VIDEO);
  capture.size(320, 240);
  // 元のDOM要素は非表示にする
  capture.hide();
}

function draw() {
  background(51);
  // キャプチャした映像をキャンバスに描画
  image(capture, 0, 0, 640, 480);
}

このコードを実行すると、ブラウザがカメラへのアクセス許可を求めます。許可すると、capture 変数に映像データが格納され、draw() ループの中で image() 関数によって毎フレームキャンバスに描画されます。ここで重要なのは capture.hide() です。createCapture() はHTMLの <video> 要素をページ上に生成するため、これを呼び出さないとキャンバスとは別にカメラ映像が表示されてしまいます。

鑑賞者がより直感的に操作できるよう、映像を左右反転させて鏡のように見せる工夫も有効です。これは translate()scale() を使って簡単に実装できます。

// draw() 関数の内部
// キャンバスの原点を右上に移動
translate(width, 0);
// 水平方向を反転
scale(-1, 1);
image(capture, 0, 0, width, height);

このわずかなコードが、鑑賞者と作品世界とを繋ぐ最初の扉を開きます。しかし、本当の対話は、この映像を単に表示するのではなく、データとして解釈し始めたときにこそ始まるのです。

ピクセルデータの詩学:映像をコードの「眼」で解釈する

Webカメラが捉えた映像は、単なる一枚の絵ではありません。それは、光の強度と色相が織りなす膨大な数値データ、すなわちピクセルの集合体です。p5.jsの loadPixels() 関数は、この数値の海へと私たちを導いてくれます。一度ピクセルデータにアクセスすれば、私たちは映像をコードの「眼」で再解釈し、全く新しい視覚表現を創造できます。

capture オブジェクトに対して loadPixels() を実行すると、その瞬間の映像の全ピクセル情報が capture.pixels という一次元配列に格納されます。この配列には、各ピクセルのR, G, B, A (赤, 緑, 青, 透明度) の値が順番に並んでいます。この構造を理解すれば、映像を自在に分解し、再構築することが可能です。

例えば、映像を輝度に基づいた円の集合体として再構成してみましょう。これは、写実的な表現から離れ、光そのものを描く試みです。

function draw() {
  background(0);
  capture.loadPixels();

  const stepSize = 10;
  for (let y = 0; y < capture.height; y += stepSize) {
    for (let x = 0; x < capture.width; x += stepSize) {
      const index = (x + y * capture.width) * 4;
      
      const r = capture.pixels[index];
      const g = capture.pixels[index + 1];
      const b = capture.pixels[index + 2];

      // 輝度を計算
      const brightness = (r + g + b) / 3;
      
      const diameter = map(brightness, 0, 255, 0, stepSize * 1.5);
      
      noStroke();
      fill(r, g, b);
      circle(x, y, diameter);
    }
  }
}

このスケッチでは、映像を10ピクセルごとのグリッドに分割し、各点の輝度を計算しています。そして、輝度が高いほど大きな円を描画することで、元の映像の光の分布を抽象的なパターンへと変換しています。これはもはや単なる映像の複製ではなく、コードによる光の「翻訳」です。このようにピクセルデータを操作することは、クリエイティブコーディングの核心であり、映像に潜む詩学を掘り起こす行為なのです。

動きを感知し、生命を吹き込む:動的なインタラクションの創造

ピクセルデータを空間的に解釈するだけでなく、時間的な変化を捉えることで、作品は鑑賞者の「動き」に反応するようになります。これにより、より直接的な身体表現をインタラクションに取り込むことができます。その最も基本的な手法の一つが「フレーム差分法」です。

この手法の原理は非常にシンプルです。現在のフレームのピクセル情報と、一つ前のフレームのピクセル情報を比較し、その差分が大きい場所を「動きがあった場所」として検出します。完全な実装には前のフレームのピクセル配列を保持する変数が必要になりますが、考え方の本質は「変化の検出」にあります。

例えば、各ピクセルの輝度を比較し、その差が一定の閾値を超えた場合にのみ、そのピクセルを描画するという処理を考えてみましょう。すると、静止している部分は描かれず、動いている部分の輪郭だけが残像のように浮かび上がる、といった表現が可能になります。

さらに、動きが検出された座標にパーティクルを発生させたり、その場所の音を鳴らしたりすることで、鑑賞者の身体的なアクションが直接、作品の世界に変化を引き起こすという体験を生み出せます。鑑賞者が手を振ると、その軌跡から光の粒子が生まれ、空間に散っていく。あるいは、鑑賞者が画面に近づくと、その存在を感知して音楽のテンポが速まる。こうしたインタラクションは、鑑賞者に「自分の存在がこの世界に影響を与えている」という強い感覚を与え、作品への深い没入を促します。

表現の可能性を広げる:Webカメラとの対話が生み出すアート

これまで見てきた基本技術を組み合わせ、発展させることで、表現の可能性は無限に広がります。Webカメラは、単なる入力装置から、作品と鑑賞者が対話するための媒介者、すなわちメディアアートにおける重要なインターフェースへとその姿を変えます。

考えられる表現の方向性は多岐にわたります。

  • 身体性の拡張: 鑑賞者の身体の動きを追跡し、それを巨大な翼や光のオーラとして画面上に描き出す。鑑賞者は、デジタルな身体を手に入れたかのような感覚を体験します。
  • 現実と虚構の融合: カメラ映像に映る現実の風景の上に、アルゴリズムによって生成された生命体が浮遊し、鑑賞者の動きに反応して集まったり逃げたりする。AR (拡張現実) のような体験が生まれます。
  • 環境データの可視化: 鑑賞者の身体だけでなく、その場の環境光の変化を捉えることもできます。部屋の明るさが変わると作品の色調が変化したり、窓の外を特定の色の車が通ると特別なエフェクトが発生したりするような、アンビエント(環境的)な作品も考えられます。

これらの作品において、鑑賞者はもはや受け身の存在ではありません。彼らの存在、動き、そして彼らがいる環境そのものが、作品をリアルタイムに生成していく共同創造者となります。作品は作者の手を離れ、鑑賞者との一期一会の対話の中で、その瞬間だけの形をとるのです。

見ること、見られること、そして共に創造すること

p5.jsとWebカメラを用いて探求する道は、単に目新しいインタラクションを実装する技術の習得に留まりません。それは、コンピュータという論理の機械に、現実世界の不確かさや偶発性をいかにして受け入れさせるかという、根源的な問いへと繋がっています。

カメラという「眼」を通して、コードは初めて、予測不可能な現実の揺らぎに触れます。そして私たちは、鑑賞者としてその眼差しに応えることで、自らが作品の一部に変容していくという稀有な体験をします。「見ること」と「見られること」の境界が溶け合い、鑑賞者の身体とアルゴリズムが一体となって一つの表現を紡ぎ出す。そこに、Webカメラを用いたクリエイティブコーディングの最も深い魅力が潜んでいるのではないでしょうか。

あなたのコードという「眼」は、世界に何を見出すでしょうか。そして、その眼差しに応える鑑賞者と、どのような対話を紡ぎ出すのでしょうか。その探求の先に、まだ誰も見たことのないアートの地平が広がっているはずです。

関連記事