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.

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

  1. Leap Motion 之Unity 开发实战(一. 制作手的HandController)

    Leap Motion 之Unity开发实战 (一) 制作手的HandController 一. Unity官方包介绍 到如下链接下载 https://developer.leapmotion.com ...

  2. EZ-USB FX2 LP CY7C68013A 开发指南(1)--基本概念

    http://group.ednchina.com/1737/22909.aspx 1.    元器件 CYPRESS 68013A :支持USB 2.0 协议,带增强型8051 单片机,时钟频率48 ...

  3. 阿里云-对象存储 OSS > 开发指南 > 基本概念

    基本概念 更新时间:2020-09-24 10:50:53 编辑我的收藏 https://help.aliyun.com/document_detail/31827.html#title-cn1-rb ...

  4. Leap Motion

    如果你已经熟悉编程的概念,理解并在C#语言方面有一定经验,并熟悉面向对象编程思想和设计概念,了解3D图像学和向量数学知识.不妨来看看吧! Leap Motion是什么? 一种基于计算机视觉原理的识别技 ...

  5. Magic Leap开发指南(7)-- 眼球追踪(Unity)

    眼球追踪功能是AR眼镜时代主要的交互方式之一,各大AR眼镜厂商也在积极投入Eye Tracking功能的研发,Magic Leap One很好的支持了这一功能.本部分的教程主要是在Unity中使用Ey ...

  6. Magic Leap开发指南(9)-- 6 DOF(Unity)

    本部分的教程主要是介绍Magic Leap One的6 DOF能力.我们通过一个小例子来实现这个功能: 为控件初始化6自由度. 接收控件的位置和方向数据. 设计一个像激光束一样的指针,从控制器开始,延 ...

  7. SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)

    <SteamVR2.0开发指南> 版本 作者 参与者 完成日期 备注 SteamVR2.0_Guide_V01_1.0 严立钻 2019.01.23 ++++SteamVR2.0开发指南: ...

  8. 使用Leap Motion Orion开发酷炫的手势识别VR/AR应用

    Leap Motion Orien支持Oculus和HTC Vive开发,当然对Unity的支持显然是必须的. 不过前提是: 1.Windows 7 64位或者windows 10 2.Leap Mo ...

  9. leap motion java_[Leap Motion开发文档翻译]Leap Motion架构

    Leap Motion架构 Leap Motion体感控制器支持最流行的桌面操作系统.Leap Motion程序作为一个服务(在Windows中)或一个守护进程(在Mac和Linux中).这个程序通过 ...

最新文章

  1. 小兵别嚣张,签名算法分析
  2. 为什么企业选择年底裁员?如何选择一个正确的公司!
  3. top命令按内存和cpu排序
  4. Struts2+Android (3) 多种方式向服务器发送信息
  5. 宾浪超.何飞玲.相爱(帮别人名字隔字作诗)
  6. 文档自动排序长短_css 文档流
  7. kafka0.9 java commit_0.9版本kafka优化及常见错误(转载)
  8. 用python模拟高斯分布
  9. 不刷新页面的tab_SwiftUI小技巧之如何解决Tab切换后页面重置和List刷新bug
  10. c++ 结构体遍历_PBRT-E4.3-层次包围体(BVH)(一)
  11. 《Python程序设计》在亚马逊京东当当互动出版网淘宝全面上架
  12. python字符串取消转义_python取消转义,除了r还有什么?可以调用函数取消转义吗?...
  13. GDAL对于raw数据支持的一个bug
  14. python代码写龙卷风_python-打开网站时龙卷风403获取警告
  15. Elasticsearch7.17 二:mapping映射和高级语法查询DSL
  16. 查看数据库信息(一)
  17. Android压缩图片并且保存到本地内存卡中
  18. c语言遍历 json字符串,全面详解c语言使用cJSON解析JSON字符
  19. 局域网网络流量监控_18个监控网络带宽的Linux命令行工具
  20. 简述BP神经网络的流程,BP神经网络的实现包括

热门文章

  1. jzoj. 1285. 奶酪厂
  2. 进程注入之DLL注入
  3. 基于stm32f10x的超声波模块HC-SR04的测距示例,并用串口将数据打印出来
  4. ZYNQ Linux 移植:包含petalinux移植和手动移植debian9
  5. oracle 的exp是什么,oracle中exp和imp是什么,oracle中exp和imp有何区别 | 学步园
  6. [ORACLE] ORA-00054 错误的解决方案
  7. 产品经理必备文章50篇合集:从入门到提升
  8. java代码控制开关
  9. 在Windows10环境下安装RabbitMAQ、Erlang的坑
  10. ios html js调用陀螺仪,Js 获取手机陀螺仪