1. 程式人生 > >Unity Leap Motion學習筆記

Unity Leap Motion學習筆記

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就做完了,執行程式就可以去體驗了。