leapmotion文档(3):创建一个unity3d项目

来源:互联网 发布:os x 怎么恢复mac系统 编辑:程序博客网 时间:2024/06/05 19:02

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<LeapProvider>() 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的参考系中而不能和场景中的手匹配。


0 0