Hololens官方教程之HoloToolKit部分代码解释

1.Gaze Manager

  1. using HoloToolkit;  
  2. using UnityEngine;  
  3.   
  4. /// <summary>  
  5. /// GazeManager determines the location of the user's gaze, hit position and normals.  
  6. /// </summary>  
  7. public class GazeManager : Singleton<GazeManager>  
  8. {  
  9.     [Tooltip("Maximum gaze distance for calculating a hit.")]  
  10.     public float MaxGazeDistance = 5.0f;    //The maximum distance within which collides can be detected  
  11.   
  12.     [Tooltip("Select the layers raycast should target.")]  
  13.     public LayerMask RaycastLayerMask = Physics.DefaultRaycastLayers;  
  14.   
  15.     /// <summary>  
  16.     /// Physics.Raycast result is true if it hits a Hologram.  
  17.     /// </summary>  
  18.     public bool Hit { getprivate set; }  
  19.   
  20.     /// <summary>  
  21.     /// HitInfo property gives access  
  22.     /// to RaycastHit public members.  
  23.     /// </summary>  
  24.     public RaycastHit HitInfo { getprivate set; }  
  25.   
  26.     /// <summary>  
  27.     /// Position of the user's gaze.  
  28.     /// </summary>  
  29.     public Vector3 Position { getprivate set; }  
  30.   
  31.     /// <summary>  
  32.     /// RaycastHit Normal direction.  
  33.     /// </summary>  
  34.     public Vector3 Normal { getprivate set; }  
  35.   
  36.     private GazeStabilizer gazeStabilizer;  
  37.     private Vector3 gazeOrigin;  
  38.     private Vector3 gazeDirection;  
  39.   
  40.     void Awake()  
  41.     {  
  42.         gazeStabilizer = GetComponent<GazeStabilizer>();  
  43.     }  
  44.   
  45.     private void Update()  
  46.     {  
  47.         gazeOrigin = Camera.main.transform.position;  
  48.   
  49.         gazeDirection = Camera.main.transform.forward;  
  50.   
  51.         gazeStabilizer.UpdateHeadStability(gazeOrigin, Camera.main.transform.rotation);  
  52.   
  53.         gazeOrigin = gazeStabilizer.StableHeadPosition;  
  54.   
  55.         UpdateRaycast();  
  56.     }  
  57.   
  58.     /// <summary>  
  59.     /// Calculates the Raycast hit position and normal.  
  60.     /// </summary>  
  61.     private void UpdateRaycast()  
  62.     {  
  63.         RaycastHit hitInfo;  
  64.   
  65.         Hit = Physics.Raycast(gazeOrigin,  
  66.                        gazeDirection,  
  67.                        out hitInfo,  
  68.                        MaxGazeDistance,  
  69.                        RaycastLayerMask);  
  70.   
  71.         HitInfo = hitInfo;  
  72.   
  73.         if (Hit)  
  74.         {  
  75.             // If raycast hit a hologram...  
  76.   
  77.             Position = hitInfo.point;  
  78.             Normal = hitInfo.normal;  
  79.         }  
  80.         else  
  81.         {  
  82.             // If raycast did not hit a hologram...  
  83.             // Save defaults ...  
  84.             Position = gazeOrigin + (gazeDirection * MaxGazeDistance);  
  85.             Normal = gazeDirection;  
  86.         }  
  87.     }  
  88. }  

Hit   光标是否与物体发生了碰撞;
        HitInfo   用来储存碰撞的信息;
        Position   碰撞点,就是gaze的坐标位置(发生了碰撞时,即Hit == true时),

或是gaze的最远的点(由MaxGazeDistance决定,不发生碰撞时,即Hit == false )
        Normal 碰撞点的法线,就是gaze的点的法向量(Hit == true 时),或是gaze的方向(就是gazeDirection,当Hit == false时)。


2.Gesture Manager

  1. public GestureRecognizer NavigationRecognizer { get; private set; }  
  2.   
  3. // Manipulation gesture recognizer.  
  4. public GestureRecognizer ManipulationRecognizer { get; private set; }  
  5.   
  6. // Currently active gesture recognizer.  
  7. public GestureRecognizer ActiveRecognizer { get; private set; }  
  8.   
  9. public bool IsNavigating { get; private set; }  
  10.   
  11. public Vector3 NavigationPosition { get; private set; }  
  12.   
  13. public bool IsManipulating { get; private set; }  
  14.   
  15. public Vector3 ManipulationPosition { get; private set; }  


