Help us understand the problem. What is going on with this article?

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();
  }
}

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

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

テストパターン

スクリーンショット 2019-10-16 16.32.28.png
外枠の赤線で表示領域の確認・十字線でマッピングの中心の確認・中央の正円と正方形で歪みの確認ができるようにしました。

コード

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away