leap motion初使用

下载使用驱动软件:

 

 

 

leap motion代替鼠标控制电脑:touchfree下载sdk

虚拟手设置(使用unity)

姿势检测:PoseDetector及派生组件

使用vs2013配置leap motion并进行编程:

配置opencv用以图像的获取和显示

打开vs(我用的是vs2013)
建一个c++的win32项目 ,属性-配置属性中配置如下:
(1)C/C++》常规》附加包含目录》添加:E:\Leap_Motion_SDK_Windows_2.3.1\LeapDeveloperKit_2.3.1+31549_win\LeapSDK\include
(2)链接器》常规》附加库目录》添加:
E:\Leap_Motion_SDK_Windows_2.3.1\LeapDeveloperKit_2.3.1+31549_win\LeapSDK\lib\x86
(3)链接器》输入》附加依赖项》添加:Leap.lib

使用unity开发leap motion

 下载unity

用unity hub下载

下载unity,下载unity hub获得许可证,下载plastic SCM管理unity项目。

unity中文

汉化中文包

创建unity项目,打开项目后,点击leap motion的unity插件资料包即可导入unity中。

core提供unity与ultraleap之间的接口;hands提供首部模型;interaction engine进行绑定用于交互。

创建跟踪手

  1. 创建一个场景
  2. 绑定core插件:Ultraleap Tracking > Core > Runtime > Prefabs(选择service producer)
  3. 绑定hands插件

 运行即可展示手部的动作变化。

wrist手腕    palm手心   五指

leap motion手势识别想法:

leap motion API自带函数Gesture

选定几个基本手势,其他手势是这些基本手势的组合

在unity中通过修改脚本实现leap motion的手势识别:

创建脚本,创建预制体,绑定脚本

给unity场景中的物体绑定行为:创建一个脚本,将脚本绑定到物体上

B站视频:

leap motion示例在 

unity的leap motion插件有判断手势的脚本:

 

出现错误:(忽略即可)

解决方法:加using UnityEngine.UI 

功能实现

1.点击按钮,按钮消失,出现图片

 2.图片的显示和隐藏

3.每隔5s切换图片

 3.实现图片的切换

https://blog.csdn.net/qq_44021223/article/details/115012953

4.每隔一段时间实现那图片的切换

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class togglePic : MonoBehaviour
{
    public Image image;
    public Texture2D texture1;
    public Texture2D texture2;
    public Texture2D texture3;
    public Sprite sprite1;
    public Sprite sprite2;
    public Sprite sprite3;
    public Sprite[] spriteArray = new Sprite[3];
    private int rNum;

    private void Start()
    {
        image = GameObject.Find("pic").GetComponent<Image>();
        texture1 = Resources.Load<Texture2D>("imgs/jd");
        texture2 = Resources.Load<Texture2D>("imgs/qt");
        texture3 = Resources.Load<Texture2D>("imgs/bu");
        //Debug.Log("texture");
        sprite1 = Sprite.Create(texture1, new Rect(0, 0, texture1.width, texture1.height), new Vector2(0.5f, 0.5f));
        sprite2 = Sprite.Create(texture2, new Rect(0, 0, texture2.width, texture2.height), new Vector2(0.5f, 0.5f));
        sprite3 = Sprite.Create(texture3, new Rect(0, 0, texture3.width, texture3.height), new Vector2(0.5f, 0.5f));
        //Debug.Log("sprite");
        spriteArray[0] = sprite1;
        spriteArray[1] = sprite2;
        spriteArray[2] = sprite3;

        //InvokeRepeating:开始0s后执行回调函数changePic,之后每隔5s都再执行一次回调函数
        InvokeRepeating("changePic", 0, 5);

    }

    private void Update()
    {
      
    }

    public void changePic()
    {
        rNum = Random.Range(0, 3);
        image.sprite = spriteArray[rNum];
        Debug.Log(rNum);
    }

}

创建数组:public Sprite[] spriteArray = new Sprite[3];

InvokeRepeating("changePic",0,5);


public void changePic()
    {
        rNum = Random.Range(0, 3);
        image.sprite = spriteArray[rNum];
        Debug.Log(rNum);
    }

5.leap motion石头剪刀布手势识别

