質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

2088閲覧

Xtionにoscpackを導入してUnityと接続したい

ooooooshima

総合スコア7

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/11/19 12:14

編集2017/11/19 12:19

###前提・実現したいこと
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

*oscSocket->Send("ok", p.Size());
となっていますが、頭のアスタリスクが不要なのではないでしょうか。

osoSocketはポインタなので、
oscSocket->Send("ok", p.Size());
とすれば、行けると思います。

投稿2017/11/20 09:40

StudioAres

総合スコア127

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ooooooshima

2017/11/20 11:49

回答ありがとうございます。 そのようにしてみたのですが、 error: linker command failed with exit code 1 (use -v to see invocation) のようなエラーが出ます、、、。 このエラー文を調べてみたところ、何か足りないライブラリがあったりするときに出ることがあるみたいなのですが、何がいけないのかよくわからず、、、。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問