Leap Motion 之Unity开发实战

(一) 制作手的HandController

一. Unity官方包介绍

到如下链接下载

https://developer.leapmotion.com/unity


可将上述的包都下载下来,以备所用,大致解释一下。

1.      CoreAssert

核心包,这是必须要导入的,包含了基础类、一些有用的脚本方法,以及一些做好的手预制件等。

2.      Attachments

主要提供了一个可以(在较高自由级别上)定制的手模型和控制脚本,这个手模型继承了IHandModel接口,但不提供图元级别的内容,所以主要用于手势的逻辑控制。它应与图元手对象共同组成手的完整模型。这段理解起来较复杂,其实可以简单说:他主要用于挂脚本的。但挂脚本干什么呢?举例来说还不是控制在手掌、手指(任一)、胳膊等地要实现什么逻辑吧?比如抓个东西,点个火什么的,那你必须要有各自的位置来关联这些部位和控制相应的逻辑脚本了,这个东东就是干这个用的,所以它要和图元对象一起来用。

3.      DetectionExamples

这个比较重要,检测手势逻辑的,比如手指伸开没有啊,手指指向什么物体了?这些都已经写好了,研习示例后,直接挂载和调用相应的组件脚本即可了。

4.      UI-Input Model

这个直观理解,也是处理UI逻辑的,实现用手来触控(交互)各类UI组件(UGUI),例子写得非常好,各类UI交互逻辑封装得也很好。

5.      HandsModel

增强型的手模型及逻辑,比核心包里的手模能更细致一些,但仍是低模级别的,可以一用。

6.      PinchModel

识别抓取类手势的包,抓取类手势:LeapMotion将手掌的这一类动作,定义为Pinch Gesture,包括抓、捏、握等等,可以看看官方的视频Demo理解这一类手势。

总之:LeapMotion封装了主要的逻辑和模型在Unity的上述包中,大大节省了我们的开发工作量,从而不必从手的基本逻辑开始写起,直接调用已经做好的脚本组件,或直接使用各种预制件,组合、拼装、拖拽各类组件,形成自己的Unity应用,或者集中编写获取(或识别)手势后的业务逻辑,而不是从头做起(比如从Leap Service Provider获取Frame,再从Frame中获取Hand,Finger,再识别手势。。。。。)。

二.     制作手的HandController

1.      导入包

1)      其中先导入基础包:CoreAssert

2)      再导入HandsModule包:这里包括手的模型(含一些FBX),核心包里手的模型太简陋,所以需要这个包。

2.      制作LeapHandController

1)      在主摄影机下建一个GameObject,取名LeapHandController

2)      此对象下增加两个脚本组件(在Leap.Unity命名空间下):LeapHandController(控制手势数据的跟踪获取,并绘制图形的组件)和Leap Service Provider(其实:LeapMotion在Windows系统下有一个Leap Service服务,这个脚本就是与该服务进行交互,获取硬件传来的手势跟踪数据)

对后一个脚本基本的变量作如下设置

3)      再增加第三个脚本组件 Hand Pool

对其设置如下

a)     首先设置Model Pool 的 Size为2,这表明要分别设置手的图元对象和碰撞(物理)对象(一般是由这两部分构成手)

b)     在第一个element下,修改Group Name为:Graphics_Hands,第二个element修改为Phisycs_Hands

对这两个element的设置,稍后会进行。

4)      创建手的图元对象

a)     我们在LeapMotionModules\Hands\Prefabs目录下找到PepperBaseCutLeftHands,

这个是左手的预制件(没懂为什么叫胡椒基地手,看起来像胡椒?),还有个右手的,将这个手预制件拖到LeapHandController下,这样就是手的图元子对象。

我们将来可以在这两个图元子对象下再挂脚本,特别是检测类脚本,从而实现对手势的跟踪(包括手指、手势、手掌动作等等)。

好,这里先停一下,讲一下这个预制件的组成

我们能看到在PepperBaseCutLeftHand中的检查器视图上

发现它是由RiggedHand脚本控制的,这一类脚本(手:PolyHand,RiggedHand,SkeletalHand,DebugHand等)都继承于HandModel,IHandModel(接口)的,就是控制手这个图元对象,绘制手的形态,并根据捕捉的轨迹数据进行图元更新(重绘)。

