博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Pvr_UnitySDKHeadTrack代码分析
阅读量:6407 次
发布时间:2019-06-23

本文共 4759 字,大约阅读时间需要 15 分钟。

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             else102             {103                 transform.rotation = rot * target.rotation;104             }105         }106 107         else108         {109             var rot = Pvr_UnitySDKManager.SDK.HeadPose.Orientation;110             if (target == null)111             {112                 transform.localRotation = Quaternion.identity;113             }114             else115             {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             else127             {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在监视窗口隐藏变量的边框
 

转载于:https://www.cnblogs.com/krystalstar/p/9639619.html

你可能感兴趣的文章
python 生成html代码_使用Python Markdown 生成 html
查看>>
axure如何导出原件_Axure 教程:轻松导出图标字体所有图标
查看>>
laravel input值必须不等于0_框架不提供,动手造一个:Laravel表单验证自定义用法...
查看>>
cad填充图案乱理石_太快了吧!原来大神是这样用CAD图案填充的
查看>>
activator.createinstance 需要垃圾回收么_在垃圾回收器中有哪几种判断是否需要被回收的方法...
查看>>
rocketmq 消息指定_RocketMQ入坑系列(一)角色介绍及基本使用
查看>>
redis zset转set 反序列化失败_掌握好Redis的数据类型,面试心里有底了
查看>>
p图软件pⅰc_娱乐圈最塑料的夫妻,P图永远只P自己,太精彩了吧!
查看>>
jenkins 手动执行_Jenkins 入门
查看>>
怎么判断冠词用a还是an_葡语干货 | 葡萄牙语冠词用法整理大全
查看>>
js传参不是数字_JS的Reflect学习和应用
查看>>
三个不等_数学一轮复习05,从函数观点看方程与不等式,记住口诀与联系
查看>>
卡尺测量的最小范围_汽车维修工具-测量用具
查看>>
网优5g前景_5G网络优化师前景怎么样?
查看>>
竞态条件的赋值_[译] part25: golang Mutex互斥锁
查看>>
delmatch oracle_完美完全卸载(清除)oracle数据库的方式(方法)
查看>>
pyqt 滚动条 美化_Pyqt5 关于流式布局和滚动条的综合使用示例代码
查看>>
51单机片 编译hex_单片机爬坑记-05-编译环境(完)
查看>>
java 正则表达式 img_Java正则表达式获得html字符串里的<img src=""/> 中的url列表
查看>>
java 文件crc校验_一个获取文件crc32校验码的简洁的java类 | 学步园
查看>>