【Unity】雷达+Unity +TUIO 介绍二

5 篇文章 11 订阅
1 篇文章 0 订阅

在上一遍 我们大概了解TUIO协议 和雷达 都是什么鬼,这篇主要是介绍一下 unity 与 tuio 的通信 

首先我们是在Unity 中引入了两个库 OSCsharp  TUIOsharp进行接收数据

具体库中信息可查看 https://github.com/valyard/TUIOsharp

/*

	Simple TUIO v1.1 / OSC v1.1 network listener.
	
	Listen for TUIO or OSC network traffic and output it to the console. Useful for quickly checking/debugging data sent from TUIO server apps.
	
	Defaults to listening for TUIO on port 3333. Output radians/degrees using rads/degs options. Invert X/Y axis values in TUIO data using the invertx/y/xy options.
	
	Usage:
		> mono TUIOListener [port] [tuio|osc] [rads|degs] [invertx|inverty|invertxy]
		> mono TUIOListener -help

	Libraries:
		https://github.com/valyard/TUIOsharp (v1.1 development branch)
		https://github.com/valyard/OSCsharp

	
	Author:
		Greg Harding greg@flightless.co.nz
		www.flightless.co.nz
	
	Copyright 2015 Flightless Ltd.
	

	The MIT License (MIT)

	Copyright (c) 2015 Flightless Ltd

	Permission is hereby granted, free of charge, to any person obtaining a copy
	of this software and associated documentation files (the "Software"), to deal
	in the Software without restriction, including without limitation the rights
	to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
	copies of the Software, and to permit persons to whom the Software is
	furnished to do so, subject to the following conditions:

	The above copyright notice and this permission notice shall be included in all
	copies or substantial portions of the Software.

	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
	IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
	OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
	SOFTWARE.

*/

using System;
using System.Threading;
using System.Collections.Generic;
using System.Text;

using TUIOsharp;
using TUIOsharp.DataProcessors;
using TUIOsharp.Entities;

using OSCsharp;
using OSCsharp.Data;
using OSCsharp.Net;
using OSCsharp.Utils;
using UnityEngine;

namespace TUIOListener
{

    class Program : MonoBehaviour
    {

        //public enum MessageType
        //{
        //    TUIO,
        //    OSC
        //};

        public static int port = 3333;
        //public static MessageType messageType = MessageType.TUIO;
        public static bool degs = false;
        public static bool invertX = false;
        public static bool invertY = false;

        private static TuioServer tuioServer;
        private int screenWidth;
        private int screenHeight;

        private void connect()
        {
            if (!Application.isPlaying) return;
            if (tuioServer != null) disconnect();

            tuioServer = new TuioServer(port);
            Debug.Log("TUIO Port" + port);
            tuioServer.Connect();
            Debug.Log("TUIO Connect");
        }
        private void OnEnable()
        {
            Debug.Log(string.Format("TUIO listening on port {0}... (Press escape to quit)", port));

            screenWidth = Screen.width;
            screenHeight = Screen.height;
            // tuio

            CursorProcessor cursorProcessor = new CursorProcessor();
            cursorProcessor.CursorAdded += OnCursorAdded;
            cursorProcessor.CursorUpdated += OnCursorUpdated;
            cursorProcessor.CursorRemoved += OnCursorRemoved;

            BlobProcessor blobProcessor = new BlobProcessor();
            blobProcessor.BlobAdded += OnBlobAdded;
            blobProcessor.BlobUpdated += OnBlobUpdated;
            blobProcessor.BlobRemoved += OnBlobRemoved;

            ObjectProcessor objectProcessor = new ObjectProcessor();
            objectProcessor.ObjectAdded += OnObjectAdded;
            objectProcessor.ObjectUpdated += OnObjectUpdated;
            objectProcessor.ObjectRemoved += OnObjectRemoved;

            // listen...
            connect();
            tuioServer.AddDataProcessor(cursorProcessor);
            tuioServer.AddDataProcessor(blobProcessor);
            tuioServer.AddDataProcessor(objectProcessor);





            Debug.Log("connect");
        }

        protected void OnDisable()
        {
            disconnect();
        }


        private void OnCursorAdded(object sender, TuioCursorEventArgs e)
        {
            var entity = e.Cursor;
            lock (tuioServer)
            {
                //var x = invertX ? (1 - entity.X) : entity.X;
                //var y = invertY ? (1 - entity.Y) : entity.Y;
                var x = entity.X * screenWidth;
                var y = (1 - entity.Y) * screenHeight;
                Debug.Log(string.Format("{0} Cursor Added {1}:{2},{3}", ((CursorProcessor)sender).FrameNumber, entity.Id, x, y));
            }
            Debug.Log("OnCursorAdded");
        }