RiggedHand是官方制作的像人手的东西,而不像那些骨头类的手,吓人。

(我好像明白为什么那个叫胡椒手了,因为还有轻盐手,看来都是厨子出身)

b)     检查或修改PepperBaseCutLeftHands/PepperBaseCutRightHands的属性设置

 

  • HandedNess表示此图元对象是用于左手还是右手
  • Hand Model Palm Width:手掌宽度
  • Fingers:5个手指,这五个手指都是通过RiggedFinger脚本控制的,包括对移动、转动的位置和方位更新。

顺带说一下:HandEnableDisable脚本,必须要有,否则手将不能移动。

5)      创建手的物理对象

a)     在LeapHandController对象下新建一个Game object,取名PhysicModel

b)     我们在LeapMotion\Prefabs\HandModels\Physical目录下找到RigidRoundHand_L,RigidRoundHand_R,拖到上面的对象下。这就形成了手的物理子对象(同样也是左手和右手),它们控制手的物理碰撞特性。可以没有,但会缺失物理属性。

6)      回过头来再修改HandPool的脚本属性

你已经猜到了,将上面的图元和物理对象分别赋到相应的变量槽位中,记得对两个Bool值选中。

再停一下,Hand Pool干什么用的啊?其实它非常有用,当给定了手的图元和物理对象后,HandPool创建并管理一个手的池子,并且负责对手进行三维呈现(渲染)。一个手呈现出以后就从池子里移除一个手,反之回收到池子中。池子的管理方式有很多好处吧,特别是性能方面了。

手的渲染其实是由HandRepresentation类负责的,这是一个虚类,实现类是HandProxy,这个类具体对Hand的model进行创建和管理,从而渲染出手的图元表现。对他的渲染调用则是由LeapHandController中的Update()里进行的。

3.      测试你的手

好了,修正一下LeapHandController对象与Camera的相对位置后,你就可以测试一下你的手了,看看这个胡椒手怎么样吧。

4.      替换手的材质

如果觉得这个灰胡椒手不满意,可以替换手的材质。

在PepperBaseCutLeft(Right)Hand下的pepper_hand_left(right)的Skinned MeshRenderer组件中,将Material替换成自己制作的材质,或者也可在官方包目录下Materials目录下查找官方制作的。

5.      VR头戴

如果配合VR眼镜,那LeapMotion可能粘连到VR头盔上,必须要更改LeapHandController的Rotation值,可试着更改X:270,Y:-180。这样就从桌面向上的捕捉模式调整到头盔前向的捕捉模式了。【这一点,要理解LeapMotion对手势3D动作的捕捉原理,即一个立方视椎体,详见官方文档】

三.     官方两个例子

官方包里提供了两个场景例子,分别是VR(绑定到VR头盔前部)和PC(放置在桌面)桌面的,大致讲一下区别。

1.    VR 场景中如何添加Hands

1)      找到LMHeadMountedRig预制件拖到场景中,删除已有的Camera

2)      将LMHeadMountedRig放置到游戏开始的地点。

3)      制作LeapHandController,拖到LMHeadMountedRig的对象下

4)      测试场景。

官方的VR包主要支持Oculus rift,我做的VR用的是国产3Glass,效果也不错。

2.    PC场景中添加Hands

和我上面第二节介绍的类似。

