2

我正在尝试制作一个应用程序来执行一些 blob 跟踪并使用TUIO cursor消息发送 Unity3D 的所有数据,就像这样CCV做一样。这就是我对消息的看法("media"是一个在发送所有 blob 的位置/id 或发送平均值之间切换的按钮):

  void testApp::blobOn( int x, int y, int id, int order )
    {
        cout << "blobOn() - id:" << id << " order:" << order << endl;

    ofxOscMessage m;
    m.setAddress("/tuio2/2Dcur");
    m.addStringArg("set");

    if(media == false){
        m.addIntArg(id);
        m.addFloatArg(newX);
        m.addFloatArg(newY);
        cout << "Posicao x: " << newX << endl;
        cout << "Posicao y: " << newY << endl;
    }
    else{
        m.addIntArg(0);
        m.addFloatArg(newMediaX);
        m.addFloatArg(newMediaY);
    }

    m.addFloatArg(0);
    m.addFloatArg(0);
    m.addFloatArg(0);
    m.addFloatArg(0);

    ofxOscMessage l;
    l.setAddress("/tuio/2Dcur");
    l.addStringArg("alive");

    if (blobList.size() > 0)
    {
        if(media == false){
            for (std::map<int,blob>::iterator it=blobList.begin(); it!=blobList.end(); ++it){
                l.addIntArg(it -> first);
                cout << "it first: " << it -> first << endl;
            }
    }else{
        l.addIntArg(0);
        }
    }

    sender.sendMessage(l);
    sender.sendMessage(m);
}


 //--------------------------------------------------------------



void testApp::blobMoved( int x, int y, int id, int order)
{
    cout << "blobMoved() - id:" << id << " order:" << order << endl;

    ofCvTrackedBlob blob_ = blobTracker.getById( id );        

    ofxOscMessage m;
    m.setAddress("/tuio/2Dcur");
    m.addStringArg("set");
    if(media == false){
        m.addIntArg(id);
        m.addFloatArg(newX);
        m.addFloatArg(newY);
        cout << "Posicao x: " << newX << endl;
        cout << "Posicao y: " << newY << endl;
    }
    else{
        m.addIntArg(0);
        m.addFloatArg(newMediaX);
        m.addFloatArg(newMediaY);
    }


    m.addFloatArg(0);
    m.addFloatArg(0);
    m.addFloatArg(0);
    m.addFloatArg(0);

    ofxOscMessage n;
    n.setAddress("/tuio/2Dcur");
    n.addStringArg("alive");

    if (blobList.size() > 0)
    {

        if(media == false){
            for (std::map<int,blob>::iterator it=blobList.begin(); it!=blobList.end(); ++it){
                n.addIntArg(it -> first);
            }
        }
        else {
            n.addIntArg(0);
        }
    }

    sender.sendMessage(n);
    sender.sendMessage(m);
}


//--------------------------------------------------------------


void testApp::blobOff( int x, int y, int id, int order )
{
    cout << "blobOff() - id:" << id << " order:" << order << endl;

    ofxOscMessage m;
    m.setAddress("/tuio/2Dcur");
    m.addStringArg("alive");

    blobList.erase(id);


    if (blobList.size() > 0)
    {
        if(media == false){
            for (std::map<int,blob>::iterator it=blobList.begin(); it!=blobList.end(); ++it){
                m.addIntArg(it -> first);
            }
        }
        else {
            m.addIntArg(0);
        }
    }

    sender.sendMessage(m);
}

我的 Unity 应用程序没有收到我的消息/blob,所以我认为它们的格式不正确。有人可以告诉我可能出了什么问题吗?

4

1 回答 1

0

首先要提的是

m.setAddress("/tuio2/2Dcur");

应该是

m.setAddress("/tuio/2Dcur");

TUIO 标准(1.1 和 1.0)定义 2Dcur 如下:

/tuio/2Dcur set s x y X Y m

在您的代码中,您正在设置 s、x 和 y,然后添加四倍 0.0 (addFloatArg(0)),因此您实际上会收到如下消息:

/tuio/2Dcur set s x y 0.0 0.0 0.0 0.0

这是一个浮动太多。在 OSC 中,您通常订阅带有完整签名的消息。这就是您在 Unity 应用程序中没有收到消息的原因。

于 2015-02-24T14:09:10.047 回答