ネクストステージ表現

Kinect v2とProcessingで始める身体追跡とリアルタイムビジュアル表現:パフォーマーのためのインタラクティブ入門

Tags: Kinect, Processing, 身体追跡, リアルタイムビジュアル, インタラクティブパフォーマンス

はじめに

デジタル技術がライブパフォーマンスの表現を大きく拡張している現代において、自身の身体表現にテクノロジーを取り入れてみたいと考えるパフォーマーの方々が増えています。しかし、具体的に何から始めれば良いのか、どのような技術が自身の表現に役立つのか、技術の壁を感じている方もいらっしゃるかもしれません。

この記事では、比較的入手しやすく、初心者でも取り組みやすい深度センサー「Kinect v2」と、ビジュアル表現に特化したプログラミング環境「Processing」を組み合わせた、身体追跡に基づくリアルタイムビジュアル表現の入門をご紹介します。特に、ダンスなどの身体表現とデジタルアートの融合に興味をお持ちの方に向けて、基本的なセットアップ方法から具体的な表現アイデア、そして学習の第一歩を踏み出すためのヒントを提供します。

Kinect v2とProcessingで何ができるのか

Kinect v2は、マイクロソフトが開発した深度センサーカメラです。人の骨格をリアルタイムに追跡したり、空間の奥行き情報を取得したりすることができます。Processingは、アーティストやデザイナー向けに開発されたプログラミング言語および開発環境で、直感的にビジュアル表現を生成・操作することに適しています。

この二つを組み合わせることで、パフォーマーの身体の動きをリアルタイムに捉え、それに連動した映像やグラフィックを生成し、舞台空間に投影したりスクリーンに表示したりすることが可能になります。

例えば、以下のような表現が考えられます。

これらの表現は、パフォーマーの身体そのものをデジタルキャンバスに変え、観客に視覚的に訴えかける新しいレイヤーをパフォーマンスに加えることにつながります。

Kinect v2とProcessingを連携させるための準備

Kinect v2とProcessingでインタラクティブなビジュアル表現を始めるために必要なものを説明します。

ハードウェア

ソフトウェア

ライブラリのインストール方法(例: Kinecting)

ProcessingのIDEを開き、「スケッチ」メニューから「ライブラリをインポート」→「ライブラリを追加...」を選択します。表示されるライブラリマネージャーの検索窓に「Kinecting」と入力し、リストに表示された「Kinecting」を選択して「インストール」ボタンをクリックします。SimpleOpenNI for Kinect2の場合も同様の手順です。

ProcessingでKinect v2のデータを扱う基本

ライブラリをインストールしたら、ProcessingでKinect v2のデータを取得する基本的なコードを見てみましょう。

骨格データ(スケルトン)の取得と描画

Kinect v2の骨格追跡機能を使うと、人の関節の位置情報をリアルタイムに取得できます。

import kinecting.*; // Kinectingライブラリをインポート

Kinecting kinect;

void setup() {
  size(640, 480); // 描画ウィンドウのサイズ設定
  kinect = new Kinecting(this); // Kinectingオブジェクトを作成
  kinect.startSkeleton(); // 骨格追跡を開始
}

void draw() {
  background(0); // 背景を黒でクリア

  // Kinectの骨格データが利用可能か確認
  if (kinect.hasSkeleton()) {
    // 追跡されている全てのユーザーについて処理
    for (int i = 0; i < kinect.getNumberOfUsers(); i++) {
      // 各ユーザーの骨格データを取得
      Skeleton skeleton = kinect.getSkeleton(i);

      // 骨格データが有効(追跡されている)か確認
      if (skeleton != null) {
        // 関節を描画する(例: 頭、首、肩、肘、手、腰、膝、足など)
        drawJoint(skeleton.getJoint(Joint.HEAD));
        drawJoint(skeleton.getJoint(Joint.NECK));
        drawJoint(skeleton.getJoint(Joint.SPINE_SHOULDER));
        drawJoint(skeleton.getJoint(Joint.SHOULDER_LEFT));
        drawJoint(skeleton.getJoint(Joint.ELBOW_LEFT));
        drawJoint(skeleton.getJoint(Joint.HAND_LEFT));
        // ... 他の関節も同様に描画

        // 骨と骨の間を線で結ぶ(例: 肩から肘へ)
        drawLine(skeleton.getJoint(Joint.SHOULDER_LEFT), skeleton.getJoint(Joint.ELBOW_LEFT));
        drawLine(skeleton.getJoint(Joint.ELBOW_LEFT), skeleton.getJoint(Joint.HAND_LEFT));
        // ... 他の骨も同様に描画
      }
    }
  }

  fill(255); // 白い文字色
  text("Tracking Users: " + kinect.getNumberOfUsers(), 10, 20); // 追跡人数を表示
}

// 関節(Jointオブジェクト)を描画する関数
void drawJoint(Joint joint) {
  if (joint != null) {
    // 関節の位置を画面座標に変換
    PVector pos = kinect.getScreenPosition(joint.getPosition());
    fill(255, 0, 0); // 関節を赤色の円で描画
    noStroke();
    ellipse(pos.x, pos.y, 10, 10); // 円のサイズ
  }
}

