###前提・実現したいこと
Xtionで取得した深度データをUnityに渡して処理することを目標としています。
まず初めにXtion側から"ok"のような簡単なメッセージを送信しUnity側で受信してコンソールに表示したいと考えています。
そのために、Xtion側ではoscpackで送信、Unity側ではUnityOSCで受信を考えています。
Xtionは、https://blog.totakke.net/posts/2013-02-05-install-openni2-mac/
を参考にOpenNI内のSampleの動作確認はできています。
UnityOSC,oscpackのライブラリのインストールは済んでいます。
とりあえずSample内のSimpleViewerのmain.cppを書き直して"ok"の文字を送信できないか試しているのですが、なかなか用途に合ったサイトも見つけられずうまくいっていません。
UnityOSC,oscpack,c++を初めて使うのでやっていることが見当はずれなところもあると思いますが、よろしくお願いします。
Xtion側
参考 https://marunouchi-tech.i-studio.co.jp/2642/
<main.cpp> OpenNI-MacOSX-x64-2.2/Sample/SimpleViewer内のものに下記を追加しました。
c++
1#include "MessageMappingOscPacketListener.h" 2#include "OscHostEndianness.h" 3#include "OscOutboundPacketStream.h" 4#include "OscPrintReceivedElements.h" 5#include "UdpSocket.h" 6#define OUTPUT_BUFFER_SIZE 1024 7 8int main(int argc, char** argv) 9{ 10 //OSC setup 11 UdpTransmitSocket *oscSocket = new UdpTransmitSocket(IpEndpointName( "UnityReceiver", 12345 )); 12 //UdpTransmitSocket transmitSocket( IpEndpointName("UnityReceiver", 12345) ); 13 char buffer[OUTPUT_BUFFER_SIZE]; 14 osc::OutboundPacketStream p(buffer, OUTPUT_BUFFER_SIZE ); 15 16 p << osc::BeginBundleImmediate 17 << osc::BeginMessage("UnityReceiver") << osc::EndMessage 18 << osc::EndBundle; 19 20 //OSCメッセージの送信 21 *oscSocket->Send("ok", p.Size()); 22 23}
Unity側
<OSCHandler.cs> UnityOSCに元々ある
csharp
1public void Init() 2 { 3 CreateServer("UnityReceiver", 12345); <-この1行を追加 4 }
<OSCController.cs> 新しく作った
csharp
1 2sing System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class OSCController : MonoBehaviour { 7private long _lastOscTimeStamp = -1; 8 // Use this for initialization 9 void Start () { 10 OSCHandler.Instance.Init(); 11 } 12 13 // Update is called once per frame 14 void Update () { 15 OSCHandler.Instance.UpdateLogs(); 16 17 foreach( KeyValuePair<string, ServerLog> item in OSCHandler.Instance.Servers ) { 18 for( int i=0; i < item.Value.packets.Count; i++ ) { 19 if( _lastOscTimeStamp < item.Value.packets[i].TimeStamp ) { 20 _lastOscTimeStamp = item.Value.packets[i].TimeStamp; 21 22 string address = item.Value.packets[i].Address; 23 int userX = (int)item.Value.packets[i].Data[0]; 24 int userY = (int)item.Value.packets[i].Data[1]; 25 26 Debug.Log( address + ":(" + userX + ", " + userY + ")" ); 27 } 28 } 29 } 30 } 31}
###発生している問題・エラーメッセージ
Xtion側をmakeすると下記のエラーが出ます。
main.cpp:46:5: error: indirection requires pointer operand ('void' invalid) *oscSocket->Send("ok", p.Size()); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1 error generated. make: *** [Bin/Intermediate/x64-Release/SimpleViewer/main.o] Error 1
###該当のソースコード
<main.cpp>
csharp
1int main(int argc, char** argv) 2{ 3 //OSC setup 4 UdpTransmitSocket *oscSocket = new UdpTransmitSocket(IpEndpointName( "UnityReceiver", 12345 )); 5 //UdpTransmitSocket transmitSocket( IpEndpointName("UnityReceiver", 12345) ); 6 char buffer[OUTPUT_BUFFER_SIZE]; 7 osc::OutboundPacketStream p(buffer, OUTPUT_BUFFER_SIZE ); 8 9 p << osc::BeginBundleImmediate 10 << osc::BeginMessage("UnityReceiver") << osc::EndMessage 11 << osc::EndBundle; 12 13 //OSCメッセージの送信 14 *oscSocket->Send("ok", p.Size()); <-ここにエラー 15 16}
###試したこと
UdpSocket.hを少しいじってみました。
csharp
1 void Send( const char *data, std::size_t size );
のvoidをintやcharにしてそれに合わせてmain.cppの方の引数も変えてみたりしたのですが結果は変わらずでした。
###補足情報(言語/FW/ツール等のバージョンなど)
Unity 2017.1.0f3
Xtion PRO LIVE
Xcode 9.1
OpenNI-MacOSX-x64-2.2
oscpack_1_1_0
MacOS High Sierra
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/20 11:49