天天看点

Controller类(Leap:: Controller)

Controller类(Leap:: Controller)

Controller类是与Leap Motion主要的接口为了和Leap Motion设备连接,就需要创建一个Controller对象,这个对象会自动建立与Leap Motion服务(Windows下)或守护进程(OS或Linux下)的连接,之后后者以Frame对象的形式把跟踪数据传递到你的应用程序中。

创建一个Controller类的实例,可以访问跟踪数据和配置信息的帧。可以在任何时候通过Controller::frame()来轮询数据,调用frame()或frame(0)来得到最近的一帧。把历史参数设置为正整数可以访问以前的帧,在帧历史中可以储存60帧。

轮询对于已经有一个内在的更新循环的应用程序来说是一个合适的策略,比如游戏。也可以在控制器中加入Leap::Listener子类的实例来操控发生的事件。当连接发生变化,比如应用程序得到和丢失OS的输入焦点的时候,或者当跟踪数据的新一帧可用的时候,Controller会根据初始化和退出来把事件分派到listener中。当这些事件发生的时候,Controller对象会调用在Listener子类中定义的合适的回调函数。

当Leap::Listener子类的实例被加到Controller对象中时,在侦听器准备好可以用的时候调用Listener::onInit()函数。当控制器与Leap Motion软件连接好,调用Listener::onConnect()函数,这个时候你的应用程序开始收集帧数据。当新的一帧可用,控制器调用Listener::onFrame()函数。如果因为任何原因控制器与Leap Motion软件失去连接,调用Listener::onDisconnect()函数。如果侦听器从控制器中拿走或者控制器被破坏,调用Listener::onExit()函数。这个时候,除非侦听器再次加入另一个控制器,否则不再接收帧数据。

enum PolicyFlag: 表示所支持的控制器策略。

POLICY_DEFAULT==0: 表示默认的策略;

POLICY_BACKGROUND_FRAMES=(1<<0): 请求当这个不是用于用户输入的前台程序时,你的应用程序接收帧。后台帧策略决定一个应用程序是否接收帧数据。默认的,Leap Motion软件只把跟踪数据送给前台应用程序,只有需要这个功能的应用才应该请求后台帧策略。

POLICY_IMAGES=(1<<1): 请求你的应用程序从设备相机中接收图片。图片策略决定一个应用程序是否从Leap Motion传感器中接收图片数据。这个数据默认是不会送的。只有用到图片数据的应用程序才应该请求这个策略。

POLICY_OPOTIMIZE_HMD=(1<<2): 请求优化头盔式跟踪。优化的HMD(头戴式设备)策略优化了Leap Motion硬件与HMD连接的跟踪情景。这个策略不适用于无法固定在HMD上的设备,比如说嵌入在笔记本电脑或键盘中的Leap Motion控制器。

bool addListener(Listener & listener): 在这个Controller对象里加入一个listener。Controller会把Leap Motion的事件分配到每个相关联的listener中,调用listener回调函数的顺序是任意的。可以通过Controller::removeListener()函数移除。这个函数是用来判断是否成功把这个listener加入到listener的列表中。参数listener是Leap::Listener的子类,用来执行你想要在应用程序中控制的事件的回调函数。

bool removeListener(Listener & listener): 在这个Controller对象里移除一个listener。

如果listener的生命周期短于它所侦听的控制器则必须删除。

PolicyFlag policyFlags(): 这个函数已经弃用了,使用isPolicySet()函数代替。

void setPolicyFlags(PolicyFlag flags): 这个函数也弃用了,用setPolicy()和clearPolicy()。

void setPolicy(PolicyFlag policy): 要求设置策略。改变策略的请求会受到用户批准,而且可以在任何时候被用户修改。每次一个应用程序执行的时候,必须设置期望的策略标志位。

用法:controller.setPolicy(Leap::Controller::POLICY_BACKGROUND_FRAMES);

void clearPolicy(PolicyFlag policy): 要求清理策略。因为它们是受到用户批准或者系统兼容性检查的,所以策略改变是异步完成的,但可能不会成功完成。在一个合适的间隔之后调用Controller::isPolicySet()来检测是否这个改变被接受。参数policy是表明策略要求的值。

