HTC VIVE开发教程(三)
来源:互联网 发布:钢结构公司起名 知乎 编辑:程序博客网 时间:2024/05/16 15:03
在这一节,我介绍的主要内容有
- [CameraRig]预制体
- [SteamVR]预制体
- [Status]预制体
在SteamVR插件的Prefabs文件夹下面有三个预制体,CameraRig是相机预制体,使用时直接将这个预制相机作为主相机拖入场景中,我们就能以第一人称看到VR头盔里面的内容。Status是通过overlay显示一些状态信息的预制体。SteamVR是渲染核心预制体,不需要手动添加,会自动创建。下面我就来详细讲解这三个预制体。
[Camerarig]
<div align="center">![这里写图片描述](http://img.blog.csdn.net/20160926164717530)</div>
我们可以看到,在Camerarig下面有一个左右手柄的Controller和一个头部的Camera
在手柄Controller和头部的Camera上都有一个Steam VR_Tracked Object脚本,这是用来跟踪设备位置的脚本。
void OnEnable() { var render = SteamVR_Render.instance; if (render == null) { enabled = false; return; } SteamVR_Utils.Event.Listen("new_poses", OnNewPoses); //监听new_poses通知 }
我们在前面分析SteamVR渲染脚本SteamVR_Render时提到过在渲染循环里面有不断获取设备位置,并发送通知的逻辑,SteamVR_Utils.Event.Send(“new_poses”, poses),可以看到在Steam VR_Tracked脚本里面有注册这个监听,所以这个脚本可以不断的获取设备位置,同时更新在显示画面中的位置。我们在来看看OnNewPoses这个方法
private void OnNewPoses(params object[] args) { if (index == EIndex.None) //设备的索引,头显默认为0 return; var i = (int)index; isValid = false; var poses = (Valve.VR.TrackedDevicePose_t[])args[0]; if (poses.Length <= i) return; if (!poses[i].bDeviceIsConnected) return; if (!poses[i].bPoseIsValid) return; isValid = true; var pose = new SteamVR_Utils.RigidTransform(poses[i].mDeviceToAbsoluteTracking); if (origin != null) { pose = new SteamVR_Utils.RigidTransform(origin) * pose; pose.pos.x *= origin.localScale.x; pose.pos.y *= origin.localScale.y; pose.pos.z *= origin.localScale.z; transform.position = pose.pos; transform.rotation = pose.rot; } else { transform.localPosition = pose.pos; transform.localRotation = pose.rot; } }
OnNewPoses的方法就是设置设备的transform,使得设备的实际空间中的位置与在头显画面中看到的位置一致。
Camera上面还有一些脚本,SteamVR_Camera.cs和SteamVR_CameraFlip.cs这两个脚本作用都是对相机渲染出来的图像进行一定的处理变换。SteamVR_GameView.cs是用来显示运行VR时pc上面的伴随窗口的。这里面的代码都不是太复杂,就不一一介绍了。
[SteamVR]
在SteamVR这个预制体只有Stean VR_Render这一个脚本,这个脚本在之前已经介绍了。这个预制体是必须在项目中添加的,即使不手动添加也会自动添加。
Pause Game When Dashboard Is Visible参数控制是否在显示控制面板时暂停游戏(在游戏过程中按系统键就会弹出控制面板),实际做法是将Unity的Time.timeScale设为0,相当于时间暂停了。
Lock Physical Update Rate To Render Frequency参数锁定物理更新频率为(头显)渲染帧率。这个会根据头显的渲染帧率来计算Unity的更新频率。
External Camera为外部相机,它的作用是制作那种将玩家的现实场景与虚拟的游戏场景融合的视频。
Tracking Space为跟踪空间的类型,可以设为坐姿和站姿,坐姿和站姿的区别是视角的高度。
[status]
status预制体的用处并不是很大,它的下面有6个组件,我来分别说一说这6个组件的作用
Calibration:这个组件用在Vive进行房间设置时进行相应的提示
_Stats:这个是显示统计信息的一个组件(目前仅显示帧率和丢帧数)。它上面还有一个Camera,通过它将GUIText渲染到overlay的纹理上,通过overlay将文字信息显示出来。它的显示效果如下图
TrackingLost:这个是失去头显定位后给的文字提示
TrackingRestored:这个是恢复头显定位后的提示信息
SteamInitFailure:这个是Steam初始化失败后的文字提示
Overlay:这个控件的作用是是一个2D的UI界面叠加到场景上面显示出来
- HTC VIVE开发教程(三)
- HTC VIVE开发教程(一)
- HTC VIVE开发教程(二)
- HTC VIVE开发教程(四)
- HTC VIVE开发教程(五)
- HTC VIVE开发教程基础交互功能
- HTC Vive Unity 教程
- HTC Vive Unity 教程
- HTC Vive Unity 教程
- HTC Vive Unity 教程
- VR开发--(HTC Vive)设备一览
- HTC VIVE 开发 移动
- Unity开发HTC VIVE
- Htc Vive开发注意
- HTC Vive VR房产项目开发三(添加物体提示)
- unity开发HTC VIVE虚拟现实应用入坑笔记(三)——InteractionSystem
- Unity开发HTC vive 三、远处拖动3D物体
- Unity开发HTC vive 三、远处拖动3D物体
- Redis快照原子存放硬盘中
- html5新内容
- TS详解
- 我眼中的STL六大组件的关系
- cir_head_singlelink
- HTC VIVE开发教程(三)
- android developer tiny share-20160919
- Android 中的接口回调
- Oracle DBA日常工作手册
- 快速排序算法
- DataTable字符串类型的数字,按照数字类型排序
- C++ 中的 Lambda 表达式
- 9anchor
- 【基础知识思考整理】函数指针有什么用?