Leapmotion asset package包括在windows环境中使用leapmotion设备的插件。这个工具包包括了手的预制件,脚本和一些演示场景。
从leap motion asset package下载leap motion asset package。
需要注意,开发包unity4.0以上版本仅适用于windows系统,并需要orion beta服务。更早版本可用于mac和windows,但是需要2.3版本的leapmotion服务。你不能将orion中的元素和早期资源开发包混用,他们不兼容。
创建一个项目
首先,创建一个unity项目:
1.打开unity。
2.选择File>New Project。
3.输入名字选择保存地址。
4.点击Create Project。
然后导入Leap Motion asset package到项目中。
1.下载资源包。
2.选择Assets>Import Pacakage>Custom Package
3.找到你下载的资源包的位置点击Open。
如果项目已经包含了leap motion assets,你需要删除旧的(项目备份)再导入新的。unity导入过程仅仅是加入新的文件并且覆盖已更改的文件。他不会移除废除的文件(有时候会创建已存在文件的副本而不是覆盖它)
导入模块
关于orion(是一种开发套件),我们已经把unity资源分成一个由可选模块支持的核心包。核心包可以用来进行手势追踪,但是你只需要其中包含你想要特征的模块。这些模块不依赖于彼此是独立的。当前可用的模块包括:
1.attachment-提供unity手模型,这个模型可以用手上的多个部位去碰触游戏物体。
2.hands-提供另外的图形手模型和一些使用3d手模型的工具。
3.interaction engine-提供一些手和虚拟3d物体交互时的物理特性,以及一些可扩展的机制用于特定物体和场景的交互。
4.UI input-让手能控制一些标准的unity ui元素
5.detection example-提供一些使用检测特征的样例,这也是核心资源包的一部分。这个模块不会添加新的特征(尽管有些脚本案例很有用。)
导入模块和之前导入leapmotion资源包一样。
在VR场景中添加手
用LMHeadMountedRig替代场景中多有存在的相机设备。
把LMHeadMountedRig预制件放在使用者的初始视角处。场景中的手的位置要和你真实的手和leapmotion的位置相一致。
在场景中增加一个手。
1.移除已存在的相机或相机装置。
2.把预制件拖进场景的hierachy中。
3.确定预制件的位置。像任何的VR相机一样,这个位置和角度将成为场景的初试视角。
4.添加手的模型到Hand Pool中。在LeapHandController插件里。
a.在hierarchy中选择LeapHandController。
b.设置hand pool的模型池数量为2。池中将会创建两个元素。
c.将一个元素命名为“gfx_hands”。
d.拖动想要的手的预设到左和右属性中。
e.勾选is enabled和can duplicate两个选项。
f.重复第二个元素,使用物理手预设。
你可以直接在hand pool中使用预设,也可以首先把手模型放到场景hierarchy中。如果你把手模型放到了场景中,注意,我们就不推荐把模型作为leaphandcontroller的子模型了。这个模块需要从相机层出去,否则会闪烁在头部移动的时候。
5.运行场景
你应该看到手出现在game视窗中,当你把手放在leapmotion设备上。如果没有看到手,打开leapmotion观察器确定你的设备和电脑连接好了可以传送追踪数据。如果unity中的手出了场景,你可以暂停game用scene视窗去定位他们。
在desktop场景中加入手
把leaphandcontroller预制件放在你想要手出现的地点下方。手被放在场景中的位置要参考现实中手和leapmotion的相对位置。你可以改变手移动比例设置,这样就可以让手可以移动更大的范围。
把手加入到场景中:
1.在文件菜单中,找到leaphandcontroller预设。Assets/LeapMotion/Prefabs
2.把leapHandController拖到场景视窗中。
3.把预设放在你想要的位置。如果要看手,LeapHandController要在相机视野内。
4.创建一个空物体命名为“HandModels”。这个物体应该和LeapHandController同级而不是作为他的子物体。
5.把想要的手预设拖入HandModels物体中。你需要左右两个预设分别代表左右手,而且需要至少两个集合:一个作为视觉显示,另一个用作unity物理交互。你可以拥有随便几个集合。
6.在hierarchy中选择LeapHandController
7.把HandModels物体拖到LeapHandController的hand pool插件中的ModelsParent中。
8.设置hand pool的值为2,创建了两个元素。
9.其中一个元素命名为“gfx_hands”
10.HandModels物体中的图形手模型到左右手模型属性中。
11.设Is Enable和Can Duplicate为真。
12.对第二个属性做一样的操作,使用物理手预设。你可以在hand pool中直接使用预设。
注意:capsulehand预设只能1:1比例。
13.运行场景。
使用leapmotion接口
除了资源包中的预设和脚本。你可以写你自己的脚本来使用从leapmotion接口追踪到的数据。leapmotion类被定义为Leap命名空间。一个基础类MonoBehavior,他可以使用leapmotion接口。下面有个例子。这个脚本移动物体到左手掌下方)
using UnityEngine;
using System.Collections.Generic;
using Leap;
public class LeapBehavior : MonoBehaviour {
LeapProvider provider;
void Start ()
{
provider = FindObjectOfType() as LeapProvider;
}
void Update ()
{
Frame frame = provider.CurrentFrame;
foreach (Hand hand in frame.Hands)
{
if (hand.IsLeft)
{
transform.position = hand.PalmPosition.ToVector3() +
hand.PalmNormal.ToVector3() *
(transform.localScale.y * .5f + .02f);
transform.rotation = hand.Basis.Rotation();
}
}
}
}
这个脚本,LeapUnityExtensions.cs在Assets/LeapMotion/Scripts/utils中。提供了有帮助的扩展功能将leapmotion中的矩阵向量转化到unity接口中。上面用到函数ToVector3()和Rotation()在脚本中被定义。
(上面的代码是直接复制官网的,运行的时候发现还要加using Leap.Unity;并且rotation那一句会出现错误,等以后解决了再来更新这篇。)
注意:在大多数情况中,你需要从场景的leapprovider物体中获得Frame object。LeapmotionProvider将帧数据转化为适合参考系,如果你从leap中获得一帧。控制对象,这个数据将依然在leapmotion的参考系中而不能和场景中的手匹配。