Leap Motion 之Unity 开发指南(一. 基本概念与制作手预制件)

LeapMotion 之Unity开发指南(一.基本概念和手的预制件)

【序言】

最近用Leap Motion + 国产的3Glass眼镜构建了房地产、数字矿山的一些应用,感觉这是很经济的一个VR架构方案,比用Oculus和HTC的硬件要省钱得多,并且效果也不错。

在行业VR应用中,其实重在培训教育、生产安全的仿真演练上,更多地通过一些UI互动、基础性的手势(比如开关设备、拾起灭火装备等)来进行交互,这些并不一定需要非常昂贵的激光定位设备、复杂的硬件套件才可实现,而手势识别在未来也是一个趋势。

所以将一些开发积累整理下来,希望不断地能在这个领域中学习领会,最终能为行业客户创造一些实用的价值。  欢迎大家和我一起交流,QQ:115913892 

一.  安装

1.      打开官网:https://developer.leapmotion.com/get-started

2.      先要下载和安装LeapMotion的驱动程序

注:我买的是二代Leap Motion,所以在Win10下 不支持V2 Desktop的开发驱动,选择左面的。(注意是开发驱动,而非App应用)

我下载的最新版本是3.1.2,解压后如下图。

运行EXE文件,根据提示安装驱动,实际上这将安装了一个驻留程序在系统托盘中,并且生成一个自动启动的系统服务Leap Service,在控制面板中可查看它,当遇到Leap Motion不工作,或者托盘中图标显示黑色时,可检查一下这个服务是否正常。

驱动程序与LeapService通讯,读取硬件层面3D摄像头跟踪的手势数据,上层类的应用(如Unity,虚幻4,Java等)则与驱动程序(C++写成)通讯。

安装成功后,能看到LeapMotion两个摄像头和中间LED灯都正常亮起,表明处于工作状态,这时可用自动安装的Leap App Home应用来测试一下,通过它还可下载一些官方的例子。

3.      下载准备好各类Unity包

https://developer.leapmotion.com/unity下载所需的包。

其中CoreAssert是核心包,其他都是封装好的各类功能包,在实战篇中会介绍。

二.  基本概念

1.   坐标系统

Unity使用左手坐标,LeapMotion使用右手坐标(所以,Z轴是相反的)。

Unity以米为单位,LeapMotion使用毫米。LeapMotion配备的Plugin脚本内部对坐标系统进行了转化,即将单位和坐标转化为Unity的标准。

注意:在Unity中,一定要从LeapServiceProvider中获得Frame对象,否则在帧中的数据(TrackingData)将还使用Leap的坐标系统。LeapServiceProvider解析了Scaling,Rotation,Translation的变换.

2.   手势跟踪

LeapMotion使用了光学传感器和红外光组件。传感器的FOV为150度。顶部0.03~0.06米为有效的跟踪范围。

最佳的工作环境是可产生清晰的、高对比度对象轮廓的光照环境。

HMD模式下(头盔绑定的模式 ),跟踪算法被优化成对不同的视角下识别手势(大概的意思可能是,你头盔多动动,识别得更好一些),比放在桌面固定不动要更好一些。

3.   手(Hand Assert)

(1)表示方法

在预制件目录下,分成图形(图元)和物理两组脚本和预制件,可以用其中各一来组合表示手。这一处一定要理解,官方的Unity包里给了一些场景例子,可以研习一下。

从概念上手被区分成Graphic和Physic两种组件构成,前一即是图元,主要是呈现手的外观,后一主要表现手的物理特性(如刚体、碰撞)。

也可以没有物理组件,这样就不能产生物理特征了。

(2)创建手的方法

有几种创建手的方法:

  • 单独创建手的不同部位,比如手掌、胳膊、手指;
  • 创建绑骨骼的Mesh,驱动关节和骨骼来表示手的动作;
  • 用脚本编写来表示手的图形(即完全用脚本来绘制)。

(3)一个例子

