关于unity如何替换leapleap motion开发里的hands,最好各位大神能提供个模型,谢谢~

Leap Motion Unity 资源 - 简书
Leap Motion Unity 资源
Leap Motion Unity 资源提供了在unity中实现运动手的控制的一个简单方法
Paste_Image.png
*Leap Motion3.1.0以上版本
*Unity5.4.0以上版本
*Windows7以上版本
1:下载最新的资源包:.
2:打开或者创建一个新项目。
3:选择Unity 中 Assets & Import Package & Custom Package菜单命令。
4:找到下载的资源包并单击Open。
资源包被导入到您的项目。在示例场景的Scenes文件夹中你可以找到LeapMotion场景。
每一个开发和客户端计算机必须安装Leap Motion 服务软件(安装成功后自动运行)
如果您正在使用一个现有的项目,并且项目里已经包含了Leap Motion的资源包,你必须删除在删除旧版本之前导入新版本的资源包。此外,导入后,必须重新启动Unity,迫使其重新加载插件共享代码库。
如果您添加一个LeapHandController预制体到场景中并且点击Play运行场景后没有看手,检查如下:
1:手是在场景摄像机的视野范围内,没有被其他3D物体所遮挡,并且有足够大的尺寸能够被显示。在预设体的位置出现上面的3D手的模型。
2:如果你能在视图编辑器中找到手的模型就暂停游戏并且检查它。
3:确保Unity编辑器(如果运行外部编辑器或者应用程序)的操作系统的输入焦点
红的: (3,-1,3) 蓝的: (0,-1,3) 橘黄色的: (-3,-1,3) 注意它们都在Hand Controller游戏物体Y轴的上面。但是在z轴它们在一个水平线上,你可以调整这些数字如果你喜欢的话,只要这些立方体在Hand Controller的检测范围之内就好...
转自http://www.cnblogs.com/donghua/p/4957415.html Oculus/GearVR开发者群 Welcometo the Unity Development GuideIntroduction简介Welcometo t...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
下边都学会就大神了: 声明:都是网上搜集的,能标明出处的都标了.别只搜集而不看,与君共勉.. 先看完整项目完整App@HackerNews-React-Native用 React Native 完成的 HackerNews 客户端。WeChat实现类似微信朋友圈或者QQ空间...
This article is a record of my journey to learn Game Development and it will keep updating. 由于这篇文章的长度早已超出了简书编辑器的限制,因此后续内容将不在本文中更新,请移步本人的独...
如果说是命运让人一次又一次叹息,那么,命运是否已经可以被自己握在手中了呢? 淡淡的想念、深深的牵挂,努力地去活得更好,为了对命运开怀大笑、此生无憾的那天。
号决定去西塘,然后携程网上订汽车票查地址订房间。就是这么拍拍脑袋说走就走了。我知道很多事情拍拍脑袋是不行的,但是有些事情就是毁在“深思熟虑”上,等你“深思熟虑”后,或许风景就不一样了。很多事情,我们做着做着就明白了吧。每一次出行,都会觉得自己离真正的自...
他18岁进入花艺圈。蛰伏16年后,开始了疯狂的花艺大赛挑战之路。 34岁与大哥一起参加花艺‘日本杯’大赛,分别获得第5名和第8名,这是日本花艺届兄弟共同上榜前所未有的记录。 38岁目光投向国际花艺界,参加比利时两年一度的‘International Floral Art’花...
戏 有时候,明明知道剧本中的线索,却要继续演下去
喃喃思喃喃 夜夜吟夜夜 唯恐迩去离 却忘缘分尽 若有缘自相见 若无缘自难见Leap Motion 之Unity 开发实战(一. 制作手的HandController)
Leap Motion 之Unity开发实战
(一) 制作手的HandController
一. Unity官方包介绍
到如下链接下载
https://developer.leapmotion.com/unity
可将上述的包都下载下来,以备所用,大致解释一下。
CoreAssert
核心包,这是必须要导入的,包含了基础类、一些有用的脚本方法,以及一些做好的手预制件等。
Attachments
主要提供了一个可以(在较高自由级别上)定制的手模型和控制脚本,这个手模型继承了IHandModel接口,但不提供图元级别的内容,所以主要用于手势的逻辑控制。它应与图元手对象共同组成手的完整模型。这段理解起来较复杂,其实可以简单说:他主要用于挂脚本的。但挂脚本干什么呢?举例来说还不是控制在手掌、手指(任一)、胳膊等地要实现什么逻辑吧?比如抓个东西,点个火什么的,那你必须要有各自的位置来关联这些部位和控制相应的逻辑脚本了,这个东东就是干这个用的,所以它要和图元对象一起来用。
DetectionExamples
这个比较重要,检测手势逻辑的,比如手指伸开没有啊,手指指向什么物体了?这些都已经写好了,研习示例后,直接挂载和调用相应的组件脚本即可了。
UI-Input Model
这个直观理解,也是处理UI逻辑的,实现用手来触控(交互)各类UI组件(UGUI),例子写得非常好,各类UI交互逻辑封装得也很好。
HandsModel
增强型的手模型及逻辑,比核心包里的手模能更细致一些,但仍是低模级别的,可以一用。
PinchModel
识别抓取类手势的包,抓取类手势:LeapMotion将手掌的这一类动作,定义为Pinch Gesture,包括抓、捏、握等等,可以看看官方的视频Demo理解这一类手势。
总之:LeapMotion封装了主要的逻辑和模型在Unity的上述包中,大大节省了我们的开发工作量,从而不必从手的基本逻辑开始写起,直接调用已经做好的脚本组件,或直接使用各种预制件,组合、拼装、拖拽各类组件,形成自己的Unity应用,或者集中编写获取(或识别)手势后的业务逻辑,而不是从头做起(比如从Leap Service Provider获取Frame,再从Frame中获取Hand,Finger,再识别手势。。。。。)。
制作手的HandController
其中先导入基础包:CoreAssert
再导入HandsModule包:这里包括手的模型(含一些FBX),核心包里手的模型太简陋,所以需要这个包。
制作LeapHandController
在主摄影机下建一个GameObject,取名LeapHandController
此对象下增加两个脚本组件(在Leap.Unity命名空间下):LeapHandController(控制手势数据的跟踪获取,并绘制图形的组件)和Leap Service Provider(其实:LeapMotion在Windows系统下有一个Leap Service服务,这个脚本就是与该服务进行交互,获取硬件传来的手势跟踪数据)
对后一个脚本基本的变量作如下设置
再增加第三个脚本组件 Hand Pool
对其设置如下
首先设置Model Pool 的 Size为2,这表明要分别设置手的图元对象和碰撞(物理)对象(一般是由这两部分构成手)
在第一个element下,修改Group Name为:Graphics_Hands,第二个element修改为Phisycs_Hands
对这两个element的设置,稍后会进行。
创建手的图元对象
我们在LeapMotionModules\Hands\Prefabs目录下找到PepperBaseCutLeftHands,
这个是左手的预制件(没懂为什么叫胡椒基地手,看起来像胡椒?),还有个右手的,将这个手预制件拖到LeapHandController下,这样就是手的图元子对象。
我们将来可以在这两个图元子对象下再挂脚本,特别是检测类脚本,从而实现对手势的跟踪(包括手指、手势、手掌动作等等)。
好,这里先停一下,讲一下这个预制件的组成
我们能看到在PepperBaseCutLeftHand中的检查器视图上
发现它是由RiggedHand脚本控制的,这一类脚本(手:PolyHand,RiggedHand,SkeletalHand,DebugHand等)都继承于HandModel,IHandModel(接口)的,就是控制手这个图元对象,绘制手的形态,并根据捕捉的轨迹数据进行图元更新(重绘)。
RiggedHand是官方制作的像人手的东西,而不像那些骨头类的手,吓人。
(我好像明白为什么那个叫胡椒手了,因为还有轻盐手,看来都是厨子出身)
检查或修改PepperBaseCutLeftHands/PepperBaseCutRightHands的属性设置
HandedNess表示此图元对象是用于左手还是右手
Hand Model Palm Width:手掌宽度
Fingers:5个手指,这五个手指都是通过RiggedFinger脚本控制的,包括对移动、转动的位置和方位更新。
顺带说一下:HandEnableDisable脚本,必须要有,否则手将不能移动。
创建手的物理对象
在LeapHandController对象下新建一个Game object,取名PhysicModel
我们在LeapMotion\Prefabs\HandModels\Physical目录下找到RigidRoundHand_L,RigidRoundHand_R,拖到上面的对象下。这就形成了手的物理子对象(同样也是左手和右手),它们控制手的物理碰撞特性。可以没有,但会缺失物理属性。
回过头来再修改HandPool的脚本属性
你已经猜到了,将上面的图元和物理对象分别赋到相应的变量槽位中,记得对两个Bool值选中。
再停一下,Hand Pool干什么用的啊?其实它非常有用,当给定了手的图元和物理对象后,HandPool创建并管理一个手的池子,并且负责对手进行三维呈现(渲染)。一个手呈现出以后就从池子里移除一个手,反之回收到池子中。池子的管理方式有很多好处吧,特别是性能方面了。
手的渲染其实是由HandRepresentation类负责的,这是一个虚类,实现类是HandProxy,这个类具体对Hand的model进行创建和管理,从而渲染出手的图元表现。对他的渲染调用则是由LeapHandController中的Update()里进行的。
测试你的手
好了,修正一下LeapHandController对象与Camera的相对位置后,你就可以测试一下你的手了,看看这个胡椒手怎么样吧。
替换手的材质
如果觉得这个灰胡椒手不满意,可以替换手的材质。
在PepperBaseCutLeft(Right)Hand下的pepper_hand_left(right)的Skinned MeshRenderer组件中,将Material替换成自己制作的材质,或者也可在官方包目录下Materials目录下查找官方制作的。
如果配合VR眼镜,那LeapMotion可能粘连到VR头盔上,必须要更改LeapHandController的Rotation值,可试着更改X:270,Y:-180。这样就从桌面向上的捕捉模式调整到头盔前向的捕捉模式了。【这一点,要理解LeapMotion对手势3D动作的捕捉原理,即一个立方视椎体,详见官方文档】
官方两个例子
官方包里提供了两个场景例子,分别是VR(绑定到VR头盔前部)和PC(放置在桌面)桌面的,大致讲一下区别。
VR 场景中如何添加Hands
找到LMHeadMountedRig预制件拖到场景中,删除已有的Camera
将LMHeadMountedRig放置到游戏开始的地点。
制作LeapHandController,拖到LMHeadMountedRig的对象下
测试场景。
官方的VR包主要支持Oculus rift,我做的VR用的是国产3Glass,效果也不错。
PC场景中添加Hands
和我上面第二节介绍的类似。
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之预设的使用细节(五十一)
Unity3D研究院之预设的使用细节(五十一)
围观61352次
编辑日期: 字体:
今天有个刚入门的朋友问我了几个问题,大概都是有关预设的问题,我想想我还是在博客里面总结一下吧,预设的原理我就不说了它比较简单而且网上例子也很多。
1.预设怎么取消
如下图所示,创建一个普通的立方体对象Cube ,Hierarchy视图中名子的颜色是“白色”的。同样在创建一个Prefabe ,你会发现此时立方体对象在Hierrchy视图中名子的颜色成“蓝色”了。
接着问题就来了,这个朋友就问怎么才能让Prefab(蓝色名子)的游戏对象还原成Cube(白色名子),这确实是个很细节的问题,他目前的作法是把Cube(预设)删除,从新在创建一个新的Cube对象。这样的作法确实没问题,但是多少让人感觉有点不符合逻辑。如下图所示,正确的作法应该是先选择预设的Cube对象,然后在Unity导航菜单栏中选择GameObject-& Break Prefab Instance 。
继续如下图所示,立方体对象的名子是不是变成“白色”拉? 此时如果说你想将预设还原,那么在导航菜单栏中选择GameObject -& Apply Changes To Prefab ,在看看你的Cube的名子就由变成“蓝色”。仔细观察还是有问题,请看右侧Inspector视图中下面有一个“Prefab”的标志,这说明它并没有清理干净。
如果你想彻底的还原Cube对象,那么只有一个办法就是在Project视图中删除原始Prefab对象。此时删除你会发现你的立方对象已经和新创建的没什么两样了,还有一种情况是你并没有先将立方体对象Break Prefab Instance
而是直接在Hierarchy视图中删除。如下图所,此时你会发现你的Cube颜色成红色,它表示你的Prefab已经丢失。
此时选中“红色的”Cube对象,继续在Unity导航菜单栏中选择GameObject-&Break Prefab Instance ,你会发现你的立方体对象已经和新创建的完全一样拉。
然后是Prefabe的批量应用,在Hierarchy视图中可能会有很多相同的Prefab对象,此时如果想给所有的Prefabe对象添加或删除一个组件该如何?在Project视图中找到Prefabe原始对象,直接在这个对象上添加或删除组件,它会全部应用所有Hierarchy视图中的Prefab对象们。但是这样还有问题,就是Project视图中的Prefab原始对象它并不可以在Scene视图中去预览,所以我推荐大家使用另外一种方式来批量应用Prefabe对象。
先在Hierarchy视图中选择Prefab对象中的其中一个。在右侧Inspector视图中,如下图所示,Prefab对象都有三个常用的按钮.
Select:点击后会立即定位到Project视图中的原始Prefab对象。
Revert:如果你不小心破坏了Hierarchy视图中当前这个Prefab对象,点击它可以还原至Project视图中原始Prefab对象。
Apply: 主要想说的就是这个, 如果你想批量修改所有Prefab对象,比如添加一个新的组件后,点击这个按钮可以把所有对象还有原始Prefabe对象都应用成你现在编辑的对象。还有一种方法也可以达到这种效果,就在在Unity导航菜单栏中选择GameObject -& Apply Changes To Prefab 。
立方体、球体、圆柱体、胶囊体、面这几个是Unity自身提供的原始模型,如果你的模型是由美术自行创建的Fbx文件该如何?
.Fbx模型属于资源对象,和贴图、材质、声音属于同样类型的资源。。但是.Fbx更加的特殊,因为它可以直接拖入Hierarchy视图中并生成游戏对象。此时你会发现Hierarchy视图中它也是蓝颜色的字,但是它并不是Prefab对象,它是Mode对象。它也可以使用导航菜单栏中的 Break Prefab Instance ,我建议使用的时候最好把.fbx模型对象转成Prefab对象来使用。
上面说的很多都是在编辑器模式下,下面在说说程序运行时。在脚本中可以这样动态的生成Prefab 。
Instantiate (prefab);GameObject go = (GameObject)Instantiate(prefab, transform.position, transform.rotation);
也可以通过Resource动态的加载Prefab原始对象,AssetBundle.load()也可以。。
Resources.Load("Prefab")
如果你想编辑器拓展Prefab插件的话可以使用 PrefabUtility类,它属于Editor下的类,只能在编辑时运行。比如创建Prefab对象, 替换Prefab对象,克隆Prefab对象。等等,都可以使用它。 使用起来有问题的话欢迎留言给我。
2.运行时修改游戏对象
我们知道游戏在运行的时候你在编辑器中对游戏对象做的任何操作,等停止运行时会自动重置。比如你运行的时候把某个对象的坐标重新调了一遍,停止运行的时候你会发现这个坐标又重置了。有一个比较巧妙的办法能处理这个问题, 当游戏运行的时候你把坐标调节完以后,这时Command + c 复制需要修改的所有游戏对象。然后关闭运行,Command + v 粘帖对象。 (但是要把之前的对象删除)。
最后欢迎大家一起讨论与学习。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!你很优秀,但我只想做我自己
【VR】Leap Motion 官网文档(一)Unity资源与插件
Leap Motion Unity Assets and Plugin
原文地址:
The Leap Motion Unity assets provide an easy way to get motion-controlled hands into a Unity game.
Leap Motion 的Unity 资源让Unity游戏获取控制运动的手模型变得非常方便。
System Requirements(系统要求)
Leap Motion 2.3.1+ (Leap Motion 2.3.1以上版本)Unity 5.1+ (Unity 5.1以上版本)Windows 7, Windows 8, Mac OS X
Installation(安装步骤)
Download the latest asset package from: .
(下载最新的资源包从 )
Open or create a project.
(打开或者创建一个Unity工程)
Select the Unity Assets & Import Package & Custom Package menu command.
(在Unity中导入该资源包,也可双击导入)
Locate the downloaded asset package and click Open.
The assets are imported into your project.
(在本地找到下载的资源包点击Open导入Unity'中)
Every development and client computer must also install the Leap Motion service software (which runs automatically after it is installed).
(所有的开发者和客户端的电脑都必须安装Leap Motion的服务软件【注:安装后自动运行】)
Troubleshooting(故障排除)
If you do not see hands after adding the HandController prefab to a scene and pressing play, check the following:
(如果你已经把HandController预制体拖到了Scene场景中并且运行之后看不到手的模型,请查看以下几条:)
The hands are within the scene camera’s field of view, not obscured by another 3D object, and are large enough to be visible. The 3D hands appear above the location of the HandController
(这个手的模型需要放在Unity的Scene场景摄像机的视野范围之内,并且不能被其他3D物体遮挡,并且需要保证它的大小是足以可以被看见的,3D的手部模型将出现在HandController预制体所放置的位置上)Pause the game and check to see if the hand models are in the Unity editor hierarchy view. If, so, find them in the editor scene view.(暂停游戏并且检查这个手部的模型是否在Unity的Hierarchy面板中,如果在,在编辑场景中找到它)Make sure that the Unity Editor (or app if running outside the editor) has the OS input focus. (The Leap Motion Service only sends data to the active application.)
(请确保你的Unity编辑窗口或者正在运行的应用程序窗口在当前的操作系统中是有输入焦点的【注:Leap Motion的服务软件只向激活状态的应用程序发送数据】)Check that the Leap Motion icon in the task bar is green. If it has gone dark, the service isn’t sending out data. In this case, double check that the Leap Motion hardware is plugged
in and check that the service is running.
(检查任务栏中的Leap Motion 图标是否是绿色状态。如果颜色变暗,服务将不会发送数据。在这种情况下,双击图标确认Leap
Motion硬件是否被插入,服务是否在运行中)Open the Leap Motion Visualizer from the task bar icon menu. If you see hands in the Visualizer, the problem is most likely within the Unity plugin, scripts, or your own application.
If there are no hands in the Visualizer, the problem is outside Unity.
(点击任务栏图标,打开Leap Motion 观察器。如果在观察器重能够看到手模型,说明问题很可能出现在Unity插件,脚本以及Unity应用程序里。如果观察器中没有看到说,则说明不是Unity方面的问题)
扫码向博主提问
非学,无以致疑;非问,无以广识
擅长领域:
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!开发实例:Unity集成Leap Motion
招聘信息:
如果你已经熟悉编程的概念,理解并在C#语言方面有一定的经验,并且对面向对象编程思想和设计概念有所熟悉。如果你了解3D图像学和向量数学知识。不妨来看看吧~本文使用Unity 5.1~文中涉及的所有代码也能在旧版引擎上编译通过。Leap Motion是什么?在一只手上有29根骨头,29个关节,123根韧带,48根神经,30根动脉,复杂吧!还得乘以2,Leap Motion已经能够非常逼真的进行模拟了。Leap Motion感知你移动的双手,让你以一种新的方式与电脑交互,它以1毫米的100分之1的精度追踪你的10根手指,这大大超过现有的运动控制技术的敏感度,这就是为什么你可以在1英寸的立方体空间内画出微型杰作的原因。Leap Motion设置和Unity 集成首先,你需要下载Leap Motion SDK,大家可以到developer.leapmotion.com 网站下载最新的版本,本文使用的是DK v.2.2.6.29154,下载完后,继续安装运行时,这个SDK支持所有的平台和语言,鼓励大家去了解下这些平台和语言。为了达成集成到Unity 中的目标,还需要下载Leap Motion Unity Core Assets v2.3.1。假定你已经下载安装了Unity 5,下一步就是从Asset Store中获得Leap Motion Unity Core Assets 这个包,本文中用的是2.3.1版本。图2.Leap Motion Core Assets下载安装完这个包后,我们就可以开始创建一个简单的场景,并且开始学习如何使用这些资源,并且将它们扩展到适合我们的要求。图3.Leap Motion在Project视图中的结构继续创建一个空的Unity 工程,并且导入Leap Motion Core Assets包,当导入完后,项目的目录结构为上图所示。Leap Motion Core Assets在Project窗口里,你最该注意的是Leap Motion文件夹,这个文件夹包含的OVR是Leap Motion与Oculus Rift 虚拟现实头戴式设备相结合的资源,这个在以后会涉及到。你应该花时间学习每个文件夹内的结构,更重要的是内容。其中最主要的一个核心资源是Hand Controller,这个是允许你和Leap Motion设备交互的主要预制体,它作为锚点将你的双手渲染到场景中。图4.Hand Controller属性面板Hand Controller 预制体有一个Hand Controller 脚本附加在上面,这样就允许了你和设备的交互。看一看检视面板里面的一些属性,你会发现那里有两个关于手的属性合作来在场景中渲染出真正的手部模型,并且那里有两个物理模型,这些是碰撞,这样设计的好处是你能创建你自己的手部模型,并且用在控制器里来查看效果,并且可以自定义手势等等。注意:Unity 和Leap Motion 都是使用的米制系统,但是有些区别:Unity 的是以米为单位,Leap Motion用的是毫米,不是什么大问题,但是当你测量坐标的时候需要知道。另一个关键属性是Hand Movement Scale 向量,缩放值越大,设备覆盖的物理世界范围越大,你需要查看文档来找到一个合适的数值来适应你当前的应用。Hand Movement Scale向量是用来在不改变模型大小的前提下改变双手移动的范围。放置Hand Controller物体在场景中是重要的。如上所述,这是锚点的位置,因此,摄像机应该和Hand Controller在同一区域,在我们的示例场景中,将Hand Controller放置在(0,-3,3)处,确保摄像机在(0,0,-3)处,看一下坐标下并且看一下组件是如何在3D空间中呈现的,下面是图示:图5.可以看到Camera及Hand Controller位置换句话说,你需要将Hand Controller放在摄像机前面,并且相对于摄像机往下一定数值范围内,这里没有魔法数值,你只需尝试适合你的数值即可。到此,你已经将所有基础的部件结合起来了,并且场景可以运行测试Leap Motion的效果了。去试试吧,如果你正确的安装了所有的软件组件,你将会在场景中看到你的双手。下一步你能在场景中看到双手的运动的事实是:通过提供的资源执行大量的任务,但是在现实中,想让事情变得更有趣,你将需要能够和环境交互,改变或调整场景中的东西。为了说明这具体的一点,我们创建几个GameObject,我们将了解如何与GameObject实现一些基本的交互,我们将让一个立方体悬浮在空气中,我们想通过选择其他Cubes的颜色来改变这个Cube的颜色。为了场景的简单起见,我们会放置3个立方体来代表取色盘,第一个是红色的,第二个是蓝色的,第三个是橘黄色的。你可以选择任何颜色,我们需要将立方体放置的有点规律,不然会让用户感到困惑。将四个立方体这样放:没颜色的(0,1,3)红的: (3,-1,3)蓝的: (0,-1,3)橘黄色的: (-3,-1,3)注意它们都在Hand Controller游戏物体Y轴的上面。但是在z轴它们在一个水平线上,你可以调整这些数字如果你喜欢的话,只要这些立方体在Hand Controller的检测范围之内就好。下一步就是创建一个帮助我们与立方体交互的脚本,起名为scriptCubeInteraction.cs:using&UnityE
using&System.C
public&class&CubeInteraction&:&MonoBehaviour&{
&&&public&Color&c;
&&&public&static&Color&selectedC
&&&public&bool&selectable&=&
&&&void&OnTriggerEnter(Collider&c)
&&&&&&if&(c.gameObject.transform.parent.name.Equals("index"))
&&&&&&&&&if&(this.selectable)
&&&&&&&&&{
&&&&&&&&&&&&CubeInteraction.selectedColor&=&this.c;
&&&&&&&&&&&&this.transform.Rotate(Vector3.up,&33);
&&&&&&&&&&&&
&&&&&&&&&}
&&&&&&&&&transform.gameObject.GetComponent().material.color&=&CubeInteraction.selectedC
}正如你所看到的,这些代码不是很复杂,但是他的确帮助我们实现了我们想要做到的,这三个变量分别表示物体的颜色,物体所选择的颜色,物体是否为可以选择。逻辑的核心在OnTriggerEnter(Colliderc) 函数内,我们检查与可选择物体的碰撞对象是不是食指,如果是,我们设置为该颜色。另一个好主意是,我们设计这么一种交互,当食指与可选择颜色的立方体产生碰撞的后,让它旋转33度,这样我们能更直观的看出交互效果。还是用同样的函数,在这个特别的例子里,我们获得立方体的Renderer组件,并设置他的材质颜色为我们所选择的颜色。运行场景下面是上述设置的截屏:图6.使用左手运行Demo你可以看到我的左手在截屏中,我的右手在用鼠标点击开始截屏。下面是选择蓝色的截图:图7.选中蓝色立方体最后将选中的蓝色应用到可变颜色的Cube上:图8.将蓝色应用到可变颜色的立方体上移动物体是怎样的呢?看到这里,你可能会觉得这好酷啊,但是如果还想实现与3D场景更进一步的交互,会不会更让人激动呢?例如说,你想捡起一个物体,并且将它移动到其他地方。如果想让它实现,我们就得写更多的代码。扩展我们的例子,我们将实现一个可以让我们捡起并移动立方体的项目。抓起一个指定的物体由GrabMyCube.cs实现:using&UnityE
using&UnityEngine.UI;
using&System.C
public&class&GrabMyCube&:&MonoBehaviour&{
&&&public&GameObject&cubeP
&&&public&HandController&
&&&private&HandModel&
&&&public&Text&lblNoDeviceD
&&&public&Text&lblLeftHandP
&&&public&Text&lblLeftHandR
&&&public&Text&lblRightHandP
&&&public&Text&lblRightHandR
&&&//&Use&this&for&initialization
&&&void&Start()
&&&&&&hc.GetLeapController().EnableGesture(Gesture.GestureType.TYPECIRCLE);
&&&&&&hc.GetLeapController().EnableGesture(Gesture.GestureType.TYPESWIPE);
&&&&&&hc.GetLeapController().EnableGesture(Gesture.GestureType.TYPE_SCREEN_TAP);
&&&private&GameObject&cube&=&
&&&//&Update&is&called&once&per&frame
&&&Frame&currentF
&&&Frame&lastFrame&=&
&&&Frame&thisFrame&=&
&&&long&difference&=&0;
&&&void&Update()
&&&&&&this.currentFrame&=&hc.GetFrame();
&&&&&&GestureList&gestures&=&this.currentFrame.Gestures();
&&&&&&foreach&(Gesture&g&in&gestures)
&&&&&&&&&Debug.Log(g.Type);
&&&&&&&&&if&(g.Type&==&Gesture.GestureType.TYPECIRCLE)
&&&&&&&&&{
&&&&&&&&&&&&//&create&the&cube&...
&&&&&&&&&&&&if&(this.cube&==&null)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&this.cube&=&GameObject.Instantiate(this.cubePrefab,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&this.cubePrefab.transform.position,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&this.cubePrefab.transform.rotation)&as&GameO
&&&&&&&&&&&&}
&&&&&&&&&}
&&&&&&&&&if&(g.Type&==&Gesture.GestureType.TYPESWIPE)
&&&&&&&&&{
&&&&&&&&&&&&if&(this.cube&!=&null)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&Destroy(this.cube);
&&&&&&&&&&&&&&&this.cube&=&
&&&&&&&&&&&&}
&&&&&&&&&}
&&&&&&foreach&(var&h&in&hc.GetFrame().Hands)
&&&&&&&&&if&(h.IsRight)
&&&&&&&&&{
&&&&&&&&&&&&this.lblRightHandPosition.text&=&string.Format("Right&Hand&Position:&{0}",&h.PalmPosition.ToUnity());
&&&&&&&&&&&&this.lblRightHandRotation.text&=&string.Format("Right&Hand&Rotation:&",&h.Direction.Pitch,&h.Direction.Yaw,&h.Direction.Roll);
&&&&&&&&&&&&if&(this.cube&!=&null)
&&&&&&&&&&&&&&&this.cube.transform.rotation&=&Quaternion.EulerRotation(h.Direction.Pitch,&h.Direction.Yaw,&h.Direction.Roll);
&&&&&&&&&&&&foreach&(var&f&in&h.Fingers)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&if&(f.Type()&==&Finger.FingerType.TYPE_INDEX)
&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&//&this&code&converts&the&tip&position&from&leap&motion&to&unity&world&position
&&&&&&&&&&&&&&&&&&Leap.Vector&position&=&f.TipP
&&&&&&&&&&&&&&&&&&Vector3&unityPosition&=&position.ToUnityScaled(false);
&&&&&&&&&&&&&&&&&&Vector3&worldPosition&=&hc.transform.TransformPoint(unityPosition);
&&&&&&&&&&&&&&&&&&//string&msg&=&string.Format("Finger&ID:{0}&Finger&Type:&{1}&Tip&Position:&{2}",&f.Id,&f.Type(),&worldPosition);
&&&&&&&&&&&&&&&&&&//Debug.Log(msg);
&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&}
&&&&&&&&&if&(h.IsLeft)
&&&&&&&&&{
&&&&&&&&&&&&this.lblLeftHandPosition.text&=&string.Format("Left&Hand&Position:&{0}",&h.PalmPosition.ToUnity());
&&&&&&&&&&&&this.lblLeftHandRotation.text&=&string.Format("Left&Hand&Rotation:&",&h.Direction.Pitch,&h.Direction.Yaw,&h.Direction.Roll);
&&&&&&&&&&&&if&(this.cube&!=&null)
&&&&&&&&&&&&&&&this.cube.transform.rotation&=&Quaternion.EulerRotation(h.Direction.Pitch,&h.Direction.Yaw,&h.Direction.Roll);
&&&&&&&&&}
}这个脚本里实现好几个功能,我将指出最重要的部分,剩下的大家自己摸索,例如,我不会涉及讲解UI界面方面的代码等等。你可以看看别人写的一些关于新的UGUI的系列博文。我们定义了一个Hand Controller对象hc,这里就引用了Hand Controller对象,我们就可以在此脚本中调用此对象中的功能,第一件事是,我们需要用HandController对象注册手势,这在Start()方法中完成,这里有一些预先定义好的手势,所以我们将使用其中的一些,在这个示例中,我们注册了食指转圈,扫动,屏幕轻触手势类型。我们还定义了两个GameObject变量,名为cubePrefab和cube,cubePrefab是我们引用的一个代表我们的立方体的预制体,这个预制体有对应材质和其他一些组件附加其上。让我们看看Update()函数,这是所有魔法发生的地方,这也许会有点疑惑,但是你马上会了解它,我们在这里查找手势类型为typecircle,这将实例出一个我们预先制作好的名为cubePrefab的预制体,所以,第一件事是将当前帧对象传递到Hand Controller对象,一个帧对象包含了所有有关手部运动的信息,下一步是获得由传感器检测到的所有手势并储存为一个列表。下一步我们将循环遍历每一个手势,并检测它的类型,如果我们检测到CIRCLE手势,我们就检查,我们是否已经实例化了我们的立方预制体,如果没有,实例化它,如何下一个手势类型是SWIPE,这将销毁我们实例化的预制体。下一个循环基本上遍历检测完所有的手,检测它是左手还是右手,基于哪只手在执行特定的操作,在这个例子里,我们只是获得手的位置和旋转,并且根据手部的旋转来旋转我们实例化的立方体,没什么奇怪的。Demo演示视频
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量4799点击量4152点击量3779点击量3431点击量3162点击量3159点击量3130点击量2968点击量2854
&2016 Chukong Technologies,Inc.
京公网安备89

我要回帖

更多关于 leap motion手势识别 的文章

 

随机推荐