Unity Leap Motion学习笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MIYIshi/article/details/72577441

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物体。接下来我们就可以去创建我们的手了,找到LeapMotionPrefabsLeapHandController把它拖到场景中去(这是手的控制器),接下来我们去创建手,找到LeapMotionPrefabsHandModelsNoHumanCapsuleHand_LCapsuleHand_R都拖到场景中,(这是不带物理属性的),接下来我们也要把带物理属性的手放到场景中去,在HandModelsNoHuman文件下边有一个HandModelsPhysical文件夹把里面的RigidRoundHand_LRigidRoundHand_R都拖到场景中,这样手就创建完成了,为了方便管理我们在场景中创建一个物体来管理者刚刚我们创建的4个手,在场景中创建一个名为HandModels的空物体,把刚刚我们拖到场景中的手都做为它的子物体即可。如图

现在运行还不能看到效果,我们还需要设置下LeapHandController,在场景中找到它,然后在Inspector面板,找到HandPool组件,把HandModels赋给ModelsParent,找到ModelPoolsize改为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就做完了,运行程序就可以去体验了。

猜你喜欢

转载自blog.csdn.net/MIYIshi/article/details/72577441
今日推荐