鸟语天空
雷达+Unity+TUIO实现与投影交互
post by:追风剑情 2019-11-22 11:47

http://www.tuio.org

雷达 + 投影 + unity 基本上属于展示类项目的主流

与投影交互原理

diagram.png

TUIO(Table-Top User Interfaces Objects): 一种多点触控通讯协议,默认端口号3333

TUIO模拟器下载 百度网盘下载  提取码 pdd2

一、Untiy从资源商店下载TouchScript插件

1111.png

22222.png

3333.png
勾选上Enable Debug Mode、Enable TUIO后,将自动添加以下宏定义
22222.png

二、TUIO关键代码分析

TuioInput.cs

namespace TouchScript.InputSources
{
	public sealed class TuioInput : InputSource
	{
		//监听3333端口
		private void connect()
		{
			if (!Application.isPlaying) return;
			if (server != null) disconnect();

			server = new TuioServer(TuioPort);
			server.Connect();
			updateInputs();
		}

		//收到TUIO协议
		public override void INTERNAL_DiscardPointer(Pointer pointer)
		{
			if (pointer.Type == Pointer.PointerType.Touch)
			{
				touchPool.Release(pointer as TouchPointer);
			}
			else if (pointer.Type == Pointer.PointerType.Object)
			{
				objectPool.Release(pointer as ObjectPointer);
			}
		}
	}
}


三、Unity接收TUIO事件

1、在主摄像机上挂上StandardLayer脚本,用来设置要响应触碰操作的对象类型和层。

555.png

StandardLayer脚本会屏蔽掉UGUI自己的事件响应(即,无法直接点击UI)


2、场景中添加TuioInput脚本
66666.png
Tuio Port: 要监听TUIO协议的端口号
Input Types: 要监听的事件类型

3、写个测试脚本
77777.png

TuioListener.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//需要引入这两个命名空间
using TouchScript;
using TouchScript.Pointers;

public class TuioListener : MonoBehaviour
{
    void Start()
    {
        TouchManager.Instance.PointersPressed += OnPointersPressed;
    }

    private void OnPointersPressed(object sender, PointerEventArgs e)
    {
        Debug.Log("[Test] OnPointersPressed");
        //打印所有触点信息
        IList<Pointer> pointers = e.Pointers;
        for (int i=0; i<pointers.Count; i++)
        {
            Pointer p = pointers[i];
            Debug.LogFormat("Id={0}, Type={1}, Buttons={2}, Position={3}, PreviousPosition={4}, Flags={5}",
                p.Id, p.Type, p.Buttons, p.Position.ToString(), p.PreviousPosition.ToString(), p.Flags);
            //检测是否点中了3D物体
            Raycast(p.Position);
        }
    }

    private Vector3 origin, direction;
    private void Update()
    {
        //在场景中显示射线方便观察调式
        Debug.DrawRay(origin, direction, Color.red);
    }

    //发射射线
    private void Raycast(Vector2 screenPoint)
    {
        Ray ray = Camera.main.ScreenPointToRay(screenPoint);
        origin = ray.origin;
        direction = ray.direction;
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, int.MaxValue))
        {
            Debug.Log("检测到物体: " + hit.transform.name);
        }
    }
}

运行测试 (在TUIO模拟器中点击鼠标,Test.cs脚本就会收到消息)
4444.png

评论:
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容