        private void OnCursorUpdated(object sender, TuioCursorEventArgs e)
        {
            var entity = e.Cursor;
            lock (tuioServer)
            {
                //var x = invertX ? (1 - entity.X) : entity.X;
                //var y = invertY ? (1 - entity.Y) : entity.Y;
                var x = Mathf.Round(entity.X * screenWidth);
                var y = (1 - entity.Y) * screenHeight;
                Debug.Log(string.Format("{0} Cursor Moved {1}:{2},{3}", ((CursorProcessor)sender).FrameNumber, entity.Id, x, y));
                //MyTest.Instance.LimitGetPos(remapCoordinates(new Vector2(x, y)));
                //项目中测试方法 
                //MyTest.Instance.LimitGetPos(new Vector2(x, y));
            }
            Debug.Log("OnCursorUpdated");
        }

        private void OnCursorRemoved(object sender, TuioCursorEventArgs e)
        {
            var entity = e.Cursor;
            lock (tuioServer)
            {
                Debug.Log(string.Format("{0} Cursor Removed {1}", ((CursorProcessor)sender).FrameNumber, entity.Id));
            }
        }

        private static void OnBlobAdded(object sender, TuioBlobEventArgs e)
        {
            var entity = e.Blob;
            lock (tuioServer)
            {
                var x = invertX ? (1 - entity.X) : entity.X;
                var y = invertY ? (1 - entity.Y) : entity.Y;
                var angle = degs ? (entity.Angle * (180f / Math.PI)) : entity.Angle;
                Debug.Log(string.Format("{0} Blob Added {1}:{2},{3} {4:F3}", ((BlobProcessor)sender).FrameNumber, entity.Id, x, y, angle));
            }
            Debug.Log("OnBlobAdded");
        }

        private static void OnBlobUpdated(object sender, TuioBlobEventArgs e)
        {
            var entity = e.Blob;
            lock (tuioServer)
            {
                var x = invertX ? (1 - entity.X) : entity.X;
                var y = invertY ? (1 - entity.Y) : entity.Y;
                var angle = degs ? (entity.Angle * (180f / Math.PI)) : entity.Angle;
                Debug.Log(string.Format("{0} Blob Moved {1}:{2},{3} {4:F3}", ((BlobProcessor)sender).FrameNumber, entity.Id, x, y, angle));
            }
            Debug.Log("OnBlobUpdated");
        }

        private static void OnBlobRemoved(object sender, TuioBlobEventArgs e)
        {
            var entity = e.Blob;
            lock (tuioServer)
            {
                Debug.Log(string.Format("{0} Blob Removed {1}", ((BlobProcessor)sender).FrameNumber, entity.Id));
            }
            Debug.Log("OnBlobRemoved");
        }

        private static void OnObjectAdded(object sender, TuioObjectEventArgs e)
        {
            var entity = e.Object;
            lock (tuioServer)
            {
                var x = invertX ? (1 - entity.X) : entity.X;
                var y = invertY ? (1 - entity.Y) : entity.Y;
                var angle = degs ? (entity.Angle * (180f / Math.PI)) : entity.Angle;
                Debug.Log(string.Format("{0} Object Added {1}/{2}:{3},{4} {5:F3}", ((ObjectProcessor)sender).FrameNumber, entity.ClassId, entity.Id, x, y, angle));
            }
            Debug.Log("OnObjectAdded");
        }

        private static void OnObjectUpdated(object sender, TuioObjectEventArgs e)
        {
            var entity = e.Object;
            lock (tuioServer)
            {
                var x = invertX ? (1 - entity.X) : entity.X;
                var y = invertY ? (1 - entity.Y) : entity.Y;
                var angle = degs ? (entity.Angle * (180f / Math.PI)) : entity.Angle;
                Debug.Log(string.Format("{0} Object Moved {1}/{2}:{3},{4} {5:F3}", ((ObjectProcessor)sender).FrameNumber, entity.ClassId, entity.Id, x, y, angle));
            }
        }

        private static void OnObjectRemoved(object sender, TuioObjectEventArgs e)
        {
            var entity = e.Object;
            lock (tuioServer)
            {
                Debug.Log(string.Format("{0} Object Removed {1}/{2}", ((ObjectProcessor)sender).FrameNumber, entity.ClassId, entity.Id));
            }
        }
        void disconnect()
        {
            if (tuioServer != null)
            {
                tuioServer.RemoveAllDataProcessors();
                tuioServer.Disconnect();
                tuioServer = null;
            }
        }
    }

}

这样你就可以与雷达正常互动了,当然了 你光有雷达是不行的,你需要一个终端软件,这个你谷歌一下就可以搜出来,一般这个软件都是有厂家开发的 有一款是用Unity 做了一个客户端,里面融入了一个dll,如果想使用的话,基本上是一个加密狗 + 软件进行使用,而雷达厂商提供c的demo代码是纯c的,但是可以被认c语法的编程环境认,就从雷达厂商给的代码是c的都能看出来他们主要给单片机用和stm32用。

目前项目还在实践ing~~~~~~

下一篇将介绍tuio + 雷达 + Unity 的探坑之旅

  • 12
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unity_阿黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值