下图是一个典型的手的例子,一个HandController下挂4个子对象,分别是图元左右手,物理左右手。

三.  创建你自己的手Prefab

注:跟着官方例子创建一个手,可能并不是很实用,但有助于理解手的预制件和原理组成。

你可以创建类似于已提供的Unity包里的手预制件,用你自己的图形来表示手,同时定制自己的手的行为(基于已提供好的代码)。

我们要创建的这种手称为“离散手预制件Discrete Hand Prefabs”,意思是手上每个部位都是单独的Game Object,都有其单独的位置和方向信息。在Core assert 包里,机器人的手即是这样的“离散预制件”。下面介绍了通过使用Unity自带的几何体(圆柱、圆)来创建Prefab。

  • 每一个图形元素都放在一个空对象下。手和手指的脚本负责更新空对象的Transform。每个图元的Local Transform的位置和方位依从于父对象。
  • 移除图形手上的所有碰撞体,否则将引起RigidHand的碰撞反弹。
  • 通常你不需要同时拥有关节和骨头。他们不是相互独立的。本教程中我们同时将关节和骨头加进模型中只是为了演示他们是如何工作的。
  • 类似的,你的模型也不必同时具有掌骨和手掌。掌骨是被手掌包围的,并且不能单独地动作。本教程同时具有二者(为了演示)。
  • 对手模型使用真实世界的尺寸。手和手指的脚本不能独立识别相关部位。整体的Scale被赋值成LeapHandController对象的scale(因为是必须挂在HandController下)
  • 由于采用了非常抽象和对称的设计,所以像在本教程中,能使用同样的Prefab表示左手和右手。但大多数的模型还是应使用不同的prefab表示左右手,这样能更好地调整Local Transform。

首先,我们需要创建一个手指的Prefab,并且使用它来创建手Prefab。

创建手指Prefab

1.     创建一个场景.

2.     新建一个空对象,命名KnobbyFinger

3.     创建骨头

1)     新建一个空对象到KnobbyFinger下,命名Metacarpal  (掌骨)

2)     新建一个Cylinder到Metacarpal,命名Tube.在创建你自己的手时,将此Cylinder替换为你自己的图形对象(或Obejct)

3)     移除碰撞体组件,否则RigidHand碰撞体将会与它反弹。

4)     设置X Rotation为90。

(最好设置成Top视野来观察)

5)     将Tube X、Z的Scale设置成0.003(3毫米)。之所以这样设置,是因为要使用带皮肤的骨头,真实的手指要更胖一些。

6)     设置Tube Y的Scale为0.034(34毫米)。这个决定了手指的长度。

尺寸必须使用真实世界的,转化为米。Y的长度应为68mm的一半,这是因为Cylinder是2个单位高。所以我们要Scale缩减50%。.

7)     复制Metacarpal,命名Proximal,Tube的
Y-Scale设置为0.02

8)     再复制Metacarpal,命名Intermediate,Tube的Y-Scale设置为0.01。

9)     再次复制Metacarpal,命名Distal,Tube的Y-Scale为0.007。

4.     创建关节

记住:你不必都需要骨头和关节

1)     新建空对象到KnobbyFinger,取名MetacarpophalangealJoint(掌指关节)。

2)     新建一个圆到关节,取名Knob.

3)     移除碰撞体。

4)     将Knob所有的Scale设置成0.01(1厘米).

5)     复制MetacarpophalangealJoint更名为ProximalinterphalangealJoint.

6)     复制MetacarpophalangealJoint更名为DistalinterphalangealJoint.

6.     增加SkeletalFinger 脚本组件到KnobbyFinger

7.     拖动每个关节和骨头到脚本中的相应变量处。

具体如下:

Bones:

o  0 -Metacarpal

o  1 - Proximal

o  2 -Intermediate

o  3 - Distal

Joints:

o  0 - MetacarpohalangealJoint

o  1 -ProximalinterphalangealJoint

o  2 -DistalphalangealJoint

