文档章节

Leap Motion API类库:Hand

请修改个人昵称
 请修改个人昵称
发布于 2016/01/28 13:27
字数 1291
阅读 163
收藏 0

1.Hand

    手的物理特性。手部跟踪数据包括手掌位置和速度;手掌的法线方向和手指的方向;球的性质与手的匹配;和所附的手        指的列表。获取有效的手对象:

var controller = Leap.loop(function(frame){
    if(frame.hands.length > 0)
    {
        var hand = frame.hands[0];
        var position = hand.palmPosition;
        var velocity = hand.palmVelocity;
        var direction = hand.direction;
    }});

    (1)属性

    1.    Hand.arm:Bone(),位置,大小和方向和哪只手

arm = hand.arm;

    arm.basis[0],arm.basis[1],arm.basis[2],代表x,y,z

    2.    Hand.confidence:number--范围[0..1],模型摸拟观测到的数据

var confidence = hand.confidence;
if(confidence > .7){
    //...
    }

    3.    Hand.direction:number[]--3个位置参数,从掌心向手指的方向。

var direction = hand.direction;
console.table(direction);

    4.    Hand.fingers[]:Pointable() 对象的数组,检测到的手指列表,没有手指为空

hand.fingers.forEach(function(finger){
    //...
    });

    5.    Hand.grabStrength:float--[0..1]之间的值,一个抓手的力量,一个开着的手的力量是零,下面的例子使用                

    grabstrength确定手打开或关闭:

function handStateFromHistory(hand, historySamples) {
    if(hand.grabStrength == 1) return "closed";
    else if (hand.grabStrength == 0) return "open";
    else {
        var sum = 0
        for(var s = 0; s < historySamples; s++){
            var oldHand = controller.frame(s).hand(hand.id)
            if(!oldHand.valid) break;
            sum += oldHand.grabStrength
        }
        var avg = sum/s;
        if(hand.grabStrength - avg < 0) return "opening";
        else if (hand.grabStrength > 0) return "closing";
    }
    return"not detected";}console.log("Hand is " + handStateFromHistory(hand, 10));

    6.    Hand.id:String,手指id,下面的例子在一个给定数目的帧中找到一个平均的手位置,通过查找该手对象。

function avgHandPosition(hand, historySamples) {
        var sum = Leap.vec3.create();
        Leap.vec3.copy(sum, hand.palmPosition);
        for(var s = 1; s < historySamples; s++){
            var oldHand = controller.frame(s).hand(hand.id)
            if(!oldHand.valid) break;
            Leap.vec3.add(sum, oldHand.palmPosition, sum);
        }
        Leap.vec3.scale(sum, sum, 1/s);
        return sum;}var average = avgHandPosition(hand, 30);console.table(average);

    7.    Hand.indexFinger:Finger(),这只手的食指。

var index = hand.indexFinger;

    8.    Hand.middleFinger:Finger(),这只手的中指

var middle = hand.middleFinger;

    9.    Hand.palmNormal:number[]--3个位置参数,正常向量的手掌(手是平坦的,这个向量将向下点)

Palm Vectors

var normal = hand.palmNormal;

    10.    Hand.palmPosition:number[]--3个位置参数,原点中心位置毫米。

var position = hand.palmPosition;

    11.    Hand.palmVelocity:number[],手掌位置的变化率。毫米/秒,

var speed = hand.palmVelocity;

    12.    Hand.palmWidth:number,手掌平均外宽(毫米),

handSize = hand.palmWidth;

    13.    Hand.pinchStrength:float--range [0..1],捏手的强度,下面的示例将拇指尖与其他手指,来确定哪个手指捏。

if(hand.pinchStrength > 0){
    var pinchingFinger = findPinchingFinger(hand);}function findPinchingFingerType(hand){
    var pincher;
    var closest = 500;
    for(var f = 1; f < 5; f++)
    {
        current = hand.fingers[f];
        distance = Leap.vec3.distance(hand.thumb.tipPosition, current.tipPosition);
        if(current != hand.thumb && distance < closest)
        {
            closest = distance;
            pincher = current; 
        }
    } 
    return pincher;}

    14.    Hand.pinky:Finger(),手的小指

