hololens官方教程HoloToolKit中部分代码的理解
来源:互联网 发布:淘宝如何上下架宝贝 编辑:程序博客网 时间:2024/06/03 11:57
1.Gaze Manager
using HoloToolkit;using UnityEngine;/// <summary>/// GazeManager determines the location of the user's gaze, hit position and normals./// </summary>public class GazeManager : Singleton<GazeManager>{ [Tooltip("Maximum gaze distance for calculating a hit.")] public float MaxGazeDistance = 5.0f; //The maximum distance within which collides can be detected [Tooltip("Select the layers raycast should target.")] public LayerMask RaycastLayerMask = Physics.DefaultRaycastLayers; /// <summary> /// Physics.Raycast result is true if it hits a Hologram. /// </summary> public bool Hit { get; private set; } /// <summary> /// HitInfo property gives access /// to RaycastHit public members. /// </summary> public RaycastHit HitInfo { get; private set; } /// <summary> /// Position of the user's gaze. /// </summary> public Vector3 Position { get; private set; } /// <summary> /// RaycastHit Normal direction. /// </summary> public Vector3 Normal { get; private set; } private GazeStabilizer gazeStabilizer; private Vector3 gazeOrigin; private Vector3 gazeDirection; void Awake() { gazeStabilizer = GetComponent<GazeStabilizer>(); } private void Update() { gazeOrigin = Camera.main.transform.position; gazeDirection = Camera.main.transform.forward; gazeStabilizer.UpdateHeadStability(gazeOrigin, Camera.main.transform.rotation); gazeOrigin = gazeStabilizer.StableHeadPosition; UpdateRaycast(); } /// <summary> /// Calculates the Raycast hit position and normal. /// </summary> private void UpdateRaycast() { RaycastHit hitInfo; Hit = Physics.Raycast(gazeOrigin, gazeDirection, out hitInfo, MaxGazeDistance, RaycastLayerMask); HitInfo = hitInfo; if (Hit) { // If raycast hit a hologram... Position = hitInfo.point; Normal = hitInfo.normal; } else { // If raycast did not hit a hologram... // Save defaults ... Position = gazeOrigin + (gazeDirection * MaxGazeDistance); Normal = gazeDirection; } }}
bool Hit 光标是否与物体发生了碰撞;
HitInfo 用来储存碰撞的信息;
Position 碰撞点,就是gaze的坐标位置(发生了碰撞时,即Hit == true时),
或是gaze的最远的点(由MaxGazeDistance决定,不发生碰撞时,即Hit == false )
Normal 碰撞点的法线,就是gaze的点的法向量(Hit == true 时),或是gaze的方向(就是gazeDirection,当Hit == false时)。
2.Gesture Manager
public GestureRecognizer NavigationRecognizer { get; private set; } // Manipulation gesture recognizer. public GestureRecognizer ManipulationRecognizer { get; private set; } // Currently active gesture recognizer. public GestureRecognizer ActiveRecognizer { get; private set; } public bool IsNavigating { get; private set; } public Vector3 NavigationPosition { get; private set; } public bool IsManipulating { get; private set; } public Vector3 ManipulationPosition { get; private set; }
两种识别器的声明:Navigation和Manipulation;分别声明两个bool类型,判断当前识别器是否在运行中;声明Vector3坐标;
void Awake() { /* TODO: DEVELOPER CODING EXERCISE 2.b */ // 2.b: Instantiate the NavigationRecognizer. NavigationRecognizer = new GestureRecognizer(); // 2.b: Add Tap and NavigationX GestureSettings to the NavigationRecognizer's RecognizableGestures. NavigationRecognizer.SetRecognizableGestures( GestureSettings.Tap | GestureSettings.NavigationX); // 2.b: Register for the TappedEvent with the NavigationRecognizer_TappedEvent function. NavigationRecognizer.TappedEvent += NavigationRecognizer_TappedEvent; // 2.b: Register for the NavigationStartedEvent with the NavigationRecognizer_NavigationStartedEvent function. NavigationRecognizer.NavigationStartedEvent += NavigationRecognizer_NavigationStartedEvent; // 2.b: Register for the NavigationUpdatedEvent with the NavigationRecognizer_NavigationUpdatedEvent function. NavigationRecognizer.NavigationUpdatedEvent += NavigationRecognizer_NavigationUpdatedEvent; // 2.b: Register for the NavigationCompletedEvent with the NavigationRecognizer_NavigationCompletedEvent function. NavigationRecognizer.NavigationCompletedEvent += NavigationRecognizer_NavigationCompletedEvent; // 2.b: Register for the NavigationCanceledEvent with the NavigationRecognizer_NavigationCanceledEvent function. NavigationRecognizer.NavigationCanceledEvent += NavigationRecognizer_NavigationCanceledEvent; // Instantiate the ManipulationRecognizer. ManipulationRecognizer = new GestureRecognizer(); // Add the ManipulationTranslate GestureSetting to the ManipulationRecognizer's RecognizableGestures. ManipulationRecognizer.SetRecognizableGestures( GestureSettings.ManipulationTranslate); // Register for the Manipulation events on the ManipulationRecognizer. ManipulationRecognizer.ManipulationStartedEvent += ManipulationRecognizer_ManipulationStartedEvent; ManipulationRecognizer.ManipulationUpdatedEvent += ManipulationRecognizer_ManipulationUpdatedEvent; ManipulationRecognizer.ManipulationCompletedEvent += ManipulationRecognizer_ManipulationCompletedEvent; ManipulationRecognizer.ManipulationCanceledEvent += ManipulationRecognizer_ManipulationCanceledEvent; ResetGestureRecognizers(); }将navigation的可识别操作设置为单击以及横向移动(手指移动的横向分量将被检测),
将manipulation则设定为manipulationTranslate(大概是跟随手平移)
注册两种识别器的开始,更新,完成,撤销事件。
void OnDestroy() { // 2.b: Unregister the Tapped and Navigation events on the NavigationRecognizer. NavigationRecognizer.TappedEvent -= NavigationRecognizer_TappedEvent; NavigationRecognizer.NavigationStartedEvent -= NavigationRecognizer_NavigationStartedEvent; NavigationRecognizer.NavigationUpdatedEvent -= NavigationRecognizer_NavigationUpdatedEvent; NavigationRecognizer.NavigationCompletedEvent -= NavigationRecognizer_NavigationCompletedEvent; NavigationRecognizer.NavigationCanceledEvent -= NavigationRecognizer_NavigationCanceledEvent; // Unregister the Manipulation events on the ManipulationRecognizer. ManipulationRecognizer.ManipulationStartedEvent -= ManipulationRecognizer_ManipulationStartedEvent; ManipulationRecognizer.ManipulationUpdatedEvent -= ManipulationRecognizer_ManipulationUpdatedEvent; ManipulationRecognizer.ManipulationCompletedEvent -= ManipulationRecognizer_ManipulationCompletedEvent; ManipulationRecognizer.ManipulationCanceledEvent -= ManipulationRecognizer_ManipulationCanceledEvent; }注销上述事件
public void Transition(GestureRecognizer newRecognizer) { if (newRecognizer == null) { return; } if (ActiveRecognizer != null) { if (ActiveRecognizer == newRecognizer) { return; } ActiveRecognizer.CancelGestures(); ActiveRecognizer.StopCapturingGestures(); } newRecognizer.StartCapturingGestures(); ActiveRecognizer = newRecognizer; }两种识别器之间的变换,比如当前为navigation识别模式,调用Transition(ManipulationRecognizer)可以使manipulation识别器开始工作。
public void ResetGestureRecognizers() { // Default to the navigation gestures. Transition(NavigationRecognizer); }重置识别器(官方Demo中默认操作是旋转,因此默认的识别器是navigation识别器)
private void NavigationRecognizer_NavigationStartedEvent(InteractionSourceKind source, Vector3 relativePosition, Ray ray) { // 2.b: Set IsNavigating to be true. IsNavigating = true; // 2.b: Set NavigationPosition to be relativePosition. NavigationPosition = relativePosition; } private void NavigationRecognizer_NavigationUpdatedEvent(InteractionSourceKind source, Vector3 relativePosition, Ray ray) { // 2.b: Set IsNavigating to be true. IsNavigating = true; // 2.b: Set NavigationPosition to be relativePosition. NavigationPosition = relativePosition; } private void NavigationRecognizer_NavigationCompletedEvent(InteractionSourceKind source, Vector3 relativePosition, Ray ray) { // 2.b: Set IsNavigating to be false. IsNavigating = false; } private void NavigationRecognizer_NavigationCanceledEvent(InteractionSourceKind source, Vector3 relativePosition, Ray ray) { // 2.b: Set IsNavigating to be false. IsNavigating = false; }各种navigation识别器发生事件之后执行的操作,此处操作是改变IsNavigating的值,即当前识别器的”工作状态“
private void ManipulationRecognizer_ManipulationStartedEvent(InteractionSourceKind source, Vector3 position, Ray ray) { if (HandsManager.Instance.FocusedGameObject != null) { IsManipulating = true; ManipulationPosition = position; HandsManager.Instance.FocusedGameObject.SendMessageUpwards("PerformManipulationStart", position); } } private void ManipulationRecognizer_ManipulationUpdatedEvent(InteractionSourceKind source, Vector3 position, Ray ray) { if (HandsManager.Instance.FocusedGameObject != null) { IsManipulating = true; ManipulationPosition = position; HandsManager.Instance.FocusedGameObject.SendMessageUpwards("PerformManipulationUpdate", position); } } private void ManipulationRecognizer_ManipulationCompletedEvent(InteractionSourceKind source, Vector3 position, Ray ray) { IsManipulating = false; } private void ManipulationRecognizer_ManipulationCanceledEvent(InteractionSourceKind source, Vector3 position, Ray ray) { IsManipulating = false; } private void NavigationRecognizer_TappedEvent(InteractionSourceKind source, int tapCount, Ray ray) { GameObject focusedObject = InteractibleManager.Instance.FocusedGameObject; if (focusedObject != null) { focusedObject.SendMessageUpwards("OnSelect"); } }manipulation识别事件发生后的操作略有不同,识别开始时让当前焦点物体执行方法PerformManipulationStart(GestureAction中)初始化物体位置信息,
更新事件发生后让当前焦点物体执行方法PerformManipulationUpdate(GestureAction中)进行物体的平移操作。单击事件将执行Interactible脚本中的OnSelect()方法。
阅读全文
0 0
- hololens官方教程HoloToolKit中部分代码的理解
- Hololens官方教程之HoloToolKit部分代码解释
- 软件开发中部分代码的注解
- 浅析Hololens HoloToolkit中Utilities下通用脚本的用法
- Hololens中使用holotoolkit自带的按钮
- 浅析Hololens HoloToolkit中Utilities下通用脚本的用法
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- Hololens官方教程精简版
- C#----Graphics中部分方法的使用和理解
- Java生成,一维码和二维码
- IT瞄~ react-native 加签打包发布app
- 不能加载json文件---XMLHttpRequest cannot load xxx.json
- iOS 使用 Cocoapods安装图文
- 欢迎使用CSDN-markdown编辑器
- hololens官方教程HoloToolKit中部分代码的理解
- MethodHooker-Hook分析
- 序列的注意事项
- 线程和进程、程序、应用程序之间的关系
- Linux CentOS 7 jdk1.7安装与环境变量配置
- Launch Screen 设置的启动图更改图片不变
- GPU工作原理与理解
- SSH远程连接CentoS 中文乱码解决
- springmvc文件上传