LeapMotion第2代 Unity示范代码(桌面开发)

一、官方地址:

官网:https://www.ultraleap.com/
驱动下载:https://leap2.ultraleap.com/downloads/leap-motion-controller-2/
docs地址:https://docs.ultraleap.com/xr-and-tabletop/tabletop/unity/getting-started/index.html
unity开发地址(Demo下载):https://docs.ultraleap.com/xr-and-tabletop/tabletop/unity/getting-started/index.html
unity开发代码:https://docs.ultraleap.com/xr-and-tabletop/xr/unity/plugin/features/scripting-fundamentals.html


二、安装驱动

地址:https://www.sogou.com/tx?ie=utf-8&query=<%2Fb>&hdq=sogou-addr-cc9657884708170e&sourceid=6_01_03

在这里插入图片描述
在这里插入图片描述
这样说明已经安装成功


三、安装TouchFree

Ultraleap的TouchFree软件使用手部跟踪数据来生成屏幕光标,用户可以无接触地控制该光标。这种非接触式手势控制允许与信息亭和数字显示器进行简单、直观和卫生的交互。

  • 下载
    在这里插入图片描述
  • 安装完成后,进行配置
    在这里插入图片描述
    在这里插入图片描述
  • 根据设备安放情况,选择
    在这里插入图片描述
  • 接着,把手指悬空点在绿色的圈圈上,并按下空格,这里需要2次这样操作
    在这里插入图片描述
  • 配置完成,看到手指已经有光标跟随了,手指往前戳下,代表点击
  • 在小图标上,点击Start TouchFree,这样功能就永久启动起来了
    在这里插入图片描述

touchfree模式,不用要开发,就可实验手势点击功能,由官方直接提供


四、Unity安装LeapMotion插件

https://docs.ultraleap.com/xr-and-tabletop/tabletop/unity/getting-started/index.html

  • 安装包(能科学上网,速度更快)
    在这里插入图片描述
  • 打开Capsule Hands场景进行测试
    在这里插入图片描述
  • 测试出来手掌就成功了
    在这里插入图片描述

五、Unity安装LeapMotion最基础开发

1. 识别哪只手进入
  • 新建一个场景 LeapMotion
  • 建立一个Service Provider Desktop
    在这里插入图片描述
  • 建立一个LeapMotion的cs脚本