6.获取手的手势、图片中的手势

找到物体==》获取物体的组件==》获取组件中的变量值

public GameObject gg;

gg = GameObject.Find("jd_st_bu");

public int gv;

gv = gg.GetComponent<gestureValue>().gValue;

7.根据手的手势和图片中的手势判断输赢

//获取手的手势
    public void getGesture()
    {
        gv = gg.GetComponent<gestureValue>().gValue;
        switch (gv)
        {
            case 0: Debug.Log("你做出的手势:剪刀"); break;
            case 1: Debug.Log("你做出的手势:石头"); break;
            case 2: Debug.Log("你做出的手势:布"); break;
            default: Debug.Log("未检测到手势"); break;
        }
        //Debug.Log(gv);
    }
    //获取图片中手势
    public void getPicNum()
    {
        spriteValue = rNum;
        // Debug.Log("getNum" + spriteValue);
        switch (spriteValue)
        {
            case 0: Debug.Log("图片中的手势:剪刀"); break;
            case 1: Debug.Log("图片中的手势:石头"); break;
            default: Debug.Log("图片中的手势:布"); break;
        }
    }
    //根据手的手势和图片中的手势判断输赢
    public void judgeS_F()
    {
        getPicNum();
        getGesture();
        subtract = gv - spriteValue;
        switch(subtract)
        {
            case 1:Debug.Log("赢"); break;
            case -2: Debug.Log("赢"); break;
            case 0: Debug.Log("平局"); break;
            case -1: Debug.Log("输"); break;
            case 2: Debug.Log("输"); break;
            default: Debug.Log("未检测到手势"); break;

        }
        
    }

8.判断输赢是在某一瞬间,在这个时间点上,图片的手势一出来,此时或者这个时间点之前的手的手势,用这两个手势做比较,这时就出现问题:图片手势出来之后再做出的手势不能与此时的图片手势比较,比较的是图片手势切换之前的动作,这是不合理的。

将时间进行分段

//根据手的手势和图片中的手势判断输赢
    public void judgeS_F()
    {
        
        //timer += Time.deltaTime;
        getPicNum();
       //float timer = 0;
       // while (timer < 1)
       // {
       //     timer += Time.deltaTime;
       // }

        //间隔1s后再执行
        float duration1 = 2;
        Invoke("getGesture", duration1);

        //间隔3s后得出判断结果
        float duration2 = 2.9f;
        Invoke("getSubtract", duration2);
        
    }

9.物体的组件添加和删除

Destroy(gameObject.GetComponent<togglePic>());

gameObject.AddComponent<togglePic>();

10.unity存储和读取数据:

提线木偶模块实现

1.获取关节点

2.关节点旋转

3.获取追踪的手指数据

模块一剪刀石头布设计思路:

关卡一:1分钟的时间内,每隔5s给出一个剪刀石头布的手势,测试者需要根据给出的手势做出能够胜出的手势,统计正确率

关卡二: 先是30s的给出一组手势,测试者需要记住这组手势,并在之后按顺序做出能够胜出的手势,统计时间和正确率,可以选择退出,也会记录。

模块二手指操:

手指操重要的不是动作规范,而是要跟着做到足够数量。

跟随音乐,提示动作,leap motion判断动作是否标准。

10个动作:

1.

手掌上下摩擦

2.

交叉手势上下摩擦 ,交换双手动作

3.

十指交叉,伸直弯曲 

4。

十指交叉,手腕 左右摆动

5.

双手拇指分别与其他四指捏合,先顺时针再逆时针 

6.

五指伸直捏拳,捏拳手势是拇指在最里面再四指 

7.

双手伸至肩膀,一手张开,一手握拳,左右摆动前臂同时交换两手的手势 

8.

一手手臂伸直握拳,一手 放至胸口张开,不断交换两手动作

 9.

一手伸直,一手手心向外推另外一只手,交换动作

10.

两手食指和拇指做爬梯运动

这个手指操感觉用leap motion不太好弄,手指之间交互很密集,leap motion不太好识别,可以做个人体模型,上半身的,带着做操。

做出复杂手势,leap motion识别不灵敏,多个手指不同手势。。。

继承类,调用父类的成员???

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值