Leap Motion 探究 【第四篇】

       這一章說說Coordinate,座標系。

       有朋友要問了,Leap不是本來就有座標定義嗎?對,這裏附加的Coordinate是爲了更方便的定義實體範圍,比如這個官方例子:


       紅色是Leap硬件能夠採集的空間大小,如果我們要讓球不能超越一個豎直的界線,我們通常會在程序中設定,超越邊界時座標值保持邊界極限值。而Leap給我們提供了一個更加底層一些的做法,自定義座標系大小,將2D或3D空間自我量化。


       倒金字塔是Leap硬件可採集的範圍,紅色是我們定義出的一個Box,超出這個範圍,我們就不要數據了。實例化這個Box即新建一個InteractionBox。這是官方給出的2D平面的座標量化實例:

int appWidth = 800;
int appHeight = 600;

InteractionBox iBox = leap.Frame().InteractionBox;
Pointable pointable = leap.Frame().Pointables.Frontmost;

Leap.Vector leapPoint = pointable.StabilizedTipPosition;
Leap.Vector normalizedPoint = iBox.NormalizePoint(leapPoint, false);

float appX = normalizedPoint.x * appWidth;
float appY = (1 - normalizedPoint.y) * appHeight;
//The z-coordinate is not used

       程序指定一個長度800,高度600的垂直剖面。不要疑惑爲啥Y軸是(1-y)*Height,因爲官方給的例子就是反轉的。官方給了一個tip,記得用hand.stabilizedpalmposition或Pointable.stabilizedTipPosition來穩定操作,能有效的過濾掉一些抖動。具體使用,可以借鑑官方的例子:

Leap.Vector differentialNormalizer(Leap.Vector leapPoint,
                           InteractionBox iBox,
                                   bool isLeft,
                                   bool clamp)
{
    Leap.Vector normalized = iBox.NormalizePoint(leapPoint, false);
    float offset = isLeft ? 0.25f : -0.25f;
    normalized.x += offset;

    //clamp after offsetting
    normalized.x = (clamp && normalized.x < 0) ? 0 : normalized.x;
    normalized.x = (clamp && normalized.x > 1) ? 1 : normalized.x;
    normalized.y = (clamp && normalized.y < 0) ? 0 : normalized.y;
    normalized.y = (clamp && normalized.y > 1) ? 1 : normalized.y;

    return normalized;
}
      由於定義了座標系,我們可以調整靈敏度,但通過座標放大的Scale,靈敏度是線性變化的,這點在大部分情況下適用。官方的例子也給出了:

float appWidth = 800;
float appHeight = 600;

InteractionBox iBox = leap.Frame().InteractionBox;
Pointable pointable = leap.Frame().Pointables.Frontmost;

Leap.Vector leapPoint = pointable.StabilizedTipPosition;
Leap.Vector normalizedPoint = iBox.NormalizePoint(leapPoint, false);

normalizedPoint *= 1.5f; //scale
normalizedPoint -= new Leap.Vector(.25f, .25f, .25f); // re-center

float appX = normalizedPoint.x * appWidth;
float appY = (1 - normalizedPoint.y) * appHeight;
//The z-coordinate is not used

      定義座標這個東西如果不是特別要求,意義不是特別大,但是VR中,空間的概念應該是穩定,精確的,這時候Coordinate應該是一個重頭戲,現在先摸一遍所有的API,等實際使用中發現問題再好好試。具體例子還是以SDK爲準,我之前做的模擬飛行例子已經加上了座標檢測,油門量是通過Z軸調整的,可以跳轉至優酷看看,點我點我點我


        另外說一下,昨天沒有解決的問題,就是Finger和Gesture對應。好好的看了下SDK,由於Gesture等級是低於Hand的,所以直接在Gesture中找Finger或者Finger中找Gesture是沒有可能的,只能想辦法去匹配座標,今天大概試了一下,有一些小問題,日後解決了直接傳代碼。

        這周團隊要交付個小項目,估計沒時間更新了,看看能不能抽時間寫個Leap控制鼠標的程序試試看。

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