Pointable类(Leap::Pointable)
这个类记录被检测到的手指或者工具这些有端点的物体的物理特征。通过Pointable::isFinger()函数来判断Pointable对象是否代表手指,通过Pointable::isTool()函数来判断Pointable对象是否代表工具。当一个检测到的实体比典型的手指更细、更直、更长的时候,Leap Motion软件会把其判断为工具。
为了提供接触仿真,Leap Motion软件关联了一个不固定的接触平台来适应用户手指的移动和手势。该设备把平台上有目的的移动转化为潜在的接触点,通过touchZone和touchDistance两个值来反映接触的状态。
Pointable对象也可以是无效的,也就是说它有可能没有包含有效的跟踪数据,并不关联一个实体,从Pointable构造函数创建的Pointable对象也是无效的,可以通过函数Pointable::isValid()函数来判定有效性。
enum Zone:通过定义一些值来反映Pointable对象关于接触平台的状态。
ZONE_NONE=0表示该对象距离平台很远。
ZONE_HOVERING=1表示该对象很近,但并不是接触。
ZONE_TOUCHING=2表示该对象已经穿透了平台。
Vector direction():表示这个手指或工具指向的方向,返回一个向量,如下图。
用法:Leap::Vector pointingToward=pointable.direction();
Frame frame(): 表示与这个对象关联的帧,返回相关联的Frame对象(可能是无效的Frame对象)。
用法:Leap::Frame frameOfThisPointableObject=pointable.frame();
Hand hand(): 表示与这个对象关联的手对象。
用法:Leap::Hand attachedHand=pointable.hand();
int32_t id(): 表示这个Pointable对象分配到的独有的ID。当跟踪的手指或工具保持可见的话,则在连续帧中这个值保持不变。如果跟踪丢了(比如,一根手指被另一根手指遮挡,或者消失在Leap Motion的视线内),那在将来的帧中如果该软件检测到这个实体,则会分配一个新的ID。通过这个ID值和Frame::pointable()函数在将来的帧中找到这个Pointabe对象。ID值应该是从1到100的。
用法:int32_t theID=pointable.id();
bool isExtended(): 判断这个Pointable对象是否可以姿势扩展。如果一个手指可以直接从手扩展如同指向一样,则认为该手指是可以扩展的。如果是弯曲,向手指蜷缩,则认为是不可扩展的。工具总是可以扩展的。如果可以扩展,则返回True。
用法: int extendedFingers = 0;
for (int f = 0; f < hand.fingers().count(); f++)
{
Leap::Finger finger = hand.fingers()[f];
if (finger.isExtended()) extendedFingers++;
}
bool isFinger(): 判断是否要把这个Pointable对象归为手指一类。如果是,返回True。
说明:if (pointable.inTool())
Leap::Tool tool=Leap::Tool(pointable);
else
Leap::Finger finger=Leap::Finger(pointable);
bool isTool(): 判断是否要把这个Pointable对象归为工具一类。如果是,返回True。
说明:if (pointable.inTool())
Leap::Tool tool=Leap::Tool(pointable);
else
Leap::Finger finger=Leap::Finger(pointable);
bool isValid(): 判断这是否是个有效的Pointable对象。如果这个对象包含有效的跟踪数据,则返回True。
float length(): 表示手指或工具估计的长度(毫米)。
float width(): 表示手指或工具估计的宽度(毫米)。
用法:float apparentlength=pointable.length();
bool operator!=(const Pointable &): 比较Pointable对象是否不相等。如果两个对象都是有效的,在同一帧中有且仅有这两个对象表示同样的实体,则这两个对象相等。
用法:thisPointable!=thatPointable;
bool operator==(const Pointable &): 比较Pointable对象是否相等。如果两个对象都是有效的,在同一帧中有且仅有这两个对象表示同样的实体,则这两个对象相等。
用法:thisPointable==thatPointable;
Pointable(): 构造一个Pointable对象。一个未初始化的对象被认为是无效的,从一个Frame或Hand对象中得到有效的对象。
说明:Leap::Pointable pointable=frame.pointable().frontmost();
Vector stabilizedTipPosition(): 表示这个对象稳定的尖端位置。这个位置会落后于尖端位置一个不等的量,主要依靠移动的速率。返回的是这个对象修正的尖端位置,其中会有一些额外的平滑和稳定。
用法:Leap::Vector stabilizedPosition=pointable. stabilizedTipPosition();
float timeVisible(): 表示这个对象在Leap Motion控制器中保持可视化的时间(秒)。
用法:float lifetime=pointable.timeVisible();
Vector tipPosition(): 在Leap Motion坐标系下的尖端位置。返回一个包含尖端位置坐标的向量。
用法:Leap::Vector currentPosition=pointable. tipPosition();
Vector tipVelocity(): 在Leap Motion坐标系下的尖端速率变化(毫米/秒)。返回一个包含尖端速率坐标的向量。
用法:Leap::Vector currentPosition=pointable. tipPosition();
std::string toString(): 一个包含简略描述该对象的字符串。
float touchDistance(): 表示一个与这个Pointable对象和接触平台之间距离成比例的值。这个接触距离是一个在范围-1到1的值,值1表示这个对象是在“盘旋”区域很远的边缘,值0表示这个对象正要进入这个接触区域,值-1表示这个对象在接触区域内,而之间的值则是和到平台的距离成比例。因此,这个值是0.5表示这个对象一般进入了“盘旋”区域。如下图可以很好理解。
Zone touchZone(): 表示这个对象当前接触的区域。Leap Motion软件是基于一个自适应于用户手指移动和手势的不固定的接触平台来计算接触区域。当这个对象移动靠近自适应的接触区域,则进入了“盘旋”区域;如果达到或通过这个区域,则进入了接触区域。
const Pointable & invalid(): 返回一个无效的Pointable对象。还是用来判断对象是否有效。
译自:https://developer.leapmotion.com/documentation/cpp/api/Leap.Pointable.html