Leap Motion 之Unity 开发实战(一. 制作手的HandController)相关推荐

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

    LeapMotion 之Unity开发指南(一.基本概念和手的预制件) [序言] 最近用Leap Motion + 国产的3Glass眼镜构建了房地产.数字矿山的一些应用,感觉这是很经济的一个VR架构 ...

  2. 《Unity开发实战》——2.8节用Shuriken制作粒子效果

    本节书摘来自华章社区<Unity开发实战>一书中的第2章,第2.8节用Shuriken制作粒子效果,作者 (爱尔兰)Matt Smith (巴西)Chico Queiroz,更多章节内容可 ...

  3. 《Unity开发实战》——2.2节创建画中画效果

    本节书摘来自华章社区<Unity开发实战>一书中的第2章,第2.2节创建画中画效果,作者 (爱尔兰)Matt Smith (巴西)Chico Queiroz,更多章节内容可以访问云栖社区& ...

  4. 《Unity开发实战》——3.9节鼠标悬停时高亮显示材质

    本节书摘来自华章社区<Unity开发实战>一书中的第3章,第3.9节鼠标悬停时高亮显示材质,作者 (爱尔兰)Matt Smith (巴西)Chico Queiroz,更多章节内容可以访问云 ...

  5. 《Unity开发实战》——2.4节自定义镜头光晕效果

    本节书摘来自华章社区<Unity开发实战>一书中的第2章,第2.4节自定义镜头光晕效果,作者 (爱尔兰)Matt Smith (巴西)Chico Queiroz,更多章节内容可以访问云栖社 ...

  6. 《Unity开发实战》——1.3节设置首选项

    本节书摘来自华章社区<Unity开发实战>一书中的第1章,第1.3节设置首选项,作者 (爱尔兰)Matt Smith (巴西)Chico Queiroz,更多章节内容可以访问云栖社区&qu ...

  7. 《Unity开发实战》——3.4节创建高光纹理贴图

    本节书摘来自华章社区<Unity开发实战>一书中的第3章,第3.4节创建高光纹理贴图,作者 (爱尔兰)Matt Smith (巴西)Chico Queiroz,更多章节内容可以访问云栖社区 ...

  8. 《Unity开发实战》——2.9节显示迷你地图

    本节书摘来自华章社区<Unity开发实战>一书中的第2章,第2.9节显示迷你地图,作者 (爱尔兰)Matt Smith (巴西)Chico Queiroz,更多章节内容可以访问云栖社区&q ...

  9. 【Unity开发实战】—— 2D项目1 - Ruby‘s Adventure 游戏中动画制作(4-1)

    文章目录 1)食用指南 2)具体步骤详细剖析 2.1)需要区分清楚的五个功能面板 1.Animator 组件 2.Animator 组件的 Controller设置 3.自己创建的Animator C ...

最新文章

  1. 《Clojure数据分析秘笈》——2.6节调整词频值的度量
  2. 先来先服务调度算法(C++实现)
  3. 7-2 数组循环左移(20分)(顺序表实现)
  4. UIButton return(textField textView)
  5. linux内核源码代码量,Linux内核源代码数量已经超过1000万行
  6. MSP432P401R TI Drivers 库函数学习笔记(三)认识任务的创建及图形化配置
  7. 如何在Telegram机器人中设置推送通知
  8. 【转载】Ogre的内存分配策略
  9. 基于URL的轻量级恶意页面检测分类器
  10. ppt中控件未在计算机中注册,PowerPoint 中控件没注册是怎么回事?
  11. Layui-select 修复搜索之后上下键的bug
  12. 一拳超人手游显示服务器断开,一拳超人最强之男游戏无法登陆怎么办 解决方案一览...
  13. 为什么中国人少有人得到诺贝尔奖呢?
  14. Ubuntu16.04配置deeplabv3+的pytorch版本
  15. win10系统查看组件服务器,win10系统查看邮箱服务器信息的技巧介绍
  16. mysql两个时间相减的分钟数_mysql 俩个时间相减后取分钟
  17. 攻防世界web新手区合集
  18. 【图文】鲲鹏916-ARM64架构源码gcc编译完整记录
  19. 拍卖抵押的房产来的钱,应该先偿还什么呢?
  20. 【红外线遥控原理学习】【转载】

热门文章

  1. AWS解决方案架构师薪资平均159,033 美元
  2. 《Rethinking Boundaries: End-To-End Recognition of Discontinous Mentions with Pointer Networks》读后感
  3. 人体三维重建SMPL、SMPLX、SMPLifyX学习笔记
  4. sublime php 代码校验,Sublime Text下配置SublimeLinter进行PHP代码检查
  5. chrome插件莫名消失【已解决】
  6. Python PyQt4 文字朗读演示代码
  7. matlab应力分析,MATLAB有限元分析与应用概述.ppt
  8. C#程序实现窗体的最大化/最小化
  9. 助眠好物推荐,改善睡眠的好方法
  10. android悬浮窗口的实现