Hello World

Hello World

這個文檔介紹瞭如何與Leap Motion控制器連接,如何訪問基本的跟蹤數據。

How the Leap Motion Controller Works

Leap Motion控制器包括硬件和軟件部分。硬件主要包括一對立體紅外攝像機和光照LED。當設備處於其標準的方位時,攝像機的傳感器朝上。接下來的說明展示了從Leap Motion傳感器的視角中用戶的手是怎樣的:
Leap Motion的軟件接收傳感器數據,然後分析這個特定爲手、手指、胳膊和工具的數據(將來會加入其他類型的物體來用於跟蹤,但這是當前的跟蹤實體)。軟件包括了一個人手的內部模型,把這個模型與傳感器數據相比較,確定最佳匹配。傳感器數據是逐幀分析的,然後把每一幀的數據送給Leap Motion啓用的應用程序。你的應用程序接收的Frame對象包含了所有跟蹤實體已知的位置、速率和身份,諸如手、手指和工具,持續多幀的手勢和動作的構造在每幀中更新。

Set Up the Files

詳見“連接控制器”。

Get Connected

接下來一步就是在程序中加入一個Controller對象,作爲我們與Leap Motion服務的連接。
int main(int argc, char** argv) {
Controller controller;
// Keep this process running until Enter is pressed
std::cout << “Press Enter to quit…” << std::endl;
std::cin.get();
return 0;
}

To Listen or not to Listen?

你可以把一個Listener對象加入到Controller,這提供了一個基於事件的機制來對重要的Controller狀態轉變做出迴應這是本教程中使用的方法,但並不總是最好的方法。
Listener的問題:Listener對象用獨立的進程來調用你爲每個事件實現的代碼。因此,用Listener機制會在你的程序中引入線程的複雜性。所以,你的責任在於,確保你在Listener子類中實現的代碼可以以一種線程安全的方式訪問程序的其它部分。比如,你只能從主線程中訪問與GUI控件相關的變量。這也有額外的與線程的創建和清理相關的開銷。
避免Listeners:當你的程序方便的時候,你可以通過輪詢Controller的幀(或者其他狀態)來避免使用Listener對象。很多程序已經有一個事件循環或動畫循環來推動用戶輸入和動畫。如果是這樣,每個循環可以得到一次跟蹤數據,這通常是與你用數據一樣快。
API中的Listener類定義了一個函數的標籤,當一個Controller事件發生時會調用這個函數。通過創建一個Listener的子類可以創建一個偵聽器,來實現你感興趣的事件的回調函數。如果一切正常,運行例程可以在終端窗口裏看到字符串“Connected”。

On Connect

當你的Controller對象成功與Leap Motion光驅連接,而且硬件插上電源,這個對象會改變idConnected()屬性爲true然後調用Listener.onConnect()回調函數。
當控制器相連,可以用Controller.enableGesture()和Controller.setPolicy()函數設置控制器屬性。比如,如果你要啓用揮動的手勢,如下:
void SampleL*istener::onConnect(const Controller& controller) {
std::cout << “Connected” << std::endl;
controller.enableGesture(Gest*ure::TYPE_SWIPE);
}

On Frame

Leap Motion系統中所有的跟蹤數據通過Frame對象來到達,可以通過Controller.frame()函數來得到控制器中的Frame對象。當新一幀數據可用時,調用Listener子類中的onFrame()回調函數。當你不用偵聽器,可以與你處理的上一幀的id()值來看這是否爲新的一幀。通過設置frame()的歷史參數可以得到比當前幀更早的幀。因此,即使在慢於設備幀率的情況下輪詢,你依然可以處理每一幀。

譯自:https://developer.leapmotion.com/documentation/cpp/devguide/Sample_Tutorial.html

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