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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章