Leap Motion学习笔记
使用Leap Motion前先安装下面的程序
https://www.leapmotion.com/setup/desktop/windows
//LeapMotion历史版本下载地址
https://github.com/leapmotion/UnityModules/releases
//Leap Motion Unity集成使用文档地址
https://developer.leapmotion.com/documentation/unity/index.html
当前我使用的Leap Motion Unity包是LeapMotion_CoreAssets_4.1.6.unitypackage(也是最新的),unity版本5.6.1f1,使用最新的Unity开发包需要5.5以上的Unity,否则会报错。
注意:
Unity3D使用左手公约的坐标系统,而Leap Motion API使用右手的公约。(基本上,在相反的方向。Z轴点)统一使用米的默认单位,而Leap Motion API使用毫米。插件脚本内部转换跟踪数据使用左手坐标系和尺度距离值米。
我们需要把Unity的包都下载下来:如下
导入这些包我们可以先看看官方的例子.
下面我们自己去现实功能。(做这样一个Demo:创建一个Cube,左手控制它旋转,右手控制它移动,食指点击Cube旋转,大拇指点击Cube 停止旋转)
创建一个新工程,导入LeapMotionSDK。在场景中创建一个Cube物体。接下来我们就可以去创建我们的手了,找到LeapMotion—Prefabs—LeapHandController把它拖到场景中去(这是手的控制器),接下来我们去创建手,找到LeapMotion—Prefabs—HandModelsNoHuman把CapsuleHand_L和CapsuleHand_R都拖到场景中,(这是不带物理属性的),接下来我们也要把带物理属性的手放到场景中去,在HandModelsNoHuman文件下边有一个HandModelsPhysical文件夹把里面的RigidRoundHand_L和RigidRoundHand_R都拖到场景中,这样手就创建完成了,为了方便管理我们在场景中创建一个物体来管理者刚刚我们创建的4个手,在场景中创建一个名为HandModels的空物体,把刚刚我们拖到场景中的手都做为它的子物体即可。如图
现在运行还不能看到效果,我们还需要设置下LeapHandController,在场景中找到它,然后在Inspector面板,找到HandPool组件,把HandModels赋给ModelsParent,找到ModelPool—size改为2。在Element0中把没有物理属性的手赋给对应的变量,在Element1中把带有物理属性的手赋给对应的变量。如图:
这样我们就把手给配置好了,运行里的程序,里就可以测试你的手了。
啦啦啦啦!现在我们可以开始写代码去控制Cube物体的事件了,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Leap.Unity;
using Leap;
public class Demo : MonoBehaviour
{
//thumb - 大拇指
//index - 食指
//middle - 中指
//pinky - 小指
//ring - 无名指
//palm - 手掌
//forearm - 手臂
bool IsRotate = false;
string MyHand;//手
string MyFinger;//手指
LeapProvider provider;
public LeapHandController hc;//控制器
void Start()
{
//找到LeapProvider对象
provider = FindObjectOfType<LeapProvider>() as LeapProvider;
}
void OnTriggerEnter(Collider c)
{
//检测左右手
if (c.gameObject.transform.parent.gameObject.transform.parent.name == "RigidRoundHand_R")
{
MyHand = "右手";
}
else if (c.gameObject.transform.parent.gameObject.transform.parent.name == "RigidRoundHand_L")
{
MyHand = "左手";
}
//检测手指
switch (c.gameObject.transform.parent.name)
{
case "thumb":
MyFinger = "大拇指";
break;
case "index":
MyFinger = "食指";
break;
case "middle":
MyFinger = "中指";
break;
case "pinky":
MyFinger = "小指";
break;
case "ring":
MyFinger = "无名指";
break;
case "palm":
MyFinger = "手掌";
break;
}
Debug.Log("您的"+ MyHand + MyFinger + ":碰撞到了我");
if (c.gameObject.transform.parent.name.Equals("index"))
{
IsRotate = true;
}
else if (c.gameObject.transform.parent.name.Equals("thumb"))
{
IsRotate = false;
}
}
void Update()
{
if (IsRotate == true)
{
this.transform.Rotate(10, 0, 0);
}
Frame frame = provider.CurrentFrame;//得到每一帧
foreach (Hand hand in frame.Hands)//获取每一帧里面的手
{
if (hand.IsLeft)//左手
{
//如果是左手让物体跟着手势旋转---hand.Basis手势的基本数据
transform.rotation = hand.Basis.CalculateRotation();
}
if (hand.IsRight)//右手
{
//如果是右手让物体跟着手势移动
transform.position = hand.PalmPosition.ToVector3() + hand.PalmNormal.ToVector3() * (transform.localScale.y * 0.5f + 0.2f);
}
}
}
}
OK!接着我们把脚步挂在Cube物体上。整个demo就做完了,运行程序就可以去体验了。