8.     将KonbbyFinger做成预制件。

创建手Prefab

(创建好手指Prefab后)

1.     创建空对象,取名KnobbyHand.

2.     增加SkeletalHand 脚本到 KnobbyHand.

3.     脚本变量Handedness设置成“Either.” (如果你的手是不对称的,设置成 “Right” or “Left”.)

4.     拖动5个KnobbyFinger Prefab到手中,命名为:Thumb, Index, Middle, Ring, and Pinky.

5.     对于每个手指,设置Finger类型为相对应的类型(SkelatalFinger脚本组件中)。

6.     拖动手指到KnobbyHand 的SkeletalHand 脚本中相应的Fingers变量上.

Finger element order:

o  0 - Thumb

o  1 - Index

o  2 - Middle

o  3 - Ring

o  4 - Pinky

7.     拇指是特殊的,没有Metacarpal. 因此,编辑Thumb,在bone数组中移除bone( element 0 ) . 删除Metacarpal子对象.

8.     增加手掌Add the palm:

如果没有图形元素,你可以在KnobbyHand的SkeletalHand脚本变量Palm,wrist,forearm先留为空白。手掌也可通过RigidHand来表示,如果你不使用palm,你可以修改RigidHand的副本,但要移除rigid body和collider。

1)    增加一个空对象到KnobbyHand.取名Palm.

2)    增加一个Cylinder到 Palm.取名
Disc.

3)    移除Collider.

4)    设置Disc的 scale为
(.085, .0015, .085)..

5)    拖动Palm到SkeletalHand脚本的Palm变量中

9.     增加手腕:

1)    增加一个空对象到KnobbyHand,取名Wrist.

2)    增加一个圆到Wrist.取名 Ball.

3)    移除Collider.

4)    设置Ball的 scale为(.03,
.03, .03).

5)    拖动Wrist到SkeletalHand脚本WristJoint变量中.

10.  增加胳膊

1)    增加一个空对象Arm.

2)    增加一个Cylinder:Rod.

3)    移除Collider.

4)    设置Rod的x rotation为:
90.

5)    设置Rod的scale为:(.02,
.12, .02).

6)    拖动 Arm到SkeletalHand脚本的Forearm

12. 将KnobbyHand创建为prefab.

KnobbyHand的结构应为下图所示:

测试你的手

1.     新建一个LeapHandController prefab到场景中,以便交互区域是在摄影机的FOV内。

2.     设置如下层次结构

3.     在LeapHandController的HandPool中设置:

.

4.     运行关卡,观察你的手

如果RigidHand组件在Scene窗口中可见,但抖动或反弹,确保你移除图元手部位的所有碰撞体。

如果手指重叠或者移动在一个手指的控制下,检查手指SkeletalFinger 脚本的手指类型设置。

如果你的手混杂成一大团的乱糟糟样子,那是每个子元的Scale设置的太大了,记得Unity的单位是1米,一个典型的手宽度是8.5厘米(或者表示成Unity transform的Scale是0.085)。如果想使手更大一些(在游戏里看),增大LeapHandController的Scale.

时间: 2024-12-04 12:05:50

Leap Motion 之Unity 开发指南(一. 基本概念与制作手预制件)的相关文章

【VR】Leap Motion 官网文档 Unity资源与插件

前言: Leap Motion的官网文档已经有不少的热心网友参与了翻译,但没有覆盖官网文档的全部. 为迎合Unity VR的热潮与大家的学习需要,本博客将推出针对Unity方向的官方文档翻译系列. 本篇首先对Leap Motion所提供的Unity资源与插件进行概述. 英文原文网址:https://developer.leapmotion.com/documentation/unity/index.html 译文首发&持续更新:http://blog.csdn.net/duzixi Leap M

【VR】Leap Motion 官网文档 Unity插件概述

