Processing書籍の電子書籍が出版:8月末まで特別価格

BNNから出版されているProcessing:ビジュアルデザイナーとアーティストのためのプログラミング入門の電子書籍が発売されました。


(電子版)Processing―ビジュアルデザイナーとアーティストのためのプログラミング入門

紙版は7000円(+税)で電子版は6300円(+税)ですが、8月末まで3600円(+税)の特別価格となっています!

Processing Library TemplateでProcessinglueを更新

インスタレーションやデジタルサイネージ等のように、大型ディスプレイや空間的に配置した複数のディスプレイでインタラクティブなシステムを動かすシミュレーションができるよう、3Dの仮想空間の中でProcessingを表示できる仮想ディスプレイとその仮想空間を撮影する仮想カメラを実装してきました。
 その発端とも言えるCityCompilerは仮想空間はjMonkeyEngineを使いましたが、3D仮想空間もProcessingにしたのがProcessinglueです。
[CityCompiler Examples on Vimeo]

以前からソースコードはgithubで公開していたのですが、Processing2.xではデバッグがしづらくいつもEclipseでProcessingを使っていたこともあり、Eclipseで使うプロジェクトとして公開していました。
 Processingがヴァージョンアップしてデバッグが出来るようになり使い勝手も上がったので、Processingのライブラリとしてインポートしやすいよう、Processinglueをビルドし直しました。
