Processingでプロジェクションする時の便利コード書いた


概要

Processingでプロジェクション(マッピング)をする際、必要な機能や便利な機能をひとつのコードにまとめました。
VJなどProcessingから映像出力したい時全般に使えると思います。

動作検証環境

  • Processing 3.5.3
  • MadMapper 3.6.1
  • Mac OS High Sierra
  • Windows 10

使い方

コードを保存後、Processingを起動して スケッチ > ライブラリをインポート から「Spout」「Syphon」をダウンロードしてください。
その後、Processingの実行ボタンを押してMadMapperへの出力を確認してください。

特徴

Windows / Mac 両対応の映像出力

映像出力ライブラリとしてWindowsではSpout、MacではSyphonを利用しています。
OSを自動判別して適切なライブラリを通して映像を出力するため、OSが異なるマシン間でのコードの書き換えの手間が省けます。

draw関数末尾に映像送信用コードを書いているので、これより上に描画処理を記述してください。

void draw() {
  // ここに描画処理を記述
  // ...
  // ...

  // 映像を送信
  if (myOS == OS_LIST.MAC) {
    server.sendScreen();
  } else if (myOS == OS_LIST.WIN) {
    spout.sendTexture();
  }
}

タイトルバーにテキストを表示するサンプル



実行画面ウィンドウのタイトルバーにテキストを表示するサンプルを付けました。
サンプルでは実行画面上で適当なキーを押すたびに"Normal Mode"と"Debug Mode"が切り替わります。
これを利用すれば現在のステータスや変数の値などを確認することができます。
PC+モニター1枚とプロジェクターというディスプレイ2面体制であれば、モニターにProcessingの実行ウィンドウを表示しておいてそちらでタイトルバーを観測することができます。

テストパターン


外枠の赤線で表示領域の確認・十字線でマッピングの中心の確認・中央の正円と正方形で歪みの確認ができるようにしました。

コード

import spout.*;
Spout spout;
import codeanticode.syphon.*;
SyphonServer server;

String OS_NAME = "";
enum OS_LIST {
  WIN, MAC, OTHER
};
OS_LIST myOS;

// タイトルバーのパラメータ表示サンプル
boolean isDebugMode = false;
String normalMessage = "Normal Mode";
String debugMessage = "Debug Mode";

void settings() {
  size(800, 600, P3D);
  PJOGL.profile=1;
}

void setup() {
  // OSの判定
  OS_NAME = System.getProperty("os.name").toLowerCase();
  if (isMac()) {
    myOS = OS_LIST.MAC;
  } else if (isWindows()) {
    myOS = OS_LIST.WIN;
  } else {
    // 判定できないOSを使用していた場合は起動させない
    println("OS判定エラー");
    exit();
  }

  // 映像送信用ライブラリのインスタンス化
  if (myOS == OS_LIST.MAC) {
    server = new SyphonServer(this, "Processing Syphon");
  } else if (myOS == OS_LIST.WIN) {
    spout = new Spout(this);
    spout.createSender("Processing Spout");
  }

  // タイトルバーの文字セット
  if (isDebugMode) {
    surface.setTitle(debugMessage);
  } else {
    surface.setTitle(normalMessage);
  }
}

void draw() {
  background(230);

  // テストパターン
  noFill();
  stroke(0);
  strokeWeight(5);
  line(width/2, 0, width/2, height);
  line(0, height/2, width, height/2);
  ellipse(width/2, height/2, height*0.5, height*0.5);
  rectMode(CENTER);
  rect(width/2, height/2, height*0.75, height*0.75);
  stroke(255, 0, 0);
  strokeWeight(10);
  rect(width/2, height/2, width, height);

  // 映像を送信
  if (myOS == OS_LIST.MAC) {
    server.sendScreen();
  } else if (myOS == OS_LIST.WIN) {
    spout.sendTexture();
  }
}

// キーを押すごとにモードを切り替えてタイトルバーの文字を更新
void keyPressed() {
  isDebugMode = !isDebugMode;

  if (isDebugMode) {
    surface.setTitle(debugMessage);
  } else {
    surface.setTitle(normalMessage);
  }
}

boolean isMac() {
  return OS_NAME.startsWith("mac");
}

boolean isWindows() {
  return OS_NAME.startsWith("windows");
}

参考URL