Я пытаюсь создать приложение, которое отслеживает некоторые объекты и отправляет все данные для Unity3D, используя TUIO cursor
сообщения, как и CCV
делает.
Это то, что я имею в отношении сообщений ("media"
кнопка для переключения между отправкой позиции / идентификатора всего блоба или отправкой среднего значения):
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 не получает мои сообщения / блобы, поэтому я думаю, что они плохо отформатированы. Может кто-нибудь сказать мне, что может быть не так?
Первое, что стоит упомянуть
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.
Других решений пока нет …