2017-07-26 1 views
1

Mit dem InputManager prefab des HoloToolkit Asset- und Implementierungscodes kann der Benutzer ein bestimmtes Objekt antippen und halten und dann seine Hand nach links oder rechts (entlang der x-Ebene) bewegen, um das Objekt entlang der Y-Achse oder nach oben und unten zu drehen (entlang der y-Ebene), um das Objekt auf der X-Achse zu drehen.Hololens Navigation mit Tippen und halten Gesten Bug?

Allerdings scheint es einen Fehler zu geben. Wenn der Blick des Benutzers auf das Objekt fällt, stoppt die Drehung sofort, bis der Blick des Benutzers auf das Objekt zurückkehrt. Ist das die beabsichtigte Funktionalität? Wenn ja, wie erhält man das aktuelle Objekt, das über die Navigationsgeste geändert wird, und lässt es so lange weiter manipuliert werden, bis die Benutzerhand das FOV verlässt oder der Benutzer die Tipp- und Halte-Geste freigibt?

Ziel ist es, die Geste des Antippens und Haltens zu verwenden, aber nicht, dass der Blick des Benutzers auf das Objekt gerichtet wird, während er sie dreht. Dies ist ziemlich schwierig mit kleinen oder unbeholfen geformten Objekten.

Implementierungscode:

[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"); 
} 

Antwort

2

Sie müssen diese Methoden aufrufen:

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

Diese für eine angezapfte Ereignis ist, aber die anderen gesutres ist wie das Hinzufügen der Ereignisrückruf für sie einfach zu tun und Verwenden Sie einen | ODER-Schalter auf dem SetRecognizableGestures() Aufruf. z.B.

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

Ich bin verwirrt. Ist Tippen auch registrieren tippen und halten? Verwenden Sie das ODER (|), um das Tippen und Halten und die X-Achsen-Navigation in einem zu kombinieren? – jtth

+0

@jtth 'Tap' ist getrennt von' Hold', wenn Sie sich die GesureSettings enum anschauen, sehen Sie alle möglichen Werte. Sie können sogar ein Programm einrichten, um alle zu erkennen (obwohl ich mir ziemlich sicher bin, dass "Navigation_", "NavigationRails_" und "Manipulation" sich gegenseitig ausschließen, weil sie alle auf die gleiche Geste angewiesen sind, aber etwas anders interpretiert werden Ja, in diesem Fall verwende ich bitweises ODER, um zwei Gesten zu kombinieren (in diesem Fall tap und nav-x). Es kombiniert die Gesten nicht zu einem einzigen Ereignis, sondern sagt: "Ich interessiere mich für Ereignisse dieser Art ... " – Draco18s

+0

Sie benötigen noch" NavigationRecognizer.NavigationEvent + = ... ', um einen Rückruf zu erhalten. (X, Y und Z werden alle von demselben Ereignis behandelt) – Draco18s

2

Draco18s Antwort ist sicherer, aber diese Lösung funktioniert auch, weil die Inputmanager Fertig einen Stapel für uns implementiert.

Navigation gestartet, um den Stapel löschen, und drücken Sie das Objekt auf den Stapel ‚Navigierte‘ wird,

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

Navigation beendet oder abgebrochen, es Pop der Stapel ab. InputManager.Instance.PopModalInputHandler();

Fügen Sie dies Ihrem eigenen Implementierungsscript hinzu, ohne dass bereits vorhandene Skripts im InputManager angepasst werden müssen.

Verwandte Themen