Gesture類(Leap::Gesture)
這個類代表了識别的使用者的動作。Leap Motion控制器在它的視線内看到并識别的一些運動模式,都是使用者典型的手勢。比如,手從一邊到另一邊的移動表明是揮動的手勢,而手指向前戳則是點選螢幕的手勢。
當軟體識别一個手勢,會給其配置設定一個ID,并在那個幀手勢清單中加入一個Gesture對象。對于連續的手勢,也就是會在很多幀中出現,軟體會通過加入具有同樣ID的Gesture對象來更新手勢。
注意,識别每種類型的手勢,需要用Controller::enableGesture()來打開使能“開關”,否則将沒法識别。如下:
controller.enableGesture(Leap::Gesture::TYPE_CIRCLE);
controller.enableGesture(Leap::Gesture::TYPE_KEY_TAP);
controller.enableGesture(Leap::Gesture::TYPE_SCREEN_TAP);
controller.enableGesture(Leap::Gesture::TYPE_SWIPE);
值得一提的是,Gesture還有四個子類,定義了幾種被Leap Motion識别的指定的運動模式的屬性。如下:
CircleGesture表示一根手指畫圈的運動;
SwipeGesture表示手和擴充的手指的直線運動;
ScreenTapGesture表示一根手指向前點選的運動;
KeyTapGesture表示一根手指向下點選的運動。
其中畫圈和揮動的手勢是連續的,這些對象有一個開始、更新和停止的狀态。螢幕點選的手勢是個離散的手勢軟體隻能在每次點選時建立一個單獨的ScreenTapGesture對象,而且總是有一個停止的狀态。
要從Frame對象中得到有效的Gesture對象,可以通過Frame::gestures()來得到一個手勢的清單,可以通過Frame::gestures(const Frame&)來得到一個自某個指定幀開始的手勢的清單,可以通過Frame::gesture()來用前一幀得到的ID值在目前幀中找到一個手勢。
Gesture對象也可以是無效的。比如,當你通過Frame::gesture()用ID值得到一個手勢,在目前幀中并沒有帶有這個ID的手勢,則這個函數就會傳回一個無效的Gesture對象(而不是一個空的值)。需要經常在可能手勢無效的情況下檢測對象的有效性。
下面的keys可以用來結合Config類來配置手勢識别器:

