用体感来实现UI控件的点击,如点击按钮。

做法:用一个图片表示左手手掌,图片位置追踪左手手掌移动,当手掌位于UI控件的矩形内时,握拳表示点击该控件。

using UnityEngine;
using System.Collections;
using UnityEngine.UI; /// <summary>
/// 用Kinect实现UI的点击:追踪左手手掌,移动到UI矩形内握拳表示点击该按钮。
/// </summary>
public class UIClick : MonoBehaviour { public Canvas canvas;
public Image leftHandImage; // 表示左手
public Image btnImage; // 要被点击的UI控件 KinectManager _manager; // Use this for initialization
void Start()
{ } // Update is called once per frame
void Update()
{
if (_manager == null)
{
_manager = KinectManager.Instance;
} // 是否初始化完成
if (_manager && _manager.IsInitialized())
{
// 是否人物被检测到
if (_manager.IsUserDetected())
{
// 获取用户ID
long userId = _manager.GetPrimaryUserID();
// 获取目标关节点的索引(以左手为例)
int jointIndex = (int)KinectInterop.JointType.HandLeft;
// 判断目标关节点是否被追踪
if (_manager.IsJointTracked(userId, jointIndex))
{
// 获取目标关节点在Kinect坐标系(世界坐标)的位置
Vector3 leftHandPos = _manager.GetJointKinectPosition(userId, jointIndex);
// 左手的世界坐标 --> 屏幕坐标
Vector3 leftHandScreenPos = Camera.main.WorldToScreenPoint(leftHandPos);
Vector2 leftHandScreenPosTemp = new Vector2(leftHandScreenPos.x, leftHandScreenPos.y); // 降维 // 判断左手的UGUI坐标是否在Canvas所表示的矩形内
Vector2 leftHandUguiPos;
if (RectTransformUtility.ScreenPointToLocalPointInRectangle((RectTransform)canvas.transform, leftHandScreenPosTemp, null, out leftHandUguiPos))
{
RectTransform leftHandRTF = rightHandImage.transform as RectTransform;
// 屏幕坐标 --> UGUI坐标
leftHandRTF.anchoredPosition = leftHandUguiPos;
} // 判断左手的UGUI坐标是否在Button所表示的矩形内
if (RectTransformUtility.RectangleContainsScreenPoint(btnImage.rectTransform, leftHandScreenPosTemp, null))
{
Debug.Log("在按钮中");
// 获取左手的手势状态
KinectInterop.HandState leftHandState = _manager.GetLeftHandState(userId);
if (leftHandState == KinectInterop.HandState.Closed)
{
Debug.Log("左手握拳");
// todo:点击按钮触发的事件
}
}
else
{
Debug.Log("在按钮外");
}
}
}
}
}
}

注意点:

  • 摄像机的坐标要设为Vector3.zero,且设为透视图。
  • 获取关节点坐标要用GetJointKinectPosition()而不是GetJointPosition()

【Unity/Kinect】Kinect实现UI控件的点击的更多相关文章

  1. Kinect用体感来实现UI控件的点击

    用体感来实现UI控件的点击,如点击按钮. 做法:用一个图片表示左手手掌,图片位置追踪左手手掌移动,当手掌位于UI控件的矩形内时,握拳表示点击该控件. using UnityEngine; using ...

  2. 【Unity】8.1 Unity内置的UI控件

    分类:Unity.C#.VS2015 创建日期:2016-04-27 一.简介 Unity 5.x内置了-套完整的GUI系统,提供了从布局.控件到皮肤的-整套GUI解决方案,因此可直接利用它做出各种风 ...

  3. C#程序员整理的Unity 3D笔记(十五):Unity 3D UI控件至尊–NGUI

    目前,UGUI问世不过半年(其随着Unity 4.6发布问世),而市面上商用的产品,UI控件的至尊为NGUI:影响力和广度(可搜索公司招聘Unity 3D,常常能看到对NGUI关键词). NGUI虽然 ...

  4. 优化UI控件 【译】

    翻译自:https://unity3d.com/cn/learn/tutorials/topics/best-practices/optimizing-ui-controls?playlist=300 ...

  5. unity4.6 Beta版 UI控件之Button

    近期需求,须要用到4.6版本号uGui了,所以抽时间来学习学习,就UI控件在Unity工具里创建预设这块来说相比較于NGUI,我认为是没有什么太大的差别的. 比方:Canvas--Camera . T ...

  6. ANDROID L——Material Design详解(UI控件)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  7. WinForm/Silverlight多线程编程中如何更新UI控件的值

    单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如果在一个新线程中这么 ...

  8. 富客户端 wpf, Winform 多线程更新UI控件

    前言 在富客户端的app中,如果在主线程中运行一些长时间的任务,那么应用程序的UI就不能正常相应.因为主线程要负责消息循环,相应鼠标等事件还有展现UI. 因此我们可以开启一个线程来格外处理需要长时间的 ...

  9. UI控件(复习一下)

    如何修改控件状态• 可见,确实需要经常修改控件状态• 那如何去修改控件的状态呢?方法很简单➢ 每一个UI控件都是一个对象➢ 修改UI控件的状态,其实就是修改控件对象的属性➢ 比如修改UILabel显示 ...

随机推荐

  1. oracle-imp导入小错filesize设置

    ***********************************************声明*************************************************** ...

  2. leetcode || 58、Length of Last Word

    problem: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', ret ...

  3. iOS 网络编程 TCP/UDP HTTP

    一.HTTP协议的主要特点: 1. CS模式 2. 简单快速:只需要传送请求方法和路径.(常用方法有GET,HEAD,POST) 3. 灵活:任意对象都可以,类型由Content-Type加以标记 4 ...

  4. 【jQuery】网上看到一个不错的登陆界面

    预览截图如下: Html部分代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  5. centos7 搭建go环境

    下载go #cd /home #mkdir app #cd app #wget https://storage.googleapis.com/golang/go1.9.linux-amd64.tar. ...

  6. 转python+selenium 使用switch_to_alert 出现的怪异常

    如果switch_to_alert不工作,最重要的问题就是,有1个以上的浏览器开启,导致alert抓取不到.并且在使用switch_to_alert的时候时间会比较长一些,需要等待一会儿才能完成acc ...

  7. PO_职位职务审批模式详解(设定)

    2014-06-03 Created By BaoXinjian

  8. kubernetes 二

    部署harbor Habor是由VMWare中国团队开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获 得了更加广泛的应用,这些新的企业级特性包括 ...

  9. PHP Client for Mysql Binlog

    PHP解析MySQL Binlog,依赖于mysql-replication-listener库 详见:https://github.com/bullsoft/php-binlog Install M ...

  10. 读书笔记5基于matplotlib画图

    一.导入需要的模块 import numpy as np import matplotlib.pyplot as plt import seaborn as sns import scipy.stat ...