两种识别器的声明:Navigation和Manipulation;分别声明两个bool类型,判断当前识别器是否在运行中;声明Vector3坐标;


  1. void Awake()  
  2.     {  
  3.         /* TODO: DEVELOPER CODING EXERCISE 2.b */  
  4.   
  5.         // 2.b: Instantiate the NavigationRecognizer.  
  6.         NavigationRecognizer = new GestureRecognizer();  
  7.   
  8.         // 2.b: Add Tap and NavigationX GestureSettings to the NavigationRecognizer's RecognizableGestures.  
  9.         NavigationRecognizer.SetRecognizableGestures(  
  10.             GestureSettings.Tap |  
  11.             GestureSettings.NavigationX);  
  12.   
  13.         // 2.b: Register for the TappedEvent with the NavigationRecognizer_TappedEvent function.  
  14.         NavigationRecognizer.TappedEvent += NavigationRecognizer_TappedEvent;  
  15.         // 2.b: Register for the NavigationStartedEvent with the NavigationRecognizer_NavigationStartedEvent function.  
  16.         NavigationRecognizer.NavigationStartedEvent += NavigationRecognizer_NavigationStartedEvent;  
  17.         // 2.b: Register for the NavigationUpdatedEvent with the NavigationRecognizer_NavigationUpdatedEvent function.  
  18.         NavigationRecognizer.NavigationUpdatedEvent += NavigationRecognizer_NavigationUpdatedEvent;  
  19.         // 2.b: Register for the NavigationCompletedEvent with the NavigationRecognizer_NavigationCompletedEvent function.   
  20.         NavigationRecognizer.NavigationCompletedEvent += NavigationRecognizer_NavigationCompletedEvent;  
  21.         // 2.b: Register for the NavigationCanceledEvent with the NavigationRecognizer_NavigationCanceledEvent function.   
  22.         NavigationRecognizer.NavigationCanceledEvent += NavigationRecognizer_NavigationCanceledEvent;  
  23.   
  24.         // Instantiate the ManipulationRecognizer.  
  25.         ManipulationRecognizer = new GestureRecognizer();  
  26.   
  27.         // Add the ManipulationTranslate GestureSetting to the ManipulationRecognizer's RecognizableGestures.  
  28.         ManipulationRecognizer.SetRecognizableGestures(  
  29.             GestureSettings.ManipulationTranslate);  
  30.   
  31.         // Register for the Manipulation events on the ManipulationRecognizer.  
  32.         ManipulationRecognizer.ManipulationStartedEvent += ManipulationRecognizer_ManipulationStartedEvent;  
  33.         ManipulationRecognizer.ManipulationUpdatedEvent += ManipulationRecognizer_ManipulationUpdatedEvent;  
  34.         ManipulationRecognizer.ManipulationCompletedEvent += ManipulationRecognizer_ManipulationCompletedEvent;  
  35.         ManipulationRecognizer.ManipulationCanceledEvent += ManipulationRecognizer_ManipulationCanceledEvent;  
  36.   
  37.         ResetGestureRecognizers();  
  38.     }  
将navigation的可识别操作设置为单击以及横向移动(手指移动的横向分量将被检测),

将manipulation则设定为manipulationTranslate(大概是跟随手平移)

注册两种识别器的开始,更新,完成,撤销事件。

[csharp]  view plain  copy
  1. void OnDestroy()  
  2.     {  
  3.         // 2.b: Unregister the Tapped and Navigation events on the NavigationRecognizer.  
  4.         NavigationRecognizer.TappedEvent -= NavigationRecognizer_TappedEvent;  
  5.   
  6.         NavigationRecognizer.NavigationStartedEvent -= NavigationRecognizer_NavigationStartedEvent;  
  7.         NavigationRecognizer.NavigationUpdatedEvent -= NavigationRecognizer_NavigationUpdatedEvent;  
  8.         NavigationRecognizer.NavigationCompletedEvent -= NavigationRecognizer_NavigationCompletedEvent;  
  9.         NavigationRecognizer.NavigationCanceledEvent -= NavigationRecognizer_NavigationCanceledEvent;  
  10.   
  11.         // Unregister the Manipulation events on the ManipulationRecognizer.  
  12.         ManipulationRecognizer.ManipulationStartedEvent -= ManipulationRecognizer_ManipulationStartedEvent;  
  13.         ManipulationRecognizer.ManipulationUpdatedEvent -= ManipulationRecognizer_ManipulationUpdatedEvent;  
  14.         ManipulationRecognizer.ManipulationCompletedEvent -= ManipulationRecognizer_ManipulationCompletedEvent;  
  15.         ManipulationRecognizer.ManipulationCanceledEvent -= ManipulationRecognizer_ManipulationCanceledEvent;  
  16.     }  
注销上述事件