enum Type: 表示手勢支援的類型。如下:
TYPE_INVALID==-1表示一個無效的類型;
TYPE_SWIPE==1表示手和擴充的手指的直線運動;
TYPE_CIRCLE==4表示手指的畫圈運動;
TYPE_SCREEN_TAP==5表示一根手指向前點選的運動;
TYPE_KEY_TAP==6表示一根手指向下點選的運動。
enum State: 表示可能的手勢的狀态。如下:
STATE_INVALID==-1表示一個無效的狀态;
STATE_START==1表示手勢正在開始,足夠被識别;
STATE_UPDATE==2表示這個手勢正在進行中(并不是所有的手勢都有這個過程);
STATE_STOP==3表示這個手勢已經完全結束。
int64_t duration(): 表示識别運動直到包含這個Gesture對象的幀的持續時間(微秒)。在序列中記錄第一個Gesture對象的持續時間會是個很小的正值,因為運動進行的必須足夠程度,使得軟體可以把它識别為一個有意的手勢。
float durationSeconds(): 表示持續時間(秒)。
用法:float seconds=gesture. durationSeconds();
Frame frame(): 表示包含這個Gesture執行個體的Frame對象。傳回的是父類Frame對象。
用法:Leap::Frame frameOfGesture=gesture.frame();
Gesture(): 構造一個無效的Gesture對象。沒有初始化的Geature對象被認為是無效的。從Frame對象中得到Gesture類的有效的執行個體,将會成為一個子類。
Gesture(const Gesture & rhs): 表示構造一個Gesture對象的一個新的複制。
用法:Leap::Gesture copy=Leap::Gesture(gesture);
HandList hands(): 代表與這個對象相關聯的的手的清單。如果沒有與這個手勢關聯的手,則該清單為空。
用法:Leap::HandList handsForGesture=gesture.hands();
int64_t id(): 代表手勢的ID。屬于同一個識别的運動的所有Gesture對象具有同樣的ID值。可以通過Frame::geature()利用這些ID值在連續幀中找到關聯這個對象的更新。
bool isValid(): 判斷這個Gesture執行個體是否代表一個有效的Gesture對象。如果這是一個有效的Gesture執行個體,傳回True。
bool operator!=(const Gesture &): 比較Gesture對象是否不相等。如果兩個對象都是有效的,在同一幀中有且僅有這兩個對象表示同樣的實體,則這兩個對象相等。
用法:thisGesture!=thatGesture;
bool operator==(const Gesture &): 比較Gesture對象是否相等。如果兩個對象都是有效的,在同一幀中有且僅有這兩個對象表示同樣的實體,則這兩個對象相等。
用法:thisGesture==thatGesture;
PointableList pointables(): 代表與這個手勢關聯的手指和工具的清單。如果沒有與這個手勢相關聯的Pointable對象,這個清單是空。
用法:Leap::PointableList pointableForGesture=gesture.pointable();
State state(): 表示手勢的狀态。識别的運動随着時間出現,有開始,中間和結束。這個屬性就記錄了在序列中這個Gesture對象的起伏。傳回一個在State枚舉中的一個成員。
std::string toString(): 一個包含簡略描述該Gesture對象的字元串。
Type type(): 表示這個手勢的類型。傳回的是Gesture::Type枚舉類型中手勢的類型。
用法:Leap::GestureList gestures = frame.gestures();
for (Leap::GestureList::const_iterator gl = gestures.begin(); gl != frame.gestures().end(); gl++)
{
switch ((*gl).type()) {
case Leap::Gesture::TYPE_CIRCLE:
//Handle circle gestures
break;
case Leap::Gesture::TYPE_KEY_TAP:
//Handle key tap gestures
break;
case Leap::Gesture::TYPE_SCREEN_TAP:
//Handle screen tap gestures
break;
case Leap::Gesture::TYPE_SWIPE:
//Handle swipe gestures
break;
default:
//Handle unrecognized gestures
break;
}
}
const Gesture & invalid(): 傳回一個無效Gesture對象。還是用來判斷對象是否有效。
GestureList類(Leap:: GestureList)
這個類代表了Gesture對象的清單。通過調用Frame:: gestures()可以得到一個GestureList對象。
GestureList & append(const GestureList & other): 表示把指定的一個GestureList的成員添加到這個GestureList對象中。參數other表示一個GestureList對象,其中包含Gesture對象,将要添加到這個GestureList對象末端。
const_iterator begin(): 表示C++的疊代器,設定在這個GestureList對象的開始。
用法:Leap:: GestureList tools = frame. gestures();
for (Leap:: GestureList::const_iterator gl = gestures.begin(); gl != gestures.end(); gl++)
std::cout << *gl << std::endl;
int count(): 表示這個清單中手勢的數目。
const_iterator end(): 表示C++的疊代器,設定在這個GestureList對象的結束。
用法:Leap:: GestureList tools = frame. gestures();
for (Leap:: GestureList::const_iterator gl = gestures.begin(); gl != gestures.end(); gl++)
std::cout << *gl << std::endl;
GestureList(): 表示構造一個沒有實體的空清單。
bool isEmpty(): 判斷這個清單是否為空。如果沒有成員,傳回True。
Gesture operator[](int index): 表示對清單中一個成員位置的通路。傳回的是指定索引下的Gesture對象。
用法:Leap::GestureList allGestures = frame. gestures();
Leap::Gesture firstGesture = allGestures[0];
譯自:https://developer.leapmotion.com/documentation/cpp/api/Leap.Gesture.html
https://developer.leapmotion.com/documentation/cpp/api/Leap.GestureList.html