[https://github.com/yasutonakanishi/Processinglue]

ビルドにはProcessingのLibrary Templateを使いました。
[https://github.com/processing/processing-library-template]
使い方は英語で書いてあるとおりですが、日本語で解説されたサイトがなかったので、参考程度に手順をメモしておきます。
 Eclipseへのインポートの仕方はOption Bでやりました。ダウンロードしたzipファイルを解凍せずにEclipseのプロジェクトにインポートします。EclipseでProcessingを使えるようにすべく、core.jar等の必要なライブラリを追加します(この作業は、こちらなどを参考にしてください)。仮想カメラはCaptureクラスのサブクラスとして実装しているので、Videoライブラリのjarも3つ追加します。build.propertiesを自分のライブラリ用に設定し、サンプルとして付いてくるHelloLibrary.javaをAntでビルド出来て、そのライブラリを使うHello.pdeを実行できれば、準備完了です。あとは、自分のライブラリのためのコードとそのサンプルを追加していきます。参考までに、Eclipseのプロジェクトの画面をのせました。


PglueLibraryTemplate

サンプルは2つ作りました。一つ目は、Processingを仮想ディスプレイに表示して、スケール感が分かるようにそれを眺めるC3-POを置きました。ディスプレイの大きさや位置をcontrolP5で変えながら、コンテンツのProcessingをプロトタイピングしてゆくような例になっています。二つ目は、飛んでいるアイアンマンを眺めているC3-POを仮想カメラで撮影しその画像を背後の仮想ディスプレイに表示、というのを作りました。仮想空間の中でもビデオフィードバックが起きています。

Processinglue : Virtual Camera

Processinglueには,Processingを出力できる仮想ディスプレイだけでなく,Processingの入力として使うことができる仮想カメラもあります.

Processingでカメラを使う際には processing.video.Captureクラスを使いますが,仮想カメラはCaptureクラスのサブクラスとして実装しているので,同じようにPAppletから扱うことができます.

その一例としてPerfume Official Global Websiteで公開されているPerfumeのモーションデータを再生するProcessingのサンプルを拡張しました.Perfumeの前に仮想カメラを置き,その画像をオプティカルフローを出力するProcessingに渡し,その出力をPerfumeの後ろに置いた大きなディスプレイに出力しました.

右のウィンドウがシミュレーションをするProcessing,左上のウィンドウが画像処理を行っているProcessing,左下のウィンドウが仮想カメラの画像です.

Capture and Display Test0

シミュレーションを行うPAppletの中では下記のような手順でインタンスを生成します.

capture = new P4PCapture(this,320,240);//仮想カメラのインスタンスをnew
opticalflow opt = new opticalflow();//オプティカルフローのPAppletをnew
opt.setCapture(capture);//仮想カメラをオプティカルフローのPAppletに渡す
display = new P4PDisplay(this, 1600, 1200, opt, 320, 240, true);//オプティカルフローのPAppletを引数にして仮想ディスプレイのインスタンスをnew

オプティカルフローを計算するProcessingはOpenProcessingで公開されているものを使いました.そのソースの中に画像を反転する/しないを決めるパラメータがありますが,反転せずに出力してみました.

Capture and Display Test1

画像処理を使ってビデオエフェクトをかける時には,画像が入れ子になっていくビデオフィードバックがかからないようカメラにフィルタをかけることがあります.ビデオフィードバックがかからないようシミュレーションしてみました.

Capture and Display Test2

フィルタをかける/かけないを仮想空間でも可能にするために,PAppletがimplementするインタフェース:Draw2PGraphics3Dを定義してあります.
カメラには写したくない+3D空間の中に表示するものはdraw()の中でhoge.draw();等として描画をします.
カメラに写したい+3D空間の中にも表示したいものはdraw2PGraphics3D()の中でfuga.draw();などとしておき,draw()の中でdraw2PGraphics3D(this);と呼び出すようにしています.
少しややこしい気もするので,写さないオブジェクト/写すオブジェクトをリストで管理しても良いかな…とも思うのですが,PAppletのサブクラスを作って隠蔽することが分かりにくさを生む場合もあると考え,今はこうした実装にしています.
(良い実装の方針があったらぜひ教えて下さい)

Cpatureクラスを使って画像を処理するPAppletは少しだけ拡張を行います.

public boolean realDeployment = false;

という変数と下記のようなメソッドを追加します.

public void setCapture(Capture capture){ // added for P4P
this.video = capture;
}

setup()の中で

if(realDeployment) { // added for P4P
video = new Capture(this, wscreen, hscreen, fps);
video.start();
}

とすることで,シミュレーションの際にはリアルなカメラをnewしないでおき,シミュレーションのコードでnewした仮想カメラをsetCapture(capture);します.

draw()の中で仮想カメラ/リアルカメラからの画像を読み込みますが,

if(realDeployment == true)
video.read();
else
video.loadPixels();

として仮想カメラ/リアルカメラを使い分けています.他の部分は元のソースコードと同じです.こうした実装をすることで

  • 仮想カメラからの入力を仮想ディスプレイに出力
  • リアルカメラからの入力を仮想ディスプレイに出力

を行ったり来たりしながらプロトタイピングを行い,最終的には

  • リアルカメラからの入力をリアルディスプレイに出力

するという形でプロトタイピングを進めることができる,というのがProcessinglueの大きな特長になっています.

https://github.com/yasutonakanishi/Processinglue

Processinglue : Virtual Display

Processingはインタラクティブなシステムのプロトタイピングやメディアアートの制作に良く使われるJavaベースのプログラミング環境です.公式サイトでもProcessingを使った作品がたくさん紹介されています

Processingを使って作品を作るといっても,Processingが動いているパソコンをそのままポンと置くことはほとんどないと思います.カメラやセンサやモータを使ったり,プロジェクタや大きなディスプレイを使うことがほとんどです.そうした時に,コンピュータで何度も試行錯誤してから実際に展示してみると,思った通りには動かなかったり,映像の大きさや動くスピードから感じるものが画面の時とは違う…(それが良い方向に転ぶ場合ももちろんあります)という事が結構あるものです.

そこで,作品が空間に置かれた様子をシミュレーションしながらプログラミングを進められるような環境である”CityCompiler”というライブラリをこれまで作ってきました.
jMonkeyEngineというゲームエンジンの中で動く仮想のディスプレイやプロジェクタ,仮想のカメラやセンサを使って,Processingが動く様子をシミュレーションできるというものです.CityCompilerの使い方や使った例などはこちらへ.
 CityCompilerワークショップ「空間をプログラミングしよう!」向け資料
 CityCompiler Examples on vimeo

CityCompilerを使ってProcessingのシミュレーションをするにはjMonkeyEngineをちょっと理解しないといけないので,それが少しハードルになっていました.

Processing2.0がOpenGLを全面的に取り入れたこともあり,CityCompilerと同じような仮想カメラと仮想ディスプレイをProcessingで実装したのがProcessinglueです.
Glueは糊のことですが,ProcessingをProcessingにくっ付ける糊,というイメージで名前を付けました.これでProcessingをシミュレーションするのにProcessingの知識があればOKになりました.

FlatDisplay Test0 from Yasuto Nakanishi on Vimeo.

このムービーではProcessingのExamplesにあるDistance2DというPAppletを仮想ディスプレイに表示して,それをお姉さんが見ている様子をシミュレーションしています.シミュレーションを始めると,「ディスプレイを回してみるとどうかな?」「回るディスプレイにどんなProcessingを表示するとオモシロいかな?」「横長と縦長だったらどう違うかな?」なんて事を考え始めるようになります.Processinglueを使えば色々なアイデアをシミュレーションしながら発展させることができます.

仮想ディスプレイを実装するにあたってキーになるのはPAppletの
public void registerMethod(String methodName, Object target)
というメソッドです.

PAppletの中でdraw()メソッドが初めて実行される時や実行された直後,スケッチが停止したり再開した時,mouseEventやkeEvent,touchEventが起きた直後などに,呼んでもらいたいオリジナルのメソッドをPAppletに登録することが出来ます.

仮想ディスプレイは,表示するアプレットのdrawメソッドが呼ばれた直後に,いま描かれたホヤホヤのpilxels[]の中身をコピーしたPImageを作る,ということをします.
表示するアプレットが描画をする度にPImageを作り直し,そのPImageをP3Dの中にテクスチャとして表示することで,Processingが動く様子をP3Dの中で見ることができます.

テクスチャの貼り方を変えるだけで円柱型ディスプレイや曲面ディスプレイも簡単に作れます.なのでこれらは平面の仮想ディスプレイのサブクラスとして作りました.

BezierDisplaysScape

CylinderDisplays Test

マウスによるインタラクションがあるPAppletは別ウィンドウを作って表示するオプションをtrueにして,普通のPAppletと同じようにそのウィンドウをアクティブにしてマウスを動かします.
マウスの動きに応じて作り替えられたpixels[]が毎フレーム毎にコピーされてテクスチャとして貼り直されるので,マウスの動きがシミュレーションにも反映されます.↑の円柱ディスプレイのサンプルがそうした例になっています.

Processingの開発環境であるPDEは一つのフォルダにPAppletが一つだけあるという前提を置いているので,PAppletを複数使うProcessinglueはPDEでは実行できません.そのためEclipseを使って開発を行います.ソースコードを含んだプロジェクトをGitHubに上げてありますので,ぜひ一度試してみてください.

https://github.com/yasutonakanishi/Processinglue
https://github.com/yasutonakanishi/Processinglue/archive/master.zip

仮想カメラについては次のエントリーで紹介したいと思います.

DESIGN FRONTIERS WORKSHOP SERIES

UC BerkleyのCal Design Labでサマープログラムとして「DESIGN FRONTIERS WORKSHOP SERIES」が開催されます。College of Environmental Design(日本で言うと建築学科+土木工学科ですね)が主催のワークショップだけあって、テクノロジーを取り込んだ新たな空間のデザインを実践する場となっています

4つのワークショップが週替わりで開かれます。
・EXPRESSIVE MOVEMENT IN ARCHITECTURE AND DESIGN, JULY 15-19, 2013
・ROBOTIC PROTOTYPES IN ARCHITECTURE, JULY 22-26, 2013
・FRONTIERS IN DESKTOP FABRICATION, JULY 29 – AUGUST 2, 2013
・GESTURAL AND NATURAL USER INTERFACES, AUGUST 5-9, 2013
どれも面白そうですね。

僕もどれか1つ参加しようと思っています。

CityCompilerをgithubにて公開中

最新版のCityCompilerはgithubで公開しています。
https://github.com/yasutonakanishi/CC4p52
Processingが2.0b8が2月24日に公開されていたので、最新のコミットではProcessingのライブラリを更新しました。

また日本語で書いたドキュメントも同梱しました。ワークショップを一緒に進めてくれた田所淳さん、橋本直さん、荒川慎一さんと一緒に作りました。
CityCompiler ドキュメント

ダウンロードおよびインストールの仕方が、サンプルの動かし方等が書かれていますので、CityCompilerを使ったプロトタイピングをお楽しみください!

空間をプログラミングするサンプル

ワークショップも今週末に迫ってきました!

サンプルを色々と追加しているところです.
・変わったカタチのディスプレイを作る +それに表示する映像も一緒に考える
・ディスプレイの数を増やしてその配置を考える+それに表示する映像も一緒に考える
・プロジェクションする有名な建築などを考える+それに表示する映像も一緒に考える
といったところから参加いただく皆さんとアイデアを膨らましたいと思っています.

そうした例をまずはちょっと作ってみました.

モフモフした球体を描くアプレットがあったので,球体のディスプレイに貼付けてみました.アプレットへのマウスのインタラクションも球体ディスプレイに反映されます.思ったのと違った感じで貼付けられたのですが,ちょっと羽っぽくもあり,立体的な太極図みたいでもあり,試しに水面の上に置いてみたのですが,ちょっと不思議な感じがしたので,球体ディスプレイも回転する様にしてみました.

SphereDisplayOnTheWater from Yasuto Nakanishi on Vimeo.

水面に球体が浮かぶのが面白かったので,ディスプレイをたくさん水の中に入れてみたくなりました.宮島達雄さんの作品のような黒いディスプレイに赤い数字を表示させてみました.複数のアプレットを管理するクラスを作り,Timerで表示を切り替えるタイミングをあわせています.上のサンプルでは水面に波が立たないようパラメータの値を設定しましたが,今回は少し水面を揺らしてみました.実世界でこうなるかどうかは分からないのですが,水面に反射する画面と水の中の画面がゆらゆらと両方見える感じがオモシロいと思いました.

SynchronizedDisplaysOnTheWater from Yasuto Nakanishi on Vimeo.

東京駅のリニューアルオープンのイベントでプロジェクションマッピングが行われたのは記憶に新しいところです.お金と名声?がないとあぁした機会を得ることは難しいですが,仮想空間の強みを活かして僕もやってみました.Google SketchUpの3Dギャラリーにあった東京駅をダウンロードして配置します.プロジェクタの配置がしやすいように,xyz軸に合うように東京駅を移動・回転している内に,東京駅と皇居との関係が明確になるような映像を表示したいと思いました.たまたま使ったパーティクルのPAppletを仮想プロジェクタで投影してみたら,東京駅から皇居外苑に入る行幸通りにうまい具合に光の道を作ることができました.

ProjectionMapping on TokyoStation from Yasuto Nakanishi on Vimeo.

CityCompilerを使って仮想空間でシミュレーションを色々とやってみると,「予期せぬ発見」をすることがあります.それを下にアイデアを膨らませていくのがけっこう楽しいです.妄想したイメージとは違うイメージが現れることで,またイメージが膨らむんですよね.どんな想像やイメージが現れるか,楽しみです.

ワークショップ「空間をプログラミングしよう!」開催のお知らせ

映像とサウンドなど複合的な要素を組み合わせたクリエイティブ・コーディングは、デジタルサイネージやプロジェクションマッピング、メディアアートなど、パソコンの画面を越え実空間へと広がりを見せています。

3Dの仮想空間の中でProcessingが動作する様子をシミュレーションできるCityCompilerを使って、自分のコードとアイデアを空間に広げてみませんか?

統合開発環境EclipseがインストールされたノートPCを持参していただき、講師と一緒に空間をプログラミングしてみましょう!

開催概要
講師:
中西 泰人 @nakanaka
田所 淳 @tadokoro http://yoppa.org
橋本 直 @kougaku http://kougaku-navi.net

参加料:無料
定員 :15名/日(24日と25日は同じ内容のワークショップを行います)
日程 :11月24日(土曜)/11月25日(日曜)
時間 :10時30分〜17時30分
 10時00分 – 10時30分 受付
 10時30分 – 11時00分 サンプルの説明
 11時00分 – 12時00分 サンプルの改造・テスト
 12時00分 – 13時00分 昼食
 13時00分 – 13時30分 ブレインストーミング
 13時30分 – 17時00分 クリエイティブ・コーディング
 17時00分 – 17時30分 発表+シェア
場所 :東京都中央区日本橋本町4-5-14 本町ビル1F A室
 前の通りが昭和通り(高速道路)とぶつかる所には交番があります。
 前の通りが中央通りと交差する所には岩手銀行とドラッグストアがあります。
 ビルの向かいにはコイン駐車場Timesがあります。
 ビルの1Fの通りに面した部屋です。

申し込み
こちらのatndからお願いします!
1日目:11月24日(土)http://atnd.org/event/E0010531
2日目:11月25日(日)http://atnd.org/event/E0010532

以下、田所さんのBlogの引用です。
—–
活動近況、CityCompilerでプロトタイピング!!

CityCompilerはjMonkey engineというJavaベースのゲームエンジンをベースにした開発環境で、仮想空間に物体を簡単に配置することができ、さらにそこに仮想のディスプレイやカメラ、プロジェクター、仮想のセンサーなどを配置していくことが可能となっています。さらに嬉しいのは、Javaベースの開発環境なので、仮想のディスプレイやプロジェクターにProcessingでつくったスケッチを簡単に組みこめます。このことで、実際に空間に配置しながらプログラムを修正したり配置を調整したりといった作業が簡単にできるわけです。

これをつかってどんなことができるかというと、例えば個人ではとても無理なような巨大な規模のシミュレーション。CityCompilerではGoogleスケッチアップなどで作成した3Dモデルを.obj形式に変換することでシーンに配置可能なので、有名建築にプロジェクションマッピングすることが可能。

CityCompiler_test.mov from Atsushi Tadokoro on Vimeo.

さらには、大量の物体もプログラムでくりかえし複製して、メモリや処理速度が追い付く限り、いくらでも配置できます。たとえば広大な地表にディスプレイを大量に配置するインスタレーションのシミュレーションなど。

CityCompiler multi monitor sketch from Atsushi Tadokoro on Vimeo.

jMonkey Engineのアニメーション機能をつかって、物体を動かすことも可能。例えばディスプレイ自体を大量に生成して動かしたり。

CityCompiler kinetic monitor sketch from Atsushi Tadokoro on Vimeo.

さらには、物体を動かしたところにプロジェクションをしたり。

CityCompiler kinetic projection sketch from Atsushi Tadokoro on Vimeo.

プロジェクションの際には、影の形状なども細かくシミュレーションしている様子がよくわかります。さらには、仮想の距離センサーを配置することも可能。鑑賞者との距離によって変化するオブジェクトの実験。

CityCompiler distance sensor sketch from Atsushi Tadokoro on Vimeo.

実際にいろいろ試してみると、とても楽しい環境です。今後はこの環境を活用したワークショップなども企画中。乞うご期待!!

—–

空間へ広がるクリエィテブ・コーディングは、世界のさまざまな場所で実験的な試みがなされています。このワークショップは、場所やコスト(時間とお金)の制約を受けずに思いついたものをとりあえずたくさん作ってみる、そんな時間にしたいと思っています。


ART+COM : Grasp Pendulum


3M GTG Meta Twist Tower at Munich Airport.
3M GTG xSlider

開催協力:クロスコ CROSSCO Co.,Ltd.

ProcessingでBlobDetection

BlobDetection library / v3ga

3年前のエントリー:Java(BlobDetection.jar)で動体検知(風)、で紹介したBlobDetection / v3gaのサイトを久々に訪れたら、August 2011にバグが取れたバージョンに更新されていました。

最初のリリースがJune 2004ですから、気長にというか息の長いプロジェクトですね。地道にこつこつと開発する姿勢を見習いたいものです。

ProcessingでVideoChat(DatagramSocket)

中西研のB4関口です。

今回もProcessingネタになってしまうのですが、今回はProcessingを使ったビデオチャットを実装したいと思います。
方針としては、画像をバイト配列に変換して、データグラム通信で別のPCへ送ってあげる感じにします。今回はわかりやすさのために、スレッドとか使いません。

さくっとまずはソースを乗せてしまいます。

[java]
import processing.video.*;
import java.awt.image.*;
import java.awt.*;
import javax.imageio.*;
import java.net.DatagramPacket;

InetSocketAddress remoteAddress;
DatagramPacket sendPacket;
DatagramPacket receivePacket;
DatagramSocket receiveSocket;

Capture capture;

//送信するバイト配列
byte[] sendBytes;
//受信するバイト配列を格納する箱
byte[] receivedBytes = new byte[300000];

void setup() {
size(600,480);

capture = new Capture(this,640,480);

try {
//受信ポート
receiveSocket = new DatagramSocket(5101);
}
catch(SocketException e) {
}
//受信用パケット
receivePacket = new DatagramPacket(receivedBytes,receivedBytes.length);
//送り先
remoteAddress = new InetSocketAddress(“localhost”,5100);
try{
receiveSocket.setSoTimeout(1000);
}catch(SocketException e){
}
}

void draw() {
capture.read();
/* ここから受信 */

println(receiveSocket.isBound());
try {
receiveSocket.receive(receivePacket);
}
catch(IOException e) {
}

Image awtImage = Toolkit.getDefaultToolkit().createImage(receivedBytes);
PImage receiveImage = loadImageMT(awtImage);
/* 受信終了 */

/* ここから送信 */
//バッファーイメージに変換
BufferedImage bfImage = (BufferedImage)(capture.getImage());
//ストリームの準備
ByteArrayOutputStream bos = new ByteArrayOutputStream();
BufferedOutputStream os = new BufferedOutputStream(bos);

try {
bfImage.flush();
ImageIO.write(bfImage,”jpg”,os);
os.flush();
os.close();
}
catch(IOException e) {
}
sendBytes = bos.toByteArray();
try {
sendPacket = new DatagramPacket(sendBytes, sendBytes.length, remoteAddress);
try{
new DatagramSocket().send(sendPacket);
} catch(IOException e){
}
println(“bufferImageSended:”+sendBytes.length+” bytes #2″);
}
catch(SocketException e) {
}
/* 送信終了 */

//描画
image(receiveImage,0,0);
image(capture,width-width/4,height-height/4,capture.width/4,capture.height/4);
}

[/java]

横着して、catchではなにもしません。

setup()

具体的にsetup()内について見ていきます。
[java]
receiveSocket = new DatagramSocket(5101);
receivePacket = new DatagramPacket(buf,buf.length);
[/java]
ここで、受信ソケットのポートの設定をします(適当に5101番)。今回は、localhost内では2つアプリを起動することになるのですが、受信と送信ポートを互い違いにしないと動かないので注意です。(別のIPが振られてるところに飛ばすなら、全く同じアプリを起動させれば通信するはず)
その下で受信したデータをどこに格納するかを指定します。予め用意しておいたbyte[]を渡すと、受信するたびにそこに値が入っていきます。

[java]
remoteAddress = new InetSocketAddress(“localhost”,5100);
[/java]
ここで、送信先とポートを設定します。今回はlocalhostですが、普通にIPでも大丈夫です。

[java]
receiveSocket.setSoTimeout(1000);
[/java]
最後に受信のタイムアウトを設定します。今回は1000ミリ秒=1秒をタイムアウト時間に設定しました。これを指定してあげないと、受信データが来ない場合に永遠に待ち続けてしまうので、適当な値を指定してあげましょう。

draw()

次に描画部分です。まずは受信部。
[java]
try {
receiveSocket.receive(receivePacket);
}
catch(IOException e) {
}
Image awtImage = Toolkit.getDefaultToolkit().createImage(receivedBytes);
PImage receiveImage = loadImageMT(awtImage);
[/java]
凄く簡単ですね。receiveメソッドを呼んであげれば、予め設定しておいたbyte[]にバイト配列が格納されます。ので、それをまずImageにしてあげて、さらにそれをPImageに変換してます。

次は送信部です。
[java]
//バッファーイメージに変換
BufferedImage bfImage = (BufferedImage)(capture.getImage());
//ストリームの準備
ByteArrayOutputStream bos = new ByteArrayOutputStream();
BufferedOutputStream os = new BufferedOutputStream(bos);
[/java]
まず、キャプチャ画像をBufferedImageにしてあげて、ストリームの準備をします。
[java]
try {
bfImage.flush();
ImageIO.write(bfImage,”jpg”,os);
os.flush();
os.close();
}
catch(IOException e) {
}
sendBytes = bos.toByteArray();
try {
sendPacket = new DatagramPacket(sendBytes, sendBytes.length, remoteAddress);
try{
new DatagramSocket().send(sendPacket);
} catch(IOException e){
}
println(“bufferImageSended:”+sendBytes.length+” bytes #2″);
}
catch(SocketException e) {
}
[/java]

次にImageIOを使ってjpgに変換します。そしてストリームに流し込んで、byteArrayにしてあげます。
DatagramPacketにbyte配列と宛先情報を渡して、それをDatagramSocket.send()すると送られます。
わぁ、簡単。

という感じで、Processingで簡単なビデオチャットが出来ます。