昨天Leap Motion到货,setup十分简单,玩了几个商店里免费的应用,操作还挺流畅。对开发者,关于C#和unity3D 官网从overview到api的具体介绍都很详细,于是简单上手试了试,主要是利用手势控制gameobject的变换(移动、旋转等)等。
需要预先说明,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就算搞定,十分方便。
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方向上旋转了。