2017-07-26 44 views
1

使用HoloToolkit資產和實施代碼中的InputManager預製件,用戶可以點擊並按住給定對象,然後左右移動他們的手(沿x平面)以沿Y軸或上下方向旋轉對象(沿y平面)旋轉X軸上的對象。Hololens導航使用輕按並保持手勢錯誤?

但似乎有一個錯誤。如果用戶注視離開對象,則旋轉立即停止,直到用戶注視返回到對象。這是預期的功能嗎?如果是這樣,那麼如何通過導航手勢保留當前正在改變的對象,並允許它繼續被操縱,直到用戶的手離開FOV或用戶釋放輕擊並保持手勢?

目標是利用輕敲並按住手勢,但不要求用戶注視在整個對象旋轉期間鎖定在對象上。對於小型或笨拙的物體來說,這是相當困難的。

實現代碼:

[Tooltip("Controls speed of rotation.")] 
public float RotationSensitivity = 2.0f; 

private float rotationFactorX, rotationFactorY; 

public void OnNavigationStarted(NavigationEventData eventData) 
{ 
    Debug.Log("Navigation started"); 
} 
public void OnNavigationUpdated(NavigationEventData eventData) 
{ 
    rotationFactorX = eventData.CumulativeDelta.x * RotationSensitivity; 

    rotationFactorY = eventData.CumulativeDelta.y * RotationSensitivity; 

    //control structure to prevent dual axis movement 
    if (System.Math.Abs(eventData.CumulativeDelta.x) > System.Math.Abs(eventData.CumulativeDelta.y)) 
    { 
     //rotate focusedObject along Y-axis 
     transform.Rotate(new Vector3(0, -1 * rotationFactorX, 0)); 
    } 
    else 
    { 
     //rotate focusedObject along X-axis 
     transform.Rotate(new Vector3(-1 * rotationFactorY, 0, 0)); 
    } 
} 
public void OnNavigationCompleted(NavigationEventData eventData) 
{ 
    Debug.Log("Navigation completed"); 
} 
public void OnNavigationCanceled(NavigationEventData eventData) 
{ 
    Debug.Log("Navigation canceled"); 
} 

回答

2

你需要調用這些方法:

NavigationRecognizer = new GestureRecognizer(); 
    NavigationRecognizer.SetRecognizableGestures(GestureSettings.Tap); 
    NavigationRecognizer.TappedEvent += NavigationRecognizer_TappedEvent; 
    ResetGestureRecognizers(); 

這是一個竊聽事件,但這樣做的另一個gesutres是簡單的增加對他們的事件回調在SetRecognizableGestures()呼叫上使用|或選擇器。例如

NavigationRecognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.NavigationX); 
+0

我很困惑。輕拍還註冊輕按並按住?您是使用OR(|)將水龍頭和X軸導航組合成一個嗎? – jtth

+0

@jtth'Tap'與'Hold'分開,如果您查看GestureSettings枚舉,您將看到所有可能的值。你甚至可以設置一個程序來識別它們(儘管我很確定'Navigation_','NavigationRails_'和'Manipultation'都是相互排斥的,因爲它們都依賴於相同的手勢,但是被解釋爲稍有不同。是的,在這種情況下,我使用按位或來組合兩種手勢類型(在這種情況下爲tap和nav-x)。它不會將手勢組合成單個事件,它會說「我對這些類型的事件感興趣...「 – Draco18s

+0

您仍然需要'NavigationRecognizer.NavigationEvent + = ...'來獲得回調。(X,Y和Z全部由相同事件處理) – Draco18s

2

Draco18s答案是安全的,但這種方法的工作原理,以及因爲 的輸入管理預製實現棧我們。

在導航開始,清除棧和推對象被「航海下」壓入堆棧,

InputManager.Instance.ClearModalInputStack(); InputManager.Instance.PushModalInputHandler(gameObject);

在導航完成或取消,彈出它堆棧。 InputManager.Instance.PopModalInputHandler();

將此添加到您自己的實現腳本中,無需調整InputManager上任何預先存在的腳本。