分享

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

 文清阳 2017-01-06

Leap Motion 之Unity开发实战

(一) 制作手的HandController 

一. Unity官方包介绍

到如下链接下载

https://developer./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

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

   



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多