Unity与Kinect结合开发思路

Unity与Kinect结合开发思路

一.全屏:

思路:Kinect的手的节点(这里都是右手,左手的效果一致)在Unity中移动的距离是很小的,你可以用一个物体绑定到手上,然后就能看到具体能够移动多大的范围了。

1.因为手的移动范围很小,因此建立一个虚拟的小屏(2D,屏幕坐标),长宽就是你手上下左右移动的最大距离(在Unity中)。

2.换算出虚拟小屏的X/Y轴与实际屏幕的X/Y轴的比例,可以保存可以不保存,这个自己记住就成大小无所谓,甚至可以考虑相应的稍微减少一点值,以方便比你更加瘦小的人使用到全屏功能。但请记住,这个虚拟小屏是固定的不会移动的,要移动的是实际操作的人。

3.将手的世界坐标利用Camera.WorldToScreenPoint(手的Position位置)换算出屏幕坐标点,并保存好Z轴的值。

4.算出手的屏幕坐标与虚拟小屏X/Y轴的比例,然后利用第2步中得到的虚拟屏幕与实际屏幕的比例,可以得到一个虚拟的扩大后的手的屏幕坐标。(具体算法请自己考虑。)

5.利用第5步算出的X/Y轴的值,加上第3步得到的Z轴的值,通过Camera.ScreenToWorldPoint()方法得到在Unity中的世界坐标的Position值(这个值是虚拟出来的)。

6.将第5步取得的Position值实时的赋给某个作为鼠标的物体的transform.position.

利用以上6步就能做到鼠标物体全屏移动了。

二.防抖:

因为通过Kinect取得的手的坐标点是在不断的抖动的,因此,如果你仅仅是利用“一”中的思路去做,可能看到的效果是手在不停的抖动的。因此我们需要防抖。

思路:1不断的去算鼠标物体(以后用鼠标代替)与“一”中得到的虚拟实际坐标的距离

2.利用Mathf.Lerp来不断的改变鼠标的Position的值。

3.提示,可以自己设定一个数值变换的速度,然后考虑将距离融入到速度中去。

其实上就是将“全屏”的第6步换成上面的1+2两步。。

三.模拟鼠标点击:

要利用Kinect去模拟鼠标点击的功能,必须要使用一个物体作为屏幕中的鼠标代替实际的物理鼠标。然后利用上面的:全屏+防抖方法使Kinect能够控制鼠标物体满屏移动。

因为是利用物体模拟的鼠标,所以了,OnMouseDown肯定是没用的啦。所以要利用到了OnTriggerEnter()和OnTriggerExit()方法了。

为了确保鼠标能够点击到按钮,那么就需要将按钮的Collider范围扩大,并且最好能够保持鼠标和按钮处在同一平面或者相互平行的平面,且鼠标与 摄像机的相对距离要比按钮与摄像机的相对距离小(若要如此设定,那么在“全屏”中的第6步中,改变的将仅仅是X/Y的值,Z的值用鼠标的原始值;同理,在 “防抖”中第2步改变的值也只是X/Y轴的值,Z轴用原始的鼠标物体的值。)。

重点建议:如果要保证鼠标始终在屏幕内,那么最好是用一个正交摄像机去单独渲染鼠标物体和所有的按钮。那么以上的所有的计算用到的摄像机类(Camera)都是这次设定的正交摄像机了。

以下所有的代码操作的要求均建立在官方的KinectSDK1.5的基础上(除DEMO版,1.0的也通用,至于有些用OPEN NI的,我的方法应该有些辅助作用)。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值