Leap Motion+ unity3D 初探(一): 手势控制object transform

昨天Leap Motion到货,setup十分简单,玩了几个商店里免费的应用,操作还挺流畅。对开发者,关于C#和unity3D 官网从overview到api的具体介绍都很详细,于是简单上手试了试,主要是利用手势控制gameobject的变换(移动、旋转等)等。

Leap Motion+ unity3D 初探(一): 手势控制object transform_第1张图片

需要预先说明,leap SDK for unity是作为plugin library获取leap数据的,而免费版的U3D不支持native plugins。对此开发者中心也有办法能够使免费版的U3D使用leap SDK,原文猛击:https://developer.leapmotion.com/articles/creating-leap-apps-with-unity-standard-license,本文中U3D为Pro版本。

1.首先新建unity工程

2.在项目根目录下新建Plugins文件夹,从下载好的SDK(https://developer.leapmotion.com/downloads)中找到 ~/LeapSDK/lib/UnityAssets/Plugins,将里面的内容放到Plugins文件夹中。之后找到 ~/Examples/UnitySandbox/Assets/Scripts/Leap/LeapUnityExtensions.cs,同样复制到Plugins文件夹。这时plugins内应有LeapCSharp.bundle,LeapCSharp.NET3.5.dll,以及LeapUnityExtensions.cs,至此SDK就算搞定,十分方便。

3.场景内创建一个plain和一个cube(用以移动)Leap Motion+ unity3D 初探(一): 手势控制object transform_第2张图片

4.在plugins中新建cs脚本,命名LDCLeapControl.cs,在IDE中添加代码如下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Leap;

public static class LDCLeapControl
{
	public static float ROTATE_MOD = 3.14F;
	
	//member variables;
	static Leap.Controller _controller;
	static Leap.Frame _frame;
	static Leap.Hand _hand;
	
	static LDCLeapControl()
	{
		_controller = new Leap.Controller();
	}
	
	//getters
	public static Leap.Frame Frame
	{
		get
		{
			return _frame;
		}
	}
	public static Leap.Hand Hand
	{
		get
		{
			return _hand;
		}
	}
	//get latest frame called each second
	public static void Update () 
	{
		if(_controller != null)
		{
			Frame lastFrame = _frame == null ? Frame.Invalid : _frame;
			_frame = _controller.Frame();
			if(_frame != null)
			{
				if(_frame.Hands.Count > 0)
				{
					_hand = _frame.Hands[0];
				}
			}
		}
	}
	
	public static float getHandInput(string gesture)
	{
		float leapData = getLeapData(gesture);
		return leapData;
	}
	
	private static float getLeapData(string gesture)
	{
		Update();
		float leapData = 0.0F;
		
		if(_hand != null)
		{
			Vector3 PalmPosition = new Vector3(0,0,0);
			Vector3 PalmNormal = new Vector3(0,0,0);
			Vector3 PalmDirection = new Vector3(0,0,0);
			PalmPosition = _hand.PalmPosition.ToUnityTranslated();
			PalmNormal = _hand.PalmNormal.ToUnity();
			PalmDirection = _hand.PalmPosition.ToUnity();
			
			if(gesture == "Rotation")
			{
				leapData = -ROTATE_MOD * PalmNormal.x;
			}
		}
		return leapData;
	}
}

首先引用leap命名空间,其中controller作为主接口,用以取得leap的跟踪数据,调用frame()方法可实时获取最新帧。Frame表示每一帧中探测到的一系列手以及手指的数据,包含了Hands,Fingers,Pointables以及Tools等属性。而本文中使用的Hand,表示探测到用户的手及其各种信息,包括手掌方向向量Direction,手掌法向量PalmNormal,手掌距离leap motion远点的距离PalmPosition,手掌移动的速率PalmVelocity...等等。

回顾LDCLeapControl这个单例,Update()方法用以取得最新的帧数据,用以控制object的手被设定为出现在frame中handlist内的第一只出现的手(ID=0)。在getLeapData()方法中,获取hand的属性PalmNormal(这里仅以旋转为例),其在x方向的分量校准后作为我们对应旋转"Rotation"获取到的leap数据。

这时,LDCLeapControl作为一个native plugin已经可以为我们所用了,在Assets中新建脚本:moveBehaviour.cs,并添加代码如下:

using UnityEngine;
using System.Collections;

public class moveBehaviour : MonoBehaviour {
	
	public float smooth = 2.0f;
	public float tiltAngle = 60.0f;
	public bool leapIsEnabled = false;

	void Update () 
	{
		if(leapIsEnabled)
		{
			float rotate = LDCLeapControl.getHandInput("Rotation");
			float tiltAroundY = rotate * tiltAngle;
			Quaternion target = Quaternion.Euler(0, tiltAroundY, 0);
			transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth);
		}

	}
}
在这里利用取得的leapData作为object旋转的quaternion值(position移动等变换同理,略),将该行为付给cube(打开leapIsEnabled开关),运行,现在随着你手腕的左右旋转,方块也会在y方向上旋转了。

Leap Motion+ unity3D 初探(一): 手势控制object transform_第3张图片

Leap Motion+ unity3D 初探(一): 手势控制object transform_第4张图片


你可能感兴趣的:(unity3d,HCI)