使用点击并按住手势错误的Hololens导航?

时间:2017-07-26 22:02:14

标签: c# unity3d gesture hololens

使用来自HoloToolkit资产和实现代码的InputManager预制件,用户可以点击并按住给定对象,然后向左或向右移动他们的手(沿着x平面)以沿着Y旋转对象轴或上下(沿y平面)在X轴上旋转物体。

然而,似乎有一个错误。如果用户注视离开对象,则旋转立即停止,直到用户注视返回对象。这是预期的功能吗?如果是这样,如何通过导航手势保留当前对象被更改并允许它继续被操纵,直到用户手离开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 个答案:

答案 0 :(得分:2)

您需要调用这些方法:

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

这适用于抽头事件,但是在执行其他gesutres很简单,因为为|调用添加事件回调并使用SetRecognizableGestures() OR选择器。 e.g。

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

答案 1 :(得分:2)

Draco18s的答案更安全,但这个解决方案也有效 InputManager预制件为我们实现了一个堆栈。

在导航开始时,清除堆栈并按下正在导航的对象'在堆栈上,

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

在导航完成或取消后,将其从堆栈中弹出。 InputManager.Instance.PopModalInputHandler();

将此添加到您自己的实现脚本中,无需在InputManager上调整任何预先存在的脚本。