Leap Motion开发第一步环境配置
到leap官网下载好sdk, 找到自己sdk安装的位置,
我的是直接放在桌面上的,记住图中红线位置,等下配置环境变量会用到
找到系统的 “环境配置”
新建一个为 leapsdk的用户变量。 把上面的画红色路径添加进去
找到用户变量 path ,把sdk所在的dll路径添加进去(如果找不到,可以如上同样新建一个)
保持设置。同时注销或者重新启动电脑。让刚才的配置生效
然后新建一个c++项目,右键项目属性。
vc++目录->可执行文件目录。将 $(leapsdk)\lib\x86 添加进去
包含目录。将$(leapsdk)\include添加进去
库目录,将$(leapsdk)\lib\x86添加进去
链接器-->输入-->附加依赖项 ,添加附加依赖性,将Leapd.lib 添加进去
最后保存。
新建一个c++源文件。
把下面测试代码复制进去
/******************************************************************************\
* Copyright (C) 2012-2013 Leap Motion, Inc. All rights reserved. *
* Use subject to the terms of the Leap Motion SDK Agreement available at *
* Leap Motion proprietary and confidential. Not for distribution. * * https://developer.leapmotion.com/sdk_agreement, or another agreement *
#include <windows.h>//如果嫌刷屏太快打开这个定义1(一共2处)
#include <iostream>
#include "Leap.h"
* between Leap Motion and you, your company or other organization. * \******************************************************************************/ using namespace Leap;class SampleListener : public Listener { public:
usGained(const Controller&);
virtual vo
virtual void onInit(const Controller&);virtual void onConnect(const Controller&);virtual void onDisconnect(const Controller&);virtual void onExit(const Controller&);virtual void onFrame(const Controller&);virtual void onFo cid onFocusLost(const Controller&); };void SampleListener::onInit(const Controller& controller) {std::cout << "Initialized" << std::endl; }//打开对所有手势的识别 void SampleListener::onConnect(const Controller& controller) {std::cout << "Connected" << std::endl;
ller) {
//Note: not dispatched when running in
controller.enableGesture(Gesture::TYPE_CIRCLE);controller.enableGesture(Gesture::TYPE_KEY_TAP);controller.enableGesture(Gesture::TYPE_SCREEN_TAP);controller.enableGesture(Gesture::TYPE_SWIPE); }void SampleListener::onDisconnect(const Controller& contr oa debugger.std::cout << "Disconnected" << std::endl; }void SampleListener::onExit(const Controller& controller) {std::cout << "Exited" << std::endl; }//核心函数,当获取一帧数据时要做点什么事 void SampleListener::onFrame(const Controller& controller) {// 获取最新的一帧,并且返回一些基本信息const Frame frame = controller.frame();
.isEmpty()) {
// 得到第一只手[hands()返回HandL
std::cout << "Frame id: " << frame.id()<< ", timestamp: " << frame.timestamp()<< ", hands: " << frame.hands().count()<< ", fingers: " << frame.fingers().count()<< ", tools: " << frame.tools().count()<< ", gestures: " << frame.gestures().count() << std::endl;//非空,检测到手if (!frame.hands( )ist结构,可以向操作容器一样操作]const Hand hand = frame.hands()[0];// 检查下手是否有手指[握拳的话,是找不到手指的]const FingerList fingers = hand.fingers();if (!fingers.isEmpty()) {// 计算指尖尖端平均位置坐标Vector avgPos;for (int i = 0; i < fingers.count(); ++i) {avgPos += fingers[i].tipPosition();}avgPos /= (float)fingers.count();
normal = hand.palmNormal();
const Vector dir
std::cout << "Hand has " << fingers.count()<< " fingers, average finger tip position" << avgPos << std::endl;}// 获取手的球心半径和手掌的坐标std::cout << "Hand sphere radius: " << hand.sphereRadius()<< " mm, palm position: " << hand.palmPosition() << std::endl;// 获取手的垂直向量(垂直手心向里)和方向(以手心开始,沿着手指指尖方向)const Vector ection = hand.direction();// 计算手的俯仰Pitch角度、平面Roll旋转角度和左右Yaw旋转角度std::cout << "Hand pitch: " << direction.pitch() * RAD_TO_DEG << " degrees, "<< "roll: " << normal.roll() * RAD_TO_DEG << " degrees, "<< "yaw: " << direction.yaw() * RAD_TO_DEG << " degrees" << std::endl;}/*他并没有使用一些函数rightmost和leftmost之类*/// 获取手势
) {
case Gesture::TYPE_CIRCLE:
{
ircl
C
const GestureList gestures = frame.gestures();for (int g = 0; g < gestures.count(); ++g) {Gesture gesture = gestures[g];//这里最好去看下Gesture的定义,里面详细描述各种手势触发的阈值//编程技术比较厉害啊,都看不到Gesture的成员变量在哪里,完全被封装起来了,不是com就是dll封装的吧//我也很想学习这种完全把变量封装到看不见的方法,这样程序员会很省心(眼不见心为净)//注意下来使用了switch语句先判断它是否是这种类型手势,再进行类的重新构造switch (gesture.type( )eGesture circle = gesture;std::string clockwiseness;if (circle.pointable().direction().angleTo(circle.normal()) <= PI/4) {clockwiseness = "clockwise";//顺时针旋转的话,circle.normal()指向外侧[右手坐标系,学过物理磁力线神马的一下子就会明白]} else {clockwiseness = "counterclockwise";//逆时针,同上理解}// 计算和上一帧经过的角度float sweptAngle = 0;
tAngle = (circle.progress() - previousUpdate.prog
if (circle.state() != Gesture::STATE_START) {//如果不是第一帧[第一帧肯定不能作为判断,只能作为初始化]//frame(0)表示当前最新一帧,而frame(1)表示前一帧,以此类推//对于id的使用十分简单明了,但很重要。这样表示只针对这个人的这个手指。CircleGesture previousUpdate = CircleGesture(controller.frame(1).gesture(circle.id()));//progress()表示手指旋转了几圈,如果是0.5表示旋转了半圈,如果是3表示已经旋转了3圈[计数功能很赞啊]swe press()) * 2 * PI;//一共旋转多少弧度[显示时他再次转换成角度]}std::cout << "Circle id: " << gesture.id()<< ", state: " << gesture.state()<< ", progress: " << circle.progress()<< ", radius: " << circle.radius()<< ", angle " << sweptAngle * RAD_TO_DEG<< ", " << clockwiseness << std::endl;break;}case Gesture::TYPE_SWIPE:{//相对旋转手势来说,这个以及下面几个简单很多
id()
<< ", state: " << gestu
SwipeGesture swipe = gesture;std::cout << "Swipe id: " << gesture.id()<< ", state: " << gesture.state()<< ", direction: " << swipe.direction()//这个可是能判断所有方向的,强大!我玩Kinect时只能识别几个特定的方向。<< ", speed: " << swipe.speed() << std::endl;break;}case Gesture::TYPE_KEY_TAP:{KeyTapGesture tap = gesture;std::cout << "Key Tap id: " << gesture .re.state()<< ", position: " << tap.position()<< ", direction: " << tap.direction()<< std::endl;break;}case Gesture::TYPE_SCREEN_TAP:{ScreenTapGesture screentap = gesture;std::cout << "Screen Tap id: " << gesture.id()<< ", state: " << gesture.state()<< ", position: " << screentap.position()<< ", direction: " << screentap.direction()<< std::endl;break;
Lost
}default:std::cout << "Unknown gesture type." << std::endl;break;}}if (!frame.hands().isEmpty() || !gestures.isEmpty()) {std::cout << std::endl;}// Sleep(1000);//如果嫌刷屏太快打开这个定义2(一共2处) }void SampleListener::onFocusGained(const Controller& controller) {std::cout << "Focus Gained" << std::endl; }void SampleListener::onFocusLost(const Controller& controller) {std::cout << "Focus " << std::endl; }int main() {// 创建例子监听者和控制器SampleListener listener;Controller controller;// 让监听者获取控制器的数据并进行分析controller.addListener(listener);// 让程序一直运行,直到输入回车键才结束std::cout << "Press Enter to quit..." << std::endl;std::cin.get();// 移除监听者controller.removeListener(listener);return 0;
}
以上测试代码来自 http://52coding.com/understanding-the-cpp-sample-application 。 修改了其中的 empty 为 isEmpty(新版将empty修改为了isEmpty)
运行
Leap Motion开发第一步环境配置相关推荐
- Qt For Android 第一步 环境配置
Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架.现在已经全面支持iOS.Android.WP. 当时Qt刚开始支持安卓的时候,忘记了是5.1还是5.0版本.自己写了一个H ...
- php基础教程 第一步 环境配置及helloworld
PHP 是服务器端脚本语言.全称为 Hypertext Preprocessor 为超文本预处理器. 据说php8不久后也要发布了,趁着8还没有发布赶紧写一个php5到php7(在基础教程写完后将写p ...
- windows phone开发第一步:搭建软件开发环境
2019独角兽企业重金招聘Python工程师标准>>> windows phone开发第一步:搭建软件开发环境:http://www.cnblogs.com/hanjun/archi ...
- leap motion java_[Leap Motion开发文档翻译]Leap Motion架构
Leap Motion架构 Leap Motion体感控制器支持最流行的桌面操作系统.Leap Motion程序作为一个服务(在Windows中)或一个守护进程(在Mac和Linux中).这个程序通过 ...
- 微信公众开放平台开发07---java servlet 实现微信开发第一步:微信服务器验证
微信公众开放平台开发07---java servlet 实现微信开发第一步:微信服务器验证 技术qq交流群:JavaDream:251572072 ------------------------- ...
- vue开发移动端环境配置_如何设置移动开发环境
vue开发移动端环境配置 The use of mobile devices has increased considerably in the past decade. It has been ov ...
- Python开发第一步:如何制作一个简单的桌面应用
Python开发第一步:如何制作一个简单的桌面应用 前言 大家好,我是baifagg, 一个热爱Python的编程爱好者. 今天我们来学习一下, 如何用Python制作一个简单的桌面应用程序. 虽然桌 ...
- 使用QtCreator开发ros2的环境配置
使用QtCreator开发ros2的环境配置 使用环境 操作系统:Ubuntu 20.04 amd64 ros2版本:foxy 选择QtCreator的版本 由于ros2的ros-qtc-plugin ...
- php5.6 mysql5.5,PHP开发第一步,PHP5.6 + MySQL5.5 + Apache2.4环境搭建
前言 在web开发这个领域对php 可是早有耳闻,大家对php赞不绝口,称赞有加,这让php火了一阵子,现在也依旧流行,所以我实在是忍不住想搞搞php了,以前以为学了jsp就没必要学php了,因为用j ...
最新文章
- struts.xml向页面传参
- CPU是怎样制造的?解析intel Core i7生产全过程
- innobackupex中--slave-info参数的含义和适用场景
- RecyclerView(六)设置下拉刷新
- Linux(Centos7)下使用RPM方式安装MySQL5.7
- linux 进程 状态 ri,LINUX下解决netstat查看TIME_WAIT状态过多问题(转)
- java将中国标准模式转换成yyyy-mm-nn_java-IO
- 标准C语言程序设计第七版pdf,C语言程序设计(向华)7.pdf
- VAssistX 脚本
- 智能手机射频前端架构初识: Phase 2/3/5/6/6L/7/7L/7LE
- Visual C++ 2010创建Ribbon界面
- 浏览器架构的误区和瘦客户端应用
- qrcode生成一个带有图片的二维码
- ad网络标号怎么用_【Altium Designer】AD改变网络标号的作用域
- 听觉能力类毕业论文文献有哪些?
- java开发的微信公众号服务端生产环境中的两个大坑
- 国庆过了,该审视下自己的生活了
- 【手机号验证/前端】Vue2+elementUI编写一个手机号验证码登录页面,路由式开发(附完整代码)
- TarsGo 性能提升之路
- Netty 源码分析系列(十五)自定义解码器、编码器、编解码器
热门文章
- Unity3D中角色撞击物体弹出提示框或显示对象效果
- Linux极简快速入门|Linux操作系统(四)
- 论文笔记 Multiple Instance Detection Network with Online Instance Classifier Refinement - CVPR 2017
- 微信小程序绑定银行卡功能
- LaTeX 多层列举 条目 编号
- 微信美化版去水印小程序源码分享 附接口
- Android 判断手机设备是否是小米,华为,魅族设备
- 吃内存狂魔?微信官方工具来了:深度清理缓存
- Creo 4.0 软件安装教程
- VUE + CSS画三角形