// 関節と関節の間を線で結ぶ関数
void drawLine(Joint j1, Joint j2) {
  if (j1 != null && j2 != null) {
    PVector pos1 = kinect.getScreenPosition(j1.getPosition());
    PVector pos2 = kinect.getScreenPosition(j2.getPosition());
    stroke(0, 255, 0); // 緑色の線
    strokeWeight(3); // 線の太さ
    line(pos1.x, pos1.y, pos2.x, pos2.y);
  }
}

このコードは、Kinectが検出した人の骨格を、画面上に点の集合(関節)と線(骨)としてリアルタイムに描画します。パフォーマーが動くと、画面上のスケルトンもそれに追従します。これは最も基本的なステップですが、ここから様々なビジュアル表現へと発展させることができます。

深度データの取得と可視化

Kinect v2は、各ピクセルまでの距離(深度)情報も取得できます。

import kinecting.*;

Kinecting kinect;

void setup() {
  size(512, 424); // Kinectの深度カメラ解像度に合わせてサイズ設定
  kinect = new Kinecting(this);
  kinect.startDepth(); // 深度ストリームを開始
}

void draw() {
  // 深度データが利用可能か確認
  if (kinect.hasDepth()) {
    // 深度データを画像として取得
    PImage depthImage = kinect.getDepthImage();
    image(depthImage, 0, 0); // 深度画像を画面全体に表示
  }

  fill(255);
  text("Depth Stream", 10, 20);
}

このコードは、Kinectが捉えた空間の奥行き情報を、近い場所は明るく、遠い場所は暗いグレースケール画像として表示します。人の形がシルエットのように浮かび上がって見えます。この深度データを利用して、空間の凹凸を表現したり、特定の距離にある物体だけを抽出したりといった表現が可能です。

具体的な表現アイデアへの展開

これらの基本的なデータ取得を元に、より創造的なビジュアル表現を開発できます。

  1. 動きの軌跡: 関節の過去の位置情報を配列などに記録しておき、それらの点を線や曲線で結んで描画することで、動きの軌跡(残像)を表現できます。時間経過で色や透明度を変化させると、より動的な表現になります。
  2. パーティクルシステム: 骨格のジョイント位置や深度データを使って、画面上に多数の小さな粒子(パーティクル)を発生させ、物理演算やアルゴリズムに従って動き回らせます。身体の動きがパーティクルの振る舞いに影響を与えるようにすることで、幻想的な表現が生まれます。
  3. 深度に基づく空間エフェクト: 深度データを利用して、画面上のピクセルの位置をずらしたり、色を変化させたりすることで、空間が歪んだり、波打ったりするようなエフェクトを作り出せます。
  4. インタラクティブな描画: 身体の動きを筆跡に見立てて、リアルタイムに描画していく表現です。手の動きで線を引いたり、身体全体でジェスチャーを描いたりできます。

これらのアイデアはProcessingの豊富な描画機能と組み合わせることで、さらに多様な表現へと発展させることができます。例えば、ProcessingのライブラリであるToxiclibsや traer physicsなどを使えば、物理演算に基づいたパーティクルの動きを実現することも可能です。

実践に向けて:学習リソースと連携のヒント

Kinect v2とProcessingを使った表現開発を始めるにあたって、役立つ情報や考え方を紹介します。

学習リソース

技術的な課題とコスト感

Kinect v2は比較的安価に入手可能ですが、中古品の状態やPC環境との互換性には注意が必要です。また、リアルタイム処理にはある程度のPCスペックが求められます。トラッキング精度は完璧ではなく、環境光や服装によって影響を受けることもあります。これらの技術的な制約を理解し、表現の意図に合わせて工夫することが重要です。

技術者との連携について

パフォーマー自身がプログラミングを学ぶのは素晴らしいことですが、技術的な部分を専門家と協力して進めることも有効な手段です。技術者との連携を模索する場合、以下の点を意識すると円滑に進む可能性があります。

Processingはアーティストやデザイナーにも比較的馴染みやすいツールであるため、Processingを扱える技術者や、あるいはビジュアルアート系の経験を持つ技術者を探すと、コミュニケーションがスムーズになるかもしれません。

まとめ

この記事では、Kinect v2とProcessingを組み合わせた身体追跡に基づくリアルタイムビジュアル表現の基礎をご紹介しました。この技術は、パフォーマーの身体の動きを新たなデジタル表現へと変換し、ライブパフォーマンスに深みと驚きをもたらす大きな可能性を秘めています。

技術初心者にとっては、Processingのコードを書くことやKinectセンサーをセットアップすることに最初は難しさを感じるかもしれません。しかし、小さなステップから始め、サンプルコードを改変したり、オンラインのリソースを活用したりすることで、着実に理解を深めることができます。

Kinect v2とProcessingは、あなたの身体表現をデジタル空間へと拡張するための強力なツールの一つです。この記事が、あなたが新しい表現の探求へ向けた第一歩を踏み出すための一助となれば幸いです。デジタル技術と身体表現の融合によって生まれる、次の時代のパフォーマンスを共に創り上げていきましょう。