using UnityEngine;
using Leap;public class LeapMotion : MonoBehaviour
{public LeapProvider leapProvider;private void OnEnable(){leapProvider.OnHandFound += OnHandFound;leapProvider.OnHandLost += OnHandLost;leapProvider.OnUpdateFrame += OnUpdateFrame;}private void OnDisable(){leapProvider.OnHandFound -= OnHandFound;leapProvider.OnHandLost -= OnHandLost;leapProvider.OnUpdateFrame -= OnUpdateFrame;}private void OnHandFound(Chirality hand){if (hand == Chirality.Left){Debug.Log("发现左手");}else if (hand == Chirality.Right) {Debug.Log("发现右手");}}private void OnHandLost(Chirality hand){if (hand == Chirality.Left){Debug.Log("左手消失");}else if (hand == Chirality.Right){Debug.Log("右手消失");}}void OnUpdateFrame(Frame frame){foreach (var hand in frame.Hands){if (hand.IsLeft){//获取左手Hand _leftHand = frame.GetHand(Chirality.Left);OnUpdateHand(_leftHand);}else if (hand.IsRight) {// 获取右手Hand _rightHand = frame.GetHand(Chirality.Right);OnUpdateHand(_rightHand);}}}void OnUpdateHand(Hand _hand){if (_hand.IsLeft){Debug.Log("左手");}else if (_hand.IsRight) {Debug.Log("右手");}}
}
  • 建立一个LeapMotion对象,把脚本拖入场景,运行测试
    在这里插入图片描述

该脚本识别出了哪只手进入或离开,并实时获取那只手,后面需要进一步获取手的更多信息

2. 获取手的位置与角度
  • 五个指头的英文,Thumb大拇指,Index食指,Middle中指,Ring无名指,Pinky小指

Frames API:https://docs.ultraleap.com/api-reference/unity-api/class/class_leap_1_1_frame.html#class-Leap.Frame
Hand API:https://docs.ultraleap.com/api-reference/unity-api/class/class_leap_1_1_hand.html#class-Leap.Hand
Finger API:https://docs.ultraleap.com/api-reference/unity-api/class/class_leap_1_1_finger.html#class-Leap.Finger

  • 获取代码
    void OnUpdateFrame(Frame frame){foreach (var hand in frame.Hands){if (hand.IsLeft){//获取左手Hand _leftHand = frame.GetHand(Chirality.Left);OnUpdateHand(_leftHand);}else if (hand.IsRight) {// 获取右手Hand _rightHand = frame.GetHand(Chirality.Right);OnUpdateHand(_rightHand);}}}void OnUpdateHand(Hand _hand){Finger _index = _hand.GetFinger(Finger.FingerType.INDEX);if (_hand.IsLeft){Debug.Log("左手");}else if (_hand.IsRight) {Debug.Log("右手");}Debug.Log("手掌位置" + _hand.PalmPosition.ToString());Debug.Log("手掌角度" + _hand.PalmarAxis().ToString());Debug.Log("手指位置" + _index.TipPosition.ToString());Debug.Log("手指方向-向量" + _index.Direction.ToString());}
3. 获取手是否捏了下,拇指与食指触碰 和 获取是否握拳

LeapMotion对于捏和握拳有特别的检测器,分别是PinchDetector 捏检测器,GrabDetector 握拳检测器

  • 建立一个检测器的对象,里面有左右手对象
    在这里插入图片描述
  • 在左右手里,分别加入检测器
    在这里插入图片描述
  • 代码:
using UnityEngine;
using Leap;public class LeapMotion : MonoBehaviour
{public LeapProvider leapProvider;public PinchDetector leftPinchDetector;public PinchDetector rightPinchDetector;public GrabDetector leftGrabDetector;public GrabDetector rightGrabDetector;private void OnEnable(){leapProvider.OnHandFound += OnHandFound;leapProvider.OnHandLost += OnHandLost;leapProvider.OnUpdateFrame += OnUpdateFrame;leftPinchDetector.onActionStart += LeftHandPinchStart;leftPinchDetector.onAction += LeftHandPinching;leftPinchDetector.onActionEnd += LeftHandPinchEnd;rightPinchDetector.onActionStart += RightHandPinchStart;rightPinchDetector.onAction += RightHandPinching;rightPinchDetector.onActionEnd += RightHandPinchEnd;leftGrabDetector.onActionStart += LeftHandGrapStart;leftGrabDetector.onActionEnd += LeftHandGrabEnd;rightGrabDetector.onActionStart += RightHandGrabStart;rightGrabDetector.onActionEnd += RightHandGrabEnd;}private void OnDisable(){leapProvider.OnHandFound -= OnHandFound;leapProvider.OnHandLost -= OnHandLost;leapProvider.OnUpdateFrame -= OnUpdateFrame;leftPinchDetector.onActionStart -= LeftHandPinchStart;leftPinchDetector.onAction -= LeftHandPinching;leftPinchDetector.onActionEnd -= LeftHandPinchEnd;rightPinchDetector.onActionStart -= RightHandPinchStart;rightPinchDetector.onAction -= RightHandPinching;rightPinchDetector.onActionEnd -= RightHandPinchEnd;leftGrabDetector.onActionStart -= LeftHandGrapStart;leftGrabDetector.onActionEnd -= LeftHandGrabEnd;rightGrabDetector.onActionStart -= RightHandGrabStart;rightGrabDetector.onActionEnd -= RightHandGrabEnd;}private void OnHandFound(Chirality hand){if (hand == Chirality.Left){Debug.Log("发现左手");}else if (hand == Chirality.Right){Debug.Log("发现右手");}}private void OnHandLost(Chirality hand){if (hand == Chirality.Left){Debug.Log("左手消失");}else if (hand == Chirality.Right){Debug.Log("右手消失");}}void OnUpdateFrame(Frame frame){foreach (var hand in frame.Hands){if (hand.IsLeft){//获取左手Hand _leftHand = frame.GetHand(Chirality.Left);OnUpdateHand(_leftHand);}else if (hand.IsRight) {// 获取右手Hand _rightHand = frame.GetHand(Chirality.Right);OnUpdateHand(_rightHand);}}}void OnUpdateHand(Hand _hand){Finger _index = _hand.GetFinger(Finger.FingerType.INDEX);if (_hand.IsLeft){Debug.Log("左手");}else if (_hand.IsRight){Debug.Log("右手");}Debug.Log("手掌位置" + _hand.PalmPosition.ToString());Debug.Log("手掌角度" + _hand.PalmarAxis().ToString());Debug.Log("手指位置" + _index.TipPosition.ToString());Debug.Log("手指方向-向量" + _index.Direction.ToString());}private void RightHandGrabEnd(Hand hand){Debug.Log("Right 抓拳");}private void RightHandGrabStart(Hand hand){Debug.Log("Right 抓拳放开");}private void LeftHandGrabEnd(Hand hand){Debug.Log("Left 抓拳");}private void LeftHandGrapStart(Hand hand){Debug.Log("Left 抓拳放开");}private void RightHandPinchEnd(Hand hand){Debug.Log("Right 捏放开");}private void RightHandPinching(Hand hand){Debug.Log("Right 捏住移动中");}private void RightHandPinchStart(Hand hand){Debug.Log("Righ 捏住");}private void LeftHandPinchEnd(Hand hand){Debug.Log("Left 捏放开");}private void LeftHandPinching(Hand hand){Debug.Log("Left 捏住移动中");}private void LeftHandPinchStart(Hand hand){Debug.Log("Left 捏住");}
}

六、结束语

2代的LeapMotion对长距离传输信号更加友好,好像也提供了大面积手势识别的融合方案,感谢一起学习
源代码:https://download.csdn.net/download/qq_17523181/90379338

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入剖析推理模型:从DeepSeek R1看LLM推理能力构建与优化

著名 AI 研究者和博主 Sebastian Raschka 又更新博客了。原文地址&#xff1a;https://sebastianraschka.com/blog/2025/understanding-reasoning-llms.html。这一次&#xff0c;他将立足于 DeepSeek 技术报告&#xff0c;介绍用于构建推理模型的四种主要方法&#xff0c;也就是…

使用Cocos Creator制作“打砖块”小游戏:从零开始的详细教程

Cocos Creator是一款强大的游戏开发工具,特别适合2D游戏的开发。本文将以经典的“打砖块”小游戏为例,逐步讲解如何使用Cocos Creator实现这个游戏。我们将从项目创建、场景搭建、脚本编写到最终的游戏发布,详细讲解每一步的实现过程。 1. 环境准备 首先,确保你已经安装了…

vue3常见面试题

当然&#xff0c;以下是关于 Vue 3 的一些常见面试题及其答案&#xff1a; 1. Vue 3 相比 Vue 2 有哪些主要改进&#xff1f; 性能提升&#xff1a;Vue 3 在编译时做了更多的优化&#xff0c;比如静态提升&#xff08;hoisting static nodes&#xff09;、事件监听缓存等。更…

Ubuntu 22.04 LTS 安装MinerU

1. 检测是否已安装nvidia驱动 nvidia-smi 如果看到类似如下的信息&#xff0c;说明已经安装了nvidia驱动&#xff0c;可以跳过步骤2 Note CUDA Version 显示的版本号应 > 12.1&#xff0c;如显示的版本号小于12.1&#xff0c;请升级驱动 2. 安装驱动 如没有驱动&#…

DeepSeek 指导手册(入门到精通)

第⼀章&#xff1a;准备篇&#xff08;三分钟上手&#xff09;1.1 三分钟创建你的 AI 伙伴1.2 认识你的 AI 控制台 第二章&#xff1a;基础对话篇&#xff08;像交朋友⼀样学交流&#xff09;2.1 有效提问的五个黄金法则2.2 新手必学魔法指令 第三章&#xff1a;效率飞跃篇&…

MacOS使用PhpWebStudy搭建PHP开发环境

mac上的PHP开发环境搭建方式有很多, brew, docker, mamp等, 这里使用最近新出的工具PhpWebStudy来搭建mac上的php开发环境 安装 使用brew安装 brew install phpwebstudy 无法使用brew的话, 可以去官网下载最新版本安装 FlyEnv | Powerful Web Server and Environment Mana…

布隆过滤器的原理和应用场景,解决缓存穿透

一、布隆过滤器BloomFilter是什么 布隆过滤器BloomFilter是一种专门用来解决去重问题的高级数据结果。 实质就是一个大型位数组和几个不同的无偏hash函数&#xff0c;无偏表示分布均匀。由一个初值为零的bit数组和多个哈希函数组成&#xff0c;用来判断某个数据是否存在&…

macOs安装nvm

首先确定本机上没有安装nvm 如果之前安装过先卸载 1. 删除 nvm 目录 首先&#xff0c;删除 nvm 所安装的文件目录。默认情况下&#xff0c;nvm 会安装到 ~/.nvm 目录。 运行以下命令删除 nvm 目录&#xff1a; rm -rf ~/.nvm2. 移除 .zshrc 或 .bash_profile 中的 nvm 配置…

uniapp + vite + 使用多个 ui 库

样式冲突 新建了个项目 安装多个 ui 库 发现 uview-plus 和 Ant Design Vue 3.2.20 的 按钮样式 冲突uvuew-plus 的按钮样式 会被 ant 的样式给覆盖解决方式 找到圆满 ant.css 注释 button, html [type"button"], [type"reset"], [type"submit&quo…

【大语言模型】在大语言模型中,user、assistant、system 三种角色的定位和功能有何不同。

在大语言模型&#xff08;如GPT系列&#xff09;中&#xff0c;user、assistant、system 是三种核心角色&#xff0c;它们的定位和功能不同&#xff0c;共同构成对话的上下文结构。以下是具体区别和用途&#xff1a; 1. System&#xff08;系统角色&#xff09; 定位&#xff…

react中如何获取真实的dom

在 React 中&#xff0c;获取真实的 DOM 元素通常通过 ref 来实现。ref 是一个特殊的属性&#xff0c;用于引用组件或 DOM 元素的实例。你可以通过 ref 获取到组件的真实 DOM 元素或组件实例。 1. 函数组件中的 useRef 在函数组件中&#xff0c;获取 DOM 元素的引用需要使用 …

关于“前端已死”的命题

翻阅知乎论坛&#xff0c;看了各位大佬的解析&#xff0c;从技术发展、市场环境、岗位需求三个维度综合理解这个命题&#xff1a; 1. 技术层面 前端技术生态并未停滞&#xff0c;反而持续迭代升级。HTML/CSS/JavaScript 核心基础未变&#xff0c;但框架&#xff08;如 Vue、R…

Docker Compose:编排多容器应用

1. 什么是 Docker Compose? Docker Compose 是一个用于定义和管理多容器 Docker 应用的工具。它通过一个简单的配置文件(docker-compose.yml),让你能够在一个命令下启动、停止和管理多个容器。这使得在开发、测试和生产环境中,管理复杂的应用变得更加简单。 Docker Comp…

(2025)深度分析DeepSeek-R1开源的6种蒸馏模型之间的逻辑处理和编写代码能力区别以及配置要求,并与ChatGPT进行对比(附本地部署教程)

(2025)通过Ollama光速部署本地DeepSeek-R1模型(支持Windows10/11)_deepseek猫娘咒语-CSDN博客文章浏览阅读1k次&#xff0c;点赞19次&#xff0c;收藏9次。通过Ollama光速部署本地DeepSeek-R1(支持Windows10/11)_deepseek猫娘咒语https://blog.csdn.net/m0_70478643/article/de…

Ubuntu安装geteck/jetlinks实战:源码启动

这个还是很复杂的&#xff0c;建议使用docker即可。 参考 使用源码启动JetLinks | JetLinks 物联网基础平台 安装Ubuntu虚拟机&#xff08;略&#xff09;安装JDK8编译Redis安装mysql ubuntu安装MySqL server-CSDN博客 初次使用&#xff0c;不要安装ElasticSearch下载源码…

【docker知识】快速找出服务器中占用内存较高的容器

本文由Markdown语法编辑器编辑完成。 1.背景&#xff1a; 近期在处理现场问题&#xff0c;观察服务器时&#xff0c;会遇到某些进程占用较高内存的情况。由于我们的服务&#xff0c;基本上都是以容器的方式在运行&#xff0c;因此就需要找到&#xff0c;到底是哪个容器&#…

Jenkins 安装插件 二

Jenkins 安装插件 二 一. 打开 Dashboard 打开 Jenkins 界面&#xff0c;不管在任何界面&#xff0c;只需要点击左上角 Dashboard 按钮即可 二. 打开 Manage Jenkins 找到 Manage Jenkins -> System Configuration -> Plugins 点击 Plugins 打开界面如下 Updates&a…

OpenCV机器学习(1)人工神经网络 - 多层感知器类cv::ml::ANN_MLP

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::ml::ANN_MLP 是 OpenCV 库中的一部分&#xff0c;用于实现人工神经网络 - 多层感知器&#xff08;Artificial Neural Network - Multi-Layer…

Qt中的事件

写一个 可以拖动的按钮 DraggablePushButton.h 头文件 #ifndef DRAGGABLEPUSHBUTTON_H #define DRAGGABLEPUSHBUTTON_H#include <QPushButton> #include <QMouseEvent>class DraggablePushButton : public QPushButton {Q_OBJECTpublic:explicit DraggablePushBu…

Postgresql 开发环境搭建指南(WindowsLinux)

一、Postgresql 简介 PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS)&#xff0c;在灵活的BSD许可证下发行。 RDBMS 是关系数据库管理系统&#xff0c;是建立实体之间的联系&#xff0c;最后得到的是关系表。 ORDBMS在原来关系数据库的基础上&#xff0c;增加了一些新…