官方C++ SDK介绍地址:
https://developer.leapmotion.com/documentation/cpp/api/Leap.Hand.html#cppclass_leap_1_1_hand_1aa2c9cca797fde17bf7371451a297e608
本文是就着英文版官方说明给出了翻译以及自己的理解,Hand模块总共分为了两块,上文完成一半,下午把另一半发上来。
目录概览:
· Hand()
· arm() const
· basis() const
· confidence() const
· direction() const
· finger(int32_t id) const
· fingers() const
· frame() const
· grabAngle() const
· grabStrength() const
· id() const
· invalid()
· isLeft() const
· isRight() const
· isValid() const
· operator!=(const Hand &) const
· operator==(const Hand &) const
· palmNormal() const
· palmPosition() const
· palmVelocity() const
· palmWidth() const
详细解释:
class Leap::Hand
获取一个手的对象:
Leap::HandList hands = frame.hands();
Leap::Hand firstHand =hands[0];
备注:hand()出来的可能是无效对象,当检测不出手的时候会拟合出一个,故而可以用用手isvalid()功能来判定是否是有效的。
Since
1.0
Hand()
创造一个Hand object.//从Frame对象里获取有效Hand对象
Leap::HandleftmostHand = frame.hands().leftmost();
Since
1.0
Arm arm() const
返回定义的Arm类型的参数,如果看不到胳膊就根据人体解剖学估计出一个(估计是吹逼的,效果并没有那么好,233,实测性能并不好,但勉强可以用)
Leap::Handhand = frame.hands().frontmost();
Leap::Armarm = hand.arm();
Since
2.0.3
Matrix basis() const
以矩阵的形式返回hand的方向信息//左右手呈镜面关系
xAxis 小拇指的正方向
yAxis 手面向上的正方向
zAxis 手腕朝向的正方向
Leap::Matrixbasis = hand.basis();
Leap::VectorxBasis = basis.xBasis;
Leap::VectoryBasis = basis.yBasis;
Leap::VectorzBasis = basis.zBasis;
Since
2.0
float confidence() const
对一个手部姿态的确信程度(看来并不是无脑自信,哈哈哈)
float confidence= hand.confidence();
Since
2.0
Vector direction() const
返回手掌朝向的Vector,分为pitch,yaw和row。
float pitch = hand.direction().pitch();
float yaw = hand.direction().yaw();
float roll = hand.palmNormal().roll();
Since
1.0
Finger finger(int32_t id) const
从前一Frame里返回Finger类型的指定编号的手指对象,如果没有会返回一个invalid的Finger对象
Leap::Finger fingerOnHandByID = hand.finger(fingerID);
Since
1.0
FingerList fingers() const
返回这个hand里所有的Finger对象并储存在FingerList里。
备注:用 PointableList::extended() 可以去除列表里non-extended的finger对象
// hand is a Leap::Hand object
Leap::PointableListpointables= hand.pointables();// Both fingers and tools
Leap::FingerListfingers = hand.fingers();
Since
1.0
Frame frame() const
返回和Hand相关的Frame。如果不可获得就返回invalid类型的Frame对象
Leap::FrameframeForHand = hand.frame();
Since
1.0
float grabAngle() const
返回手掌抓握的紧张程度,数值在0-π之间,紧握为0,松开为π
//本质上其实就是算的四根手指的平均张开角度
Since
3.0
float grabStrength() const
落伍了落伍了!!废弃不用了。。。
用 grabAngle() 替代。
Since
2.0
int32_t id() const
和Hand对象绑定的ID,就算手消失了还是存在的
(然而它并没有Kinect那种消失再回来还能一定程度上匹配的功能,至少我测试的没有,甚至同一只手没超出范围还会跳变,摔墙!)
//下面代码用于发现未来一些frame里已知ID的手的甄别
Leap::HandknownHand = frame.hand(handID);
Since
1.0
bool isLeft() const
判断手是不是左手。。。
std::string handName = hand.isLeft()? "Left hand" : "Right hand";
Since
2.0
bool isRight() const
判断是不是右手
if(hand.isRight()){
// .. Do righthanded stuff
}
Since
2.0
bool isValid() const
判断手对象里的数据是不是有效的鲁棒的。
if (hand.isValid()){
//Process handdata...
}
Since
1.0
bool operator!=(const Hand &) const
比较两个Hand对象是不是同一Frame同一个手(估计是比较手的长短啊大小啊位置啊之类的)//黑人问号脸:我要这个何用???
thisHand != thatHand;
Since
1.0
bool operator==(const Hand &) const
和上面的类似
thisHand == thatHand;
Since
1.0
Vector palmNormal() const
指向手掌的Vector,搭配direction食用风味更佳
float pitch = hand.direction().pitch();
float yaw = hand.direction().yaw();
float roll = hand.palmNormal().roll();
Since
1.0
Vector palmPosition() const
返回手腕重心点在LeapMotion坐标系里毫米单位的坐标
Leap::VectorhandCenter = hand.palmPosition();
Since
1.0
Vector palmVelocity() const
返回手掌的移动速度,单位:millimeters/second.
Leap::VectorhandSpeed = hand.palmVelocity();
Since
1.0
float palmWidth() const
当手面平整时估计手掌的宽度。单位是毫米
float handWidth = hand.palmWidth();
Since
2.0
第一部分先到这里了,剩下的下午翻译完再发。
最后祝大家开发LeapMotion愉快~