前言: Leap Motion的官网文档已经有不少的热心网友参与了翻译,但没有覆盖官网文档的全部. 为迎合Unity VR的热潮与大家的学习需要,本博客将推出针对Unity方向的官方文档翻译系列. 本篇主要对Leap Motion的Unity插件及坐标系系统进行简述. 英文原文网址:https://developer.leapmotion.com/documentation/unity/unity/Unity_Overview.html 译文首发&持续更新:http://blog.csdn.ne

Leap Motion 探究 【第一篇】

由于团队开发需要,今天拿到了Leap Motion做测试开发,也就是历动,一款手部识别传感器. 拿到历动之前已经对它有所了解,然而拿到手后发现确实不如想象中的那么没好,由于基础图像识别,肯定有一些弊端,例如手部遮盖部分识别出错,应用体验一般,应用也比较少等,给我的感觉好像这是一款还处于最后优化的产品,并不能代替现有的交互操作体验.不过,在一些简单的交互上,Leap还是给我了一个很好的反馈,比如手掌的左右倾斜,手指简单的点击操作等. 结合VR交互,这款产品应该是一个颠覆性体验,抛弃了传统的遥控器式

【VR】Leap Motion 官网文档 手型资源

前言: Leap Motion的官网文档已经有不少的热心网友参与了翻译,但没有覆盖官网文档的全部. 为迎合Unity VR的热潮与大家的学习需要,推出的针对Unity方向的官方文档翻译系列. 第三篇 <手型资源> 介绍了Leap Motion为Unity提供的资源包种的手型预设体资源. Hand Assets  手型资源 The Leap Motion core assets for Unity include a number of pre-made hand prefabs assets.

【VR】Leap Motion 官网文档 脚本参考(目录)

前言: 本系列译文是为迎合Unity VR的热潮与大家的学习需要,推出的针对Unity方向的Leap Motion官方文档中英对照翻译. 本篇第四篇 <脚本参考> 以目录链接的形式列出了Leap Motion为Unity提供的核心资源包中所包含的脚本定义的类. 关于每个类的详细内容后续献上,敬请期待. 英文原文网址:https://developer.leapmotion.com/documentation/unity/unity/Unity_Classes.html 译文首发&持续更

转:Oculus Unity Development Guide开发指南(2015-7-21更新)

http://forum.exceedu.com/forum/forum.php?mod=viewthread&tid=34175 Oculus Unity Development Guide开发指南转载请保留原始地   http://t.cn/RAblKoh Oculus/GearVR开发者群 302294234 Welcometo the Unity Development GuideIntroduction简介Welcometo the Oculus Unity Developer Gui

Unity3D中使用Leap Motion进行手势控制

Leap Motion作为一款手势识别设备,相比于Kniect,优点在于精确度. 在我的毕业设计<场景漫游器>的开发中,Leap Motion的手势控制作为重要的一个环节.以此,谈谈开发中使用Leap Motion进行手势识别的实现方式以及需要注意的地方. 一.对Leap Motion的能力进行评估 在设定手势之前,我们必须知道Leap Motion能做到哪种程度,以免在设定方案之后发现很难实现.这个评估依靠实际对设备的使用体验,主要从三个方面: 1.Leap Motion提供的可视化的手势识

【VR】Leap Motion 官网文档 HandModel(手部模型)

前言: 本系列译文是为迎合Unity VR的热潮与大家的学习需要,推出的针对Unity方向的Leap Motion官方文档中英对照翻译. 本篇为第六篇 <HandModel(手部模型)> ,该类主要用于连接控制器和手部模型,以及处理手臂.肘部.手掌.手指的位置和角度等信息. Handmodel is the base class for all the other hand scripts. If you are creating your own hands and need a custo

HTC Vive 与Leap Motion 出现位置错误的问题

Leap Motion已经支持VR, 但是官方没有支持HTC Vive的例子. 按照官方的文档, 其实是有问题的: https://developer.leapmotion.com/documentation/unity/unity/Unity_Custom_Rig.html Add the LeapVRTemporalWarping script component to the LeapSpace component you just created. Double check that t