Hololens開發筆記之Gesture手勢識別(基本介紹)


手勢識別是HoloLens交互的重要輸入方法之一。HoloLens提供了底層API和高層API,可以滿足不同的手勢定制需求。底層API能夠獲取手的位置和速度信息,高層API則借助手勢識別器來識別預設的手勢(包括,單擊、雙擊、長按、平移等等)。

 

手勢輸入 Gesture Input


本部分為高級API使用,通過輸入源來識別手勢。每個手勢對應一個SourceKind輸入源,大部分手勢事件都是系統預設的事件,有些事件會提供額外的上下文信息。

只需要很少的步驟就能使用GestureRecognizer集成手勢識別:

  1. 創建GestureRecognizer實例
  2. 注冊指定的手勢類型
  3. 訂閱手勢事件
  4. 開始手勢識別
private GestureRecognizer recognizer;

    // Use this for initialization
    void Start()
    {
        // 創建GestureRecognizer實例  
        recognizer = new GestureRecognizer();
       //  注冊指定的手勢類型
        recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);
       //  訂閱手勢事件 
        recognizer.HoldStartedEvent += Recognizer_HoldStartedEvent;
        recognizer.TappedEvent += Recognizer_TappedEvent;
        //開始手勢識別
        recognizer.StartCapturingGestures();
    }

    private void Recognizer_TappedEvent(InteractionSourceKind source, int tapCount, Ray headRay)
    {
        Debug.Log("Tap");
    }

    private void Recognizer_HoldStartedEvent(InteractionSourceKind source, Ray headRay)
    {
        Debug.Log("hold");
    }

    // Update is called once per frame
    void Update()
    {

    }

    void OnDestory()
    {
        recognizer.TappedEvent -= Recognizer_TappedEvent;
        recognizer.HoldStartedEvent -= Recognizer_HoldStartedEvent;

    }

停止手勢識別

recognizer.StopCapturingGestures();

 

底層API Interaction Input


 

底層API運行獲得輸入來源的更多詳細信息,例如它在世界中的位置和速度。

 

如何處理底層交互事件

 

使用底層交互是很容易的:

  1. 注冊InteractionManager事件
  2. 處理事件

停止它也很容易:

  1. 取消注冊事件

 

注冊底層交互事件

 

對於每種你需要的底層事件,你都需要去注冊它

InteractionManager.SourcePressed += InteractionManager_SourcePressed;

處理底層交互事件

 

一旦注冊了底層交互事件,在事件發生時你就可以得到回調。你可以使用獲取到的時間信息來處理應用行為。

 

void InteractionManager_SourcePressed(InteractionSourceState state)
{
    // state變量里包含以下信息:
       // 當前凝視射線信息
       // 來源是否被點擊
       // 位置、速度之類的屬性
       // 來源id和來源類型 (hand, voice, controller或其他)
}

如何停止交互事件

 

當你不再想要關注一些事件后,只需要取消時間注冊即可。

InteractionManager.SourcePressed -= InteractionManager_SourcePressed;

輸入源變化事件

 

這些事件描述了輸入源的當前狀態:

  • detected(即將激活)
  • lost(即將取消激活)
  • updates(移動或者一些狀態在變化)
  • is pressed(點擊、按鈕按下或者語音選中)
  • is released(點擊結束,按鈕松開,語音選中結束)

 

輸入源狀態

 

每個事件都會有一個InteractionSourceState參數,這個參數代表了實時輸入源狀態:

  • 是否是點擊狀態
  • InteractionSourceProperties包含了輸入源位置信息 InteractionSourceLocation,能夠獲得當前輸入源位置和速度信息
  • 凝視射線信息,用於判斷事件發生時用戶是否在注視目標
  • 來源類型信息,包括hand、voice、controller或者其他類型

 

示例代碼

using UnityEngine.VR.WSA.Input;

void Start ()
{
    InteractionManager.SourceDetected += InteractionManager_SourceDetected;
    InteractionManager.SourceUpdated += InteractionManager_SourceUpdated;
    InteractionManager.SourceLost += InteractionManager_SourceLost;
    InteractionManager.SourcePressed += InteractionManager_SourcePressed;
    InteractionManager.SourceReleased += InteractionManager_SourceReleased;
}

void OnDestroy()
{
    InteractionManager.SourceDetected -= InteractionManager_SourceDetected;
    InteractionManager.SourceUpdated -= InteractionManager_SourceUpdated;
    InteractionManager.SourceLost -= InteractionManager_SourceLost;
    InteractionManager.SourcePressed -= InteractionManager_SourcePressed;
    InteractionManager.SourceReleased -= InteractionManager_SourceReleased;
}

void InteractionManager_SourceDetected(InteractionSourceState state)
{
    // 識別到來源
}

void InteractionManager_SourceLost(InteractionSourceState state)
{
    //丟失來源
}

void InteractionManager_SourceUpdated(InteractionSourceState state)
{
    //來源被更新
}

void InteractionManager_SourcePressed(InteractionSourceState state)
{
    //來源被按下
}

void InteractionManager_SourceReleased(InteractionSourceState state)
{
    // 來源被松開
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM