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包是
注意:
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都拖到場景中,(這是不帶物理屬性的),接下來我們也要把帶物理屬性的手放到場景中去,在
現在執行還不能看到效果,我們還需要設定下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就做完了,執行程式就可以去體驗了。