用法:controller.clearPolicy(Leap::Controller::POLICY_BACKGROUND_FRAMES);

controller.clearPolicy(Leap::Controller::POLICY_OPTIMIZE_HMD);

controller.clearPolicy(Leap::Controller::POLICY_IMAGES);

bool isPolicySet(PolicyFlag policy): 得到指定策略的活跃设置。设置策略标志位是异步的,所以在调用setPolicyFlags函数后改变不会立即有效。此外,一个策略的请求可以被用户拒绝。所以要在应用程序启动的时候设置所需要的策略标志位在一个合适的间隔之后检查这个策略改变要求是成功的。如果这个Controller对象没和软件连接,则返回所选策略的默认状态。

用法:bool isImagePolicyActive = controller.isPolicySet(Leap::Controller::POLICY_

IMAGES);

Config config(): 返回一个Config对象,用来查询配置信息。

用法:controller.config().setFloat(“Gesture.Circle.MinRadius”, 15);

controller.config().setFloat(“Gesture.Circle.MinArc”, 1.7);

bool saved = controller.config().save();

Controller(): 构造一个Controller对象。当创建一个Controller对象,可以选择引用Leap::Listener子类的一个实例来传递。

Controller(Listener & listener): 构造一个Controller对象。当创建一个Controller对象,可以选择引用Leap::Listener子类的一个实例来传递。

用法:SampleListener listenerSubclass;

Controller leapController = Controller(listenerSubclass);

DeviceList devices(): 表示当前连接了的和识别了的Leap Motion控制器设备的列表。列表中的描述了诸多信息的Device对象。一般地,在一个时刻Leap Motion的Controller只允许一个活跃的设备,然而在列表中可能会有很多个设备连接着。所有的设备首先保证被列进列表,但是顺序则无法确定。

void enableGesture(Gesture::Type type,bool enable=true): 表示启用或禁用对指定手势类型的报告。默认的所有的手势类型都被禁用,此时禁用类型的手势不能被报告,也不会出现在帧的手势列表中。作为一种性能的优化,只能启用对运动类型的识别。参数type是启用或禁用的手势的类型,必须是Gesture::Type枚举类型中的成员;enable当启用指定类型的手势则为True,禁用则是false。

用法:controller.enableGesture(Leap::Gesture::TYPE_CIRCLE);

Frame frame(int history=0): 返回Leap Motion软件跟踪数据的一帧。使用可选的历史参数来指定要检索的帧。调用frame()或frame(0)来访问最近的帧;调用frame(1)访问之前的帧,以此类推。如果你用了一个大于所存储帧数目的一个历史值,则返回一个无效帧。

用法:if (controller.isConnected()) //controller is a Controller object

{

Leap::Frame frame = controller.frame(); //The latest frame

Leap::Frame previous = controller.frame(1); //The previous frame

}

bool hasFocus(): 报告这个应用程序是否聚焦。默认地,只有当你的应用程序使操作系统输入聚焦,才能从Leap Motion控制器中接收数据。为了是应用程序在后台中接收数据,背景帧策略标志位一定要设置。

ImageList images(): 表示从Leap Motion相机中得到的最近的图片集。根据时序和当前处理的帧速率,由这个函数得到的图片会比从当前帧得到的图片更加新。

用法:Leap::ImageList images = controller.images();

bool isConnected(): 报告这个Controller对象是否和Leap Motion连接,硬件是否插上电源。当你第一次创建一个Controller对象,这个函数是返回false。当控制器完成初始化,与软件,硬件插上电源,该函数返回true。在执行其他一些操作之前,如果需要等待你的应用程序与软件相连接,可以用一个Listener实例控制onConnect事件或者轮询isConnected()函数。

bool isGestureEnabled(Gesture::Type type): 报告是否启用了指定的手势类型。

bool isServiceConnected(): 报告是否你的应用程序与Leap Motion连接。即使Leap Motion硬件不可用,这个值也可以是true。

int64_t now(): 返回尽可能靠近当前时刻的一个时间标记,单位是微秒。

TrackedQuad trackedQuad(): 这个类仅仅是内部使用,返回画面中检测到的Quad的信息。

译自:https://developer.leapmotion.com/documentation/cpp/api/Leap.Controller.html

继续阅读