メニュー 閉じる

133. ProcessingのNyARToolkitのデータをTouchDesigner側で受け取る

ProcessingのARライブラリNyARToolkitを何度か試してきました。
固有のマーカーをカメラに映すことで位置、角度を認識し、自動的に
3D空間座標を構築してくれるので、原点にBoxを描画するとマーカー
の中心に立方体が描かれます。

この位置情報をTouchDesignerに送りたいと思ったのですが、
自動的に構成された3D空間座標をそのまま送ってもデタラメな
位置になります。

そこでNyARToolkitのAR空間座標をスクリーン座標に変換する
getMarkerVertex2D ()を使ってみました。

まずはProcessingの画面。

マーカーの隅4点を取得してgetMarkerVertex2D ()で
スクリーン座標に変換します。それらをOSC通信で
TouchDesignerに送信します。

import processing.video.*;
import jp.nyatla.nyar4psg.*;
import oscP5.*;
import netP5.*;

Capture cam;

MultiMarker mm;

OscP5 osc;

NetAddress net_address;

void setup () {

	size (480, 270, P3D);
	colorMode (RGB, 100);

	String[] cameras = Capture.list ();

	printArray (cameras);

	cam = new Capture (this, cameras[21]);
	cam.start ();

	mm = new MultiMarker (this, width, height, "camera_para.dat", NyAR4PsgConfig.CONFIG_PSG);
	mm.addNyIdMarker (1, 80);

	osc = new OscP5 (this, 12000);

	net_address = new NetAddress ("192.168.1.17", 12000);

}

void draw () {

	if (cam.available () != true) {
		return;
	}

	cam.read ();

	mm.detect (cam);
	mm.drawBackground (cam);

	if (!mm.isExist (0)) {
		return;
	}

	fill (100, 100, 100);

	PVector[] p = mm.getMarkerVertex2D (0);

	pushMatrix ();
	translate (p[0].x, p[0].y, 0);
	ellipse (0, 0, 10, 10);
	popMatrix ();

	pushMatrix ();
	translate (p[1].x, p[1].y, 0);
	ellipse (0, 0, 10, 10);
	popMatrix ();

	pushMatrix ();
	translate (p[2].x, p[2].y, 0);
	ellipse (0, 0, 10, 10);
	popMatrix ();

	pushMatrix ();
	translate (p[3].x, p[3].y, 0);
	ellipse (0, 0, 10, 10);
	popMatrix ();

	OscMessage message = new OscMessage ("/ar_pos/position");

	message.add (p[0].x);
	message.add (p[0].y);
	message.add (p[1].x);
	message.add (p[1].y);
	message.add (p[2].x);
	message.add (p[2].y);
	message.add (p[3].x);
	message.add (p[3].y);

	osc.send (message, net_address);

	//saveFrame ();

}

TouchDesigner側では「Video Device In TOP」で
カメラ画像を表示。その上にProcessingからOSCで送られてきた
ARのスクリーン座標にオブジェクトを描きます。

最終的にはこんな感じになりました。

http://www.velvet-number.com/p5_test/test097/20190509_mov.mov

今のところ4隅の座標のみの取得ですが、角度を含めた姿勢の行列変換なども
あるみたいなので、もうちょっと試してみようと思います。

Posted in processing , touchdesigner