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个位置参数,正常向量的手掌(手是平坦的,这个向量将向下点)
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] + ")");
这个球被放置在手上,好像手拿着一个球似的。
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:无效的手对象