Processing2.0で射影変換しながら壁に映像を投影する方法メモ。
Processing2.0で射影変換しながら映像を投影する
「Processingで手抜きプロジェクションマッピング」のコードを99%そのまま使ったんですが、Processing2.0だとちょっとだけ手直しする必要があります。
動画の映像をコールバックする部分です。そこだけ修正してProcessing2.0で動くようにしたコードを公開します。
動作した状態の映像は下記の通りです。マウスで四隅をドラッグすることで射影変換を行なっています。
import processing.video.*;
import processing.opengl.*;
Movie mov; // 動画
int selected = -1; // 選択されている頂点
int pos[][] = {{0,0},{400,0},{400,300},{0,300}}; // 頂点座標
void setup() {
size( 1024, 768, P2D); // 画面サイズ(適宜調整)
mov = new Movie(this,"movie.mov"); // 動画ファイルの読み込み
mov.loop(); // 動画ループ再生
}
// このメソッドを追加しました
void movieEvent(Movie m) {
m.read();
}
void draw() {
background(0);
// ビデオテクスチャの描画
beginShape();
texture(mov);
vertex(pos[0][0], pos[0][1], 0, 0);
vertex(pos[1][0], pos[1][1], mov.width, 0);
vertex(pos[2][0], pos[2][1], mov.width, mov.height);
vertex(pos[3][0], pos[3][1], 0, mov.height);
endShape(CLOSE);
// マウスによる頂点操作
if ( mousePressed && selected >= 0 ) {
pos[selected][0] = mouseX;
pos[selected][1] = mouseY;
}
else {
float min_d = 20; // この値が頂点への吸着の度合いを決める
selected = -1;
for (int i=0; i<4; i++) {
float d = dist( mouseX, mouseY, pos[i][0], pos[i][1] );
if ( d < min_d ) {
min_d = d;
selected = i;
}
}
}
if ( selected >= 0 ) {
ellipse( mouseX, mouseY, 20, 20 );
}
}
参考リンク
便利なコードを公開してくださりありがとうございます!