var pinkyFinger = hand.pinky;

    15.    Hand.pointables[]:Pointable() 对象的数组,检测手指列表,没有与该手相关的手指被检测,该列表可以是空的

    下面的示例通过手指的名称标识每个指向:

var nameMap = ["thumb", "index", "middle", "ring", "pinky"];hand.pointables.forEach(function(pointable){
    if(pointable.tool) console.log("Tool");
    else console.log(nameMap[pointable.type]);});

    16.    Hand.ringFinger:Finger(),手的无名指

var thirdFinger = hand.ringFinger;

    17.    Hand.sphereCenter:number[],一个球体的中心与这只手的曲率。

var center = hand.sphereCenter;
console.log("Sphere Center: " + center[0] + ", " + center[1] + ", " + center[2] + ")");

    这个球被放置在手上,好像手拿着一个球似的。

Hand Ball

    18.    Hand.sphereRadius:number,手的曲率半径,以毫米为单位

var radius = hand.sphereRadius;
console.log("Sphere Radius: " + radius);

    19.    Hand.stabilizedPalmPosition:number[],稳定的手掌位置

    下面的例子计算了手掌位置和它的稳定的对应关系。

var stabilized = hand.stabilizedPalmPosition;
var delta = Leap.vec3.create();
Leap.vec3.subtract(delta, stabilized, hand.palmPosition);
console.log("Difference between palm and stabilized palm positions: ");
console.table(delta);

    20.    Hand.thumb:Finger(),手的大拇指

var thumb = hand.thumb;

    21.    Hand.timeVisible:number,手连续的可见的跳跃运动时间。及秒内

var timeVisible = hand.timeVisible;
if(timeVisible > .25){
    //... use hand
    }

    22.    Hand.tools[]:Pointable() 类型数组,检测到的工具的列表

    23.    Hand.type:string,识别左右手,

var type = hand.type;
if(type == "left"){
    console.log("Left hand.");
    } else {
    console.log("Right hand."
    )}

    24.    Hand.valid:boolean,是否是有效的手

    (3)方法:

    1.    Hand.finger(id):手指与指定的身份,使用此函数来检索利用前一帧得到的ID值代表一个手指,并返回一个对象

var finger = hand.finger(fingerID);

    一只手的跟踪丢失和恢复,检测数据也改变,也可以查看自己的手和手指的解剖类型:

var sum = Leap.vec3.create();var count = 0;for(var s = 0; s < 30; s++){
    if(!frame.valid || frame.hands.length == 0) break;
    frame.hands.forEach(function(hand){
        if(hand.type == "left"){
            indexTip = hand.indexFinger.tipPosition;
            Leap.vec3.add(sum, indexTip, sum);
            count++;
        }
    });}if(count > 0) Leap.vec3.scale(sum, sum, 1/count);console.table(sum);

    2.    Hand.pitch():弧度角,Z轴和矢量在y-z平面上的投影之间的夹角

var pitchRadians = hand.pitch();

    3.    Hand.roll():弧度的转角,辊轴和矢量在X-Y平面的投影之间的夹角

var rollRadians = hand.roll();

    4.    Hand.rotationAngle(sinceFrame[, axis]):在当前帧和指定帧之间,旋转轴的角度来自于这个手的方向的变化,以及    

    相关的手指:

var previousFrame = controller.frame(1);
var totalRotation = hand.rotationAngle(previousFrame);
var rotationAroundZAxis = hand.rotationAngle(previousFrame, [0,0,1]);
console.log("Rot: " + totalRotation + ", Z Rot:" + rotationAroundZAxis);

    5.    Hand.rotationAxis(sinceFrame):

var previousFrame = controller.frame(1);
var axis = hand.rotationAxis(previousFrame);
console.log("Axis of Rotation: (" + axis[0] + ", " + axis[1] + ", " + axis[2] + ")");

    6.    Hand.rotationMatrix(sinceFrame):变换矩阵表示从该手的方向的变化,和相关的手指