[csharp]  view plain  copy
  1. public void Transition(GestureRecognizer newRecognizer)  
  2.     {  
  3.         if (newRecognizer == null)  
  4.         {  
  5.             return;  
  6.         }  
  7.   
  8.         if (ActiveRecognizer != null)  
  9.         {  
  10.             if (ActiveRecognizer == newRecognizer)  
  11.             {  
  12.                 return;  
  13.             }  
  14.   
  15.             ActiveRecognizer.CancelGestures();  
  16.             ActiveRecognizer.StopCapturingGestures();  
  17.         }  
  18.   
  19.         newRecognizer.StartCapturingGestures();  
  20.         ActiveRecognizer = newRecognizer;  
  21.     }  
两种识别器之间的变换,比如当前为navigation识别模式,调用Transition(ManipulationRecognizer)可以使manipulation识别器开始工作。

[csharp]  view plain  copy
  1. public void ResetGestureRecognizers()  
  2.    {  
  3.        // Default to the navigation gestures.  
  4.        Transition(NavigationRecognizer);  
  5.    }  
重置识别器(官方Demo中默认操作是旋转,因此默认的识别器是navigation识别器)
[csharp]  view plain  copy
  1. private void NavigationRecognizer_NavigationStartedEvent(InteractionSourceKind source, Vector3 relativePosition, Ray ray)  
  2.     {  
  3.         // 2.b: Set IsNavigating to be true.  
  4.         IsNavigating = true;  
  5.   
  6.         // 2.b: Set NavigationPosition to be relativePosition.  
  7.         NavigationPosition = relativePosition;  
  8.     }  
  9.   
  10.     private void NavigationRecognizer_NavigationUpdatedEvent(InteractionSourceKind source, Vector3 relativePosition, Ray ray)  
  11.     {  
  12.         // 2.b: Set IsNavigating to be true.  
  13.         IsNavigating = true;  
  14.   
  15.         // 2.b: Set NavigationPosition to be relativePosition.  
  16.         NavigationPosition = relativePosition;  
  17.     }  
  18.   
  19.     private void NavigationRecognizer_NavigationCompletedEvent(InteractionSourceKind source, Vector3 relativePosition, Ray ray)  
  20.     {  
  21.         // 2.b: Set IsNavigating to be false.  
  22.         IsNavigating = false;  
  23.     }  
  24.   
  25.     private void NavigationRecognizer_NavigationCanceledEvent(InteractionSourceKind source, Vector3 relativePosition, Ray ray)  
  26.     {  
  27.         // 2.b: Set IsNavigating to be false.  
  28.         IsNavigating = false;  
  29.     }  
各种navigation识别器发生事件之后执行的操作,此处操作是改变IsNavigating的值,即当前识别器的”工作状态“
[csharp]  view plain  copy
  1. private void ManipulationRecognizer_ManipulationStartedEvent(InteractionSourceKind source, Vector3 position, Ray ray)  
  2.    {  
  3.        if (HandsManager.Instance.FocusedGameObject != null)  
  4.        {  
  5.            IsManipulating = true;  
  6.   
  7.            ManipulationPosition = position;  
  8.   
  9.            HandsManager.Instance.FocusedGameObject.SendMessageUpwards("PerformManipulationStart", position);  
  10.        }  
  11.    }  
  12.   
  13.    private void ManipulationRecognizer_ManipulationUpdatedEvent(InteractionSourceKind source, Vector3 position, Ray ray)  
  14.    {  
  15.        if (HandsManager.Instance.FocusedGameObject != null)  
  16.        {  
  17.            IsManipulating = true;  
  18.   
  19.            ManipulationPosition = position;  
  20.   
  21.            HandsManager.Instance.FocusedGameObject.SendMessageUpwards("PerformManipulationUpdate", position);  
  22.        }  
  23.    }  
  24.   
  25.    private void ManipulationRecognizer_ManipulationCompletedEvent(InteractionSourceKind source, Vector3 position, Ray ray)  
  26.    {  
  27.        IsManipulating = false;  
  28.    }  
  29.   
  30.    private void ManipulationRecognizer_ManipulationCanceledEvent(InteractionSourceKind source, Vector3 position, Ray ray)  
  31.    {  
  32.        IsManipulating = false;  
  33.    }  
  34.   
  35.    private void NavigationRecognizer_TappedEvent(InteractionSourceKind source, int tapCount, Ray ray)  
  36.    {  
  37.        GameObject focusedObject = InteractibleManager.Instance.FocusedGameObject;  
  38.   
  39.        if (focusedObject != null)  
  40.        {  
  41.            focusedObject.SendMessageUpwards("OnSelect");  
  42.        }  
  43.    }  
manipulation识别事件发生后的操作略有不同,识别开始时让当前焦点物体执行方法PerformManipulationStart(GestureAction中)初始化物体位置信息,

更新事件发生后让当前焦点物体执行方法PerformManipulationUpdate(GestureAction中)进行物体的平移操作。单击事件将执行Interactible脚本中的OnSelect()方法。


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值