processingでアプリつくったはいいが、UnityのほうがトラッキングしやすいマーカなんかがあるとUnityからProcessingにOSC投げたくなる。ということでその方法を考えてみる。
Processing使うのは久しぶり。Ver2.1が筆者のPCに入っていた。
ProcessingでOSCをreceiveするにはoscP5をinstallする。
次はUnity。今回使うのはVuforiaです。ARアプリ作る特によく使うのかと。任意の画像をマーカーに容易に設定できるというのは、ARToolkitより優れている点か。
Vuforiaでマーカ登録するとかはこの投稿では割愛。
ひとまず、Unityの任意のシーンにImageTarget objectがあり、Image Target Behaviour scriptにマーカーとなる画像が設定されているとする。
そして、この画像の座標をOSCでProcessing側に投げる方法について。
参考にしたのは以下。
http://learning.codasign.com/index.php?title=Sending_and_Receiving_OSC_Data_Using_Processing
import oscP5.*;
import netP5.*;
OscP5 oscP5;
NetAddress myRemoteLocation;
void setup() {
size(400, 400);
// start oscP5, telling it to listen for incoming messages at port 12000
oscP5 = new OscP5(this, 12000);
// set the remote location to be the localhost on port 12000
myRemoteLocation = new NetAddress("127.0.0.1", 12000);
}
void draw() {
// do funky stuff here
}
void oscEvent(OscMessage theOscMessage){
// get the first value as an integer
int firstValue = theOscMessage.get(0).intValue();
// get the second value as a float
//float secondValue = theOscMessage.get(1).floatValue();
// get the third value as a string
//String thirdValue = theOscMessage.get(2).stringValue();
// print out the message
print("OSC Message Recieved");
//print(theOscMessage.addrPattern() + " ");
//println(firstValue + " " + secondValue + " " + thirdValue);
println(firstValue);
}
UnityでOSCをsendするにはUnityOSCを使うことにした。
https://github.com/jorgegarcia/UnityOSC
UnityOSC Assetをprojectにimport。
追記
久しぶりに同じことをやろうとしたら何をimportするのか忘れた。
こちらのブログ記事を参考にさせていただいて、構成を思い出した。
githubでcloneするとUnityOSCフォルダ以下に複数フォルダがあるが、取り込む必要があるのはsrcのみである。(testsを入れようとするとエラーがでる。)
OSCHandlerのコードをprocessingにOSCを送れるように修正。
void initだけ設定を加える。
public void Init()
{
//Initialize OSC clients (transmitters)
//Example:
CreateClient("myRemoteLocation", IPAddress.Parse("127.0.0.1"), 12000);
//Initialize OSC servers (listeners)
//Example:
//CreateServer("AndroidPhone", 6666);
}
OSCをsendするメソッドは新規にscriptを追加して処理を書く。
例えばOSCController.csとか。
using UnityEngine;
using System.Collections;
public class OSCController : MonoBehaviour {
// Use this for initialization
void Start () {
// this line triggers the magic
OSCHandler.Instance.Init ();
int testInteger = 54321;
OSCHandler.Instance.SendMessageToClient ("myRemoteLocation", "127.0.0.1:12000", testInteger);
}
// Update is called once per frame
void Update () {
int testInteger = 54321;
int random = Random.Range (0, 10000);
OSCHandler.Instance.SendMessageToClient ("myRemoteLocation", "127.0.0.1:12000", random);
}
}