下载使用驱动软件:
leap motion代替鼠标控制电脑:touchfree下载sdk
虚拟手设置(使用unity)
姿势检测:PoseDetector及派生组件
使用vs2013配置leap motion并进行编程:
打开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获得许可证,下载plastic SCM管理unity项目。
创建unity项目,打开项目后,点击leap motion的unity插件资料包即可导入unity中。
core提供unity与ultraleap之间的接口;hands提供首部模型;interaction engine进行绑定用于交互。
创建跟踪手
- 创建一个场景
- 绑定core插件:Ultraleap Tracking > Core > Runtime > Prefabs(选择service producer)
- 绑定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识别不灵敏,多个手指不同手势。。。
继承类,调用父类的成员???