Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
18
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

UnityからProcessingへOSCを投げる

processingでアプリつくったはいいが、UnityのほうがトラッキングしやすいマーカなんかがあるとUnityからProcessingにOSC投げたくなる。ということでその方法を考えてみる。

Screen Shot 2015-09-01 at 21.35.38.png

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

まず任意のfolderにclone
Screen Shot 2015-09-01 at 22.10.54.png

UnityOSC Assetをprojectにimport。
追記
久しぶりに同じことをやろうとしたら何をimportするのか忘れた。
こちらのブログ記事を参考にさせていただいて、構成を思い出した。
githubでcloneするとUnityOSCフォルダ以下に複数フォルダがあるが、取り込む必要があるのはsrcのみである。(testsを入れようとするとエラーがでる。)

任意のオブジェクトにOSCHandlerをaddする。
Screen Shot 2015-09-03 at 18.38.15.png

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

    }
}

Unity & ProcessingをrunするとprocessingにOSCを送れているのがわかる。
Screen Shot 2015-09-03 at 18.48.18.png

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
18
Help us understand the problem. What are the problem?