LeapMotion 之Unity开发指南(1.基本概念和手的预制件)
【叙言】
最近用Leap Motion + 国产的3Glass眼镜构建了房地产、数字矿山的1些利用,感觉这是很经济的1个VR架构方案,比用Oculus和HTC的硬件要省钱很多,并且效果也不错。
在行业VR利用中,其实重在培训教育、生产安全的仿真演练上,更多地通过1些UI互动、基础性的手势(比如开关装备、拾起灭火设备等)来进行交互,这些其实不1定需要非常昂贵的激光定位装备、复杂的硬件套件才可实现,而手势辨认在未来也是1个趋势。
所以将1些开发积累整理下来,希望不断地能在这个领域中学习领会,终究能为行业客户创造1些实用的价值。 欢迎大家和我1起交换,QQ:115913892
1. 安装
1. 打开官网:https://developer.leapmotion.com/get-started
2. 先要下载和安装LeapMotion的驱动程序
注:我买的是2代Leap Motion,所以在Win10下 不支持V2 Desktop的开发驱动,选择左面的。(注意是开发驱动,而非App利用)
我下载的最新版本是3.1.2,解压后以下图。
运行EXE文件,根据提示安装驱动,实际上这将安装了1个驻留程序在系统托盘中,并且生成1个自动启动的系统服务Leap Service,在控制面板中可查看它,当遇到Leap Motion不工作,或托盘中图标显示黑色时,可检查1下这个服务是不是正常。
驱动程序与LeapService通讯,读取硬件层面3D摄像头跟踪的手势数据,上层类的利用(如Unity,虚幻4,Java等)则与驱动程序(C++写成)通讯。
安装成功后,能看到LeapMotion两个摄像头和中间LED灯都正常亮起,表明处于工作状态,这时候可用自动安装的Leap App Home利用来测试1下,通过它还可下载1些官方的例子。
3. 下载准备好各类Unity包
到https://developer.leapmotion.com/unity下载所需的包。
其中CoreAssert是核心包,其他都是封装好的各类功能包,在实战篇中会介绍。
2. 基本概念
1. 坐标系统
Unity使用左手坐标,LeapMotion使用右手坐标(所以,Z轴是相反的)。
Unity以米为单位,LeapMotion使用毫米。LeapMotion配备的Plugin脚本内部对坐标系统进行了转化,行将单位和坐标转化为Unity的标准。
注意:在Unity中,1定要从LeapServiceProvider中取得Frame对象,否则在帧中的数据(TrackingData)将还使用Leap的坐标系统。LeapServiceProvider解析了Scaling,Rotation,Translation的变换.
2. 手势跟踪
LeapMotion使用了光学传感器和红外光组件。传感器的FOV为150度。顶部0.03~0.06米为有效的跟踪范围。
最好的工作环境是可产生清晰的、高对照度对象轮廓的光照环境。
HMD模式下(头盔绑定的模式 ),跟踪算法被优化成对不同的视角下辨认手势(大概的意思多是,你头盔多动动,辨认得更好1些),比放在桌面固定不动要更好1些。
3. 手(Hand Assert)
(1)表示方法
在预制件目录下,分成图形(图元)和物理两组脚本和预制件,可以用其中各1来组合表示手。这1处1定要理解,官方的Unity包里给了1些场景例子,可以研习1下。
从概念上手被辨别成Graphic和Physic两种组件构成,前1即是图元,主要是显现手的外观,后1主要表现手的物理特性(如刚体、碰撞)。
也能够没有物理组件,这样就不能产生物理特点了。
(2)创建手的方法
有几种创建手的方法:
(3)1个例子
下图是1个典型的手的例子,1个HandController下挂4个子对象,分别是图元左右手,物理左右手。
3. 创建你自己的手Prefab
注:随着官方例子创建1个手,可能其实不是很实用,但有助于理解手的预制件和原理组成。
你可以创建类似于已提供的Unity包里的手预制件,用你自己的图形来表示手,同时定制自己的手的行动(基于已提供好的代码)。
我们要创建的这类手称为“离散手预制件Discrete Hand Prefabs”,意思是手上每一个部位都是单独的Game Object,都有其单独的位置和方向信息。在Core assert 包里,机器人的手即是这样的“离散预制件”。下面介绍了通过使用Unity自带的几何体(圆柱、圆)来创建Prefab。
首先,我们需要创建1个手指的Prefab,并且使用它来创建手Prefab。
1. 创建1个场景.
2. 新建1个空对象,命名KnobbyFinger
3. 创建骨头
1) 新建1个空对象到KnobbyFinger下,命名Metacarpal (掌骨)
2) 新建1个Cylinder到Metacarpal,命名Tube.在创建你自己的手时,将此Cylinder替换为你自己的图形对象(或Obejct)
3) 移除碰撞体组件,否则RigidHand碰撞体将会与它反弹。
4) 设置X Rotation为90。
(最好设置成Top视野来视察)
5) 将Tube X、Z的Scale设置成0.003(3毫米)。之所以这样设置,是由于要使用带皮肤的骨头,真实的手指要更胖1些。
6) 设置Tube Y的Scale为0.034(34毫米)。这个决定了手指的长度。
尺寸必须使用真实世界的,转化为米。Y的长度应为68mm的1半,这是由于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) 新建1个圆到关节,取名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后)
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) 增加1个空对象到KnobbyHand.取名Palm.
2) 增加1个Cylinder到 Palm.取名 Disc.
3) 移除Collider.
4) 设置Disc的 scale为 (.085, .0015, .085)..
5) 拖动Palm到SkeletalHand脚本的Palm变量中
9. 增加手段:
1) 增加1个空对象到KnobbyHand,取名Wrist.
2) 增加1个圆到Wrist.取名 Ball.
3) 移除Collider.
4) 设置Ball的 scale为(.03, .03, .03).
5) 拖动Wrist到SkeletalHand脚本WristJoint变量中.
10. 增加胳膊
1) 增加1个空对象Arm.
2) 增加1个Cylinder:Rod.
3) 移除Collider.
4) 设置Rod的x rotation为: 90.
5) 设置Rod的scale为:(.02, .12, .02).
6) 拖动 Arm到SkeletalHand脚本的Forearm
12. 将KnobbyHand创建为prefab.
KnobbyHand的结构应为下图所示:
1. 新建1个LeapHandController prefab到场景中,以便交互区域是在摄影机的FOV内。
2. 设置以下层次结构
3. 在LeapHandController的HandPool中设置:
.
4. 运行关卡,视察你的手
如果RigidHand组件在Scene窗口中可见,但抖动或反弹,确保你移除图元手部位的所有碰撞体。
如果手指堆叠或移动在1个手指的控制下,检查手指SkeletalFinger 脚本的手指类型设置。
如果你的手混杂成1大团的乱糟糟模样,那是每一个子元的Scale设置的太大了,记得Unity的单位是1米,1个典型的手宽度是8.5厘米(或表示成Unity transform的Scale是0.085)。如果想使手更大1些(在游戏里看),增大LeapHandController的Scale.