• Pvr_UnitySDKHeadTrack代码分析


      1 ///////////////////////////////////////////////////////////////////////////////
      2 // Copyright 2015-2017  Pico Technology Co., Ltd. All Rights 
      3 // File: Pvr_UnitySDKHeadTrack
      4 // Author: AiLi.Shang
      5 // Date:  2017/01/13
      6 // Discription:Main tracking,manage the rotation of cameras.Be fully careful of  Code modification
      7 ///////////////////////////////////////////////////////////////////////////////
      8 using UnityEngine;
      9 using System.Collections.Generic;
     10 using System.Text.RegularExpressions;
     11 using System;
     12 
     13 public class Pvr_UnitySDKHeadTrack : MonoBehaviour  //头部跟踪
     14 {
     15 
     16     public bool trackRotation = true; //跟踪旋转角度
     17 
     18     public bool trackPosition = true; //跟踪位置信息
     19 
     20     public Transform target;//定义目标组件位置
     21 
     22     private bool updated = false;//设置更新状态
     23 
     24     private Vector3 startPosition;//定义开始的位置,旋转角度,大小的开始位置信息
     25 
     26     private Quaternion startQuaternion;//开始的四元数角度信息
     27     private bool dataClock;//定义数据记录变量
     28 
     29     public void Awake()  
     30     {
     31         if (target == null)  //判断有无目标物体,如果没有目标物体,这组件以父级组件为中心,否则以世界坐标为中心
     32         {
     33             startPosition = transform.localPosition;
     34             startQuaternion = transform.localRotation;
     35         }
     36         else
     37         {
     38             startPosition = transform.position;
     39             startQuaternion = transform.rotation;
     40         }
     41         //Pvr_UnitySDKAPI.Sensor.UPvr_InitPsensor();
     42 
     43     }
     44 
     45     public Ray Gaze  //定义凝视射线类
     46     {
     47         get
     48         {
     49             UpdateHead();//更新头部位置,返回射线信息                        
     50             return new Ray(transform.position, transform.forward);
     51         }
     52     }
     53 
     54     void Update()
     55     {
     56         updated = false;  // OK to recompute head pose.
     57 //# if!UNITY_EDITOR && UNITY_ANDROID
     58 //        if (Pvr_UnitySDKManager.SDK.posStatus == 1 || Pvr_UnitySDKAPI.Sensor.UPvr_GetPsensorState() == 1)
     59 //        {
     60 //            trackPosition = false;
     61 //            if (!dataClock)
     62 //            {
     63 //                Pvr_UnitySDKManager.SDK.resetBasePos = Pvr_UnitySDKManager.SDK.HeadPose.Position;
     64 //                dataClock = true;
     65 //            }
     66 //        }
     67 //        else
     68 //        {
     69 //            if (dataClock)
     70 //            {
     71 //                Pvr_UnitySDKAPI.Sensor.UPvr_OptionalResetSensor((int)Pvr_UnitySDKAPI.Sensorindex.Default, 0, 1);
     72 //                Pvr_ControllerManager.controllerlink.ResetHeadSensorForController();
     73 //                Pvr_ControllerManager.controllerlink.ResetController(0);
     74 //                Pvr_ControllerManager.controllerlink.ResetController(1);
     75 //            }
     76 //            trackPosition = true;
     77 //            dataClock = false;
     78 //        }
     79 //#endif
     80         UpdateHead();
     81     }
     82 
     83     private void UpdateHead()
    //此函数分为两部分,主要判断头部跟踪是否有旋转变换和是否有目标一共四种情况,默认状态是有旋转变换
    84 { 85 if (updated)//判断是否更新了数据,初始化时,设置Update为false,即没有更新数据 86 { 87 return; 88 } 89 updated = true;//设置Update为true,开始更新数据 90 if (Pvr_UnitySDKManager.SDK == null)//判断PvrSDK的管理文件是否为空,若为空,这不更新,退出当前程序 91 { 92 return; 93 } 94 if (trackRotation)//判断头部跟踪时是否有旋转变化,初始化时,设置trackRotation为true 95 { 96 var rot = Pvr_UnitySDKManager.SDK.HeadPose.Orientation;//把PvrSdk管理文件下的头部位置的方向赋值给rot变量 97 if (target == null)
    //如果没有目标物体,则把Rot的信息赋值组件的本地位置,如果有目标物体,这将rot与目标物体的乘积赋值给组件的世界坐标
    98 { 99 transform.localRotation = rot; 100 } 101 else 102 { 103 transform.rotation = rot * target.rotation; 104 } 105 } 106 107 else 108 { 109 var rot = Pvr_UnitySDKManager.SDK.HeadPose.Orientation; 110 if (target == null) 111 { 112 transform.localRotation = Quaternion.identity; 113 } 114 else 115 { 116 transform.rotation = rot * target.rotation; 117 } 118 } 119 if (trackPosition) 120 { 121 Vector3 pos = Pvr_UnitySDKManager.SDK.HeadPose.Position; 122 if (target == null) 123 { 124 transform.localPosition = pos; 125 } 126 else 127 { 128 transform.position = target.position + target.rotation * pos; 129 } 130 } 131 } 132 133 }

    代码结构:

    定义相关变量

    定义射线函数

    定义数据更新信息:是否有目标物体,是否有旋转信息,位置更新3个子部分

    有无Target的区别是:如在监视面板中添加ObjectGame为Target时,可以理解为以该游戏对象为第一人称观察世界,也ObjectGame为中心

                如果没有添加Target,则可理解为以第三人称观看世界,以SDK的组照相机为中心

    Unity VR 常用的组件类:

    Transform类

      transform.localPosition是相对学父级对象的坐标位置,父级为坐标中心
      transform.position世界坐标,以(0,0,0)为中心

    Vector3类

    Quaternion(四元数和旋转)类-旋转分为矩阵旋转;欧拉旋转和四元数旋转


    小技巧

    HideInInspector在监视窗口隐藏变量的边框
     
  • 相关阅读:
    阿里消息队列中间件 RocketMQ 源码分析 —— Message 拉取与消费(上)
    数据库中间件 ShardingJDBC 源码分析 —— SQL 解析(三)之查询SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(六)之删除SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(五)之更新SQL
    消息队列中间件 RocketMQ 源码分析 —— Message 存储
    源码圈 300 胖友的书单整理
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(一)分库分表配置
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 解析(四)之插入SQL
    数据库分库分表中间件 ShardingJDBC 源码分析 —— SQL 路由(二)之分库分表路由
    C#中Math类的用法
  • 原文地址:https://www.cnblogs.com/krystalstar/p/9639619.html
Copyright © 2020-2023  润新知