var previousFrame = controller.frame(1);
var matrix = hand.rotationMatrix(previousFrame);
console.log("Rotation Matrix:");
console.log("[" + matrix[0] + ", " + matrix[1] + ", " + matrix[2] + "]");
console.log("[" + matrix[3] + ", " + matrix[4] + ", " + matrix[5] + "]");
console.log("[" + matrix[6] + ", " + matrix[7] + ", " + matrix[8] + "]");

    7.    Hand.scaleFactor(sinceFrame):来自于当前帧和指定帧之间手部的比例因子。

var previousFrame = controller.frame(1);
var scale = hand.scaleFactor(previousFrame);
console.log("Hand scale: " + scale);

    8.    Hand.toString():一个包含一个简短的,人可读的描述手的对象的字符串

console.log(hand.toString());

    9.    Hand.translation(sinceFrame):当前帧与指定帧之间的位置变化,返回的平移矢量

var previousFrame = controller.frame(1);
var movement = hand.translation(previousFrame);
console.table(movement);

    10.    Hand.yaw():弧度偏航角。

var yawRadians = hand.yaw();

    11.    Hand.Invalid:无效的手对象

© 著作权归作者所有

共有 人打赏支持
请修改个人昵称
粉丝 6
博文 55
码字总数 7496
作品 0
合肥
程序员
Leap Motion API类库:Vector&Matrix

1.Vector 在leap.js中,数学矢量矩阵用的是glmatrix JavaScript库,在leap.js类库中包含glmatrix库,你无需再复制。去这里看吧: http://glmatrix.net/docs/2.2.0/ 在JavaScript API(矢量和...

储明城
2016/01/29
67
0
Leap 类与命名空间

1.Leap Motion所有类 Bone InteractionBox CircleGesture KeyTapGesture Controller Pointable Finger ScreenTapGesture Frame SwipeGesture Gesture Matrix math Hand Vector math 2.Leap ......

储明城
2016/01/27
40
0
Leap Motion API类库:Controller

1.Controller 控制器类是您的Leap Motion控制器的主要接口。 创建这个控制器类的实例,访问跟踪数据和配置信息的帧。帧数据可以在任何时候使用frame()轮询功能,调用frame() 或 frame(0) 以获...

储明城
2016/01/28
55
0
Leap Motion API类库:Pointable

Pointable 检测手指或工具的物理特性。 手指和工具是传统的Pointable对象,使用tool属性确定一个Pointable代表一个工具或是一根手指。 注意:Pointable的对象可以是无效的,这意味着他们不包...

储明城
2016/01/28
83
0
leap motion原理释疑

在engadget中国版上看到了leap motion的相关信息,该网站号称针对人们对leap motion的一些疑点其编辑亲自赶往了leap motion的旧金山leap motion体验了一把,并向Holz和Buckwald请教了leap mo...

龙鸟
2013/03/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring详解

Spring详解(一)------概述 目录 1、什么是 Spring ? 2、Spring 起源 3、Spring 特点 4、Spring 框架结构 5、Spring 框架特征 6、Spring 优点   本系列教程我们将对 Spring 进行详解的介绍...

DemonsI
18分钟前
0
0
CentOS7系统Nginx安装

1、下载nginx,官方网站https://nginx.org wget https://nginx.org/download/nginx-1.14.0.tar.gz 2、下载Nginx Sticky Module,官方网站https://bitbucket.org/nginx-goodies/nginx-sticky-......

m_lm
21分钟前
0
0
使用zTree树控件(二)

1:treeNode.checked用于判断是勾选还是取消勾选。(treeNode指的是节点) 2:treeObj.transformToArray(nodes)用于查询nodes节点下的所有子节点,json格式。(treeObj为数的id)...

uug
22分钟前
0
0
export, import 和 export default的区别

ES6的两个功能: export 和 import export 对外输出模块 import 引入(加载)进来一个模块 一、export => import 单个变量 export var name = "lishi" 在其他文件里引用 import {name} f...

Js_Mei
26分钟前
1
0
打造RecyclerView的n级列表

先上效果图: 1.该多级列表的优势: 支持无限级列表展开 基于一个recyclerView实现 可以自定义每一级item的样式,定制化更强 2.设计的思路 数据结构List<ItemBean>,ItemBean类中有变量List<...

WelliJohn
35分钟前
1
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部