Oculus Integration 开发包中有个 OVRManager 脚本被挂载到 OVRCameraRig 物体上。OVR Manager 中有个 Tracking Origin Type 参数,它相当于追踪的参考系,参数分为 Eye Level, Floor Level 和 Stage。
VR 设备会对头显进行追踪,于是现实中头显的位置和旋转数据会被传输给 Unity,让 Unity 中的眼部相机匹配上现实中玩家头显和位置和朝向。而头显的位置和旋转数据是个三维坐标,那么它们的值一定是相对于某个参考系的。 这时候 Tracking Origin Type 参数就派上了用场。Oculus 官方文档对三种 Type 的定义是这样的:(https://developer.oculus.com/documentation/unity/unity-add-camera-rig/)
- Eye Level tracks the position and orientation relative to the device’s position.
- Floor Level tracks the position and orientation relative to the floor, whose height is decided through guardian setup.
- Stage also tracks the position and orientation relative to the floor. On Quest, the Stage tracking origin will not directly respond to user recentering.
如果直观的看,Tracking Origin Type 也相当于设置 VR 世界中头部的初始高度。
选择 Floor Level,会以安全区的地面(打开 VR 设备一般都会先设置地面高度,然后划安全区)作为参考系,运行程序后头部高度会以地面作为参考点,初始高度相当于摆放在场景中的眼部相机的高度加上现实中玩家头显到安全区地面的距离。
选择 Eye Level,会以头显设备本身作为参考系,头部的初始高度和摆放在场景中的眼部相机的高度是一样的,不会额外加上现实中头显到地面的距离。
选择 Stage,和 Floor Level 一样也是以地面作为参考系,但是不会受头显的重定位影响。重定位是什么意思呢?以 Quest 举例,长按右手柄的 Oculus 键或者重新划安全区会对用户的位置和朝向重新定位(需要是一体机软件而不是电脑串流),也可以说让用户的位置和朝向重新定位在初始的位置。假设刚进入一个游戏,我们在现实中的位置相当于虚拟世界中的初始位置,位于(0,0,0)原点,然后一开始有个方块处于我们的正前方。这时候我们在现实中转过 90°,然后往前走一步,再进行重定位。如果选择的是 Floor Level,方块就会被重新定位在我们的正前方,和一开始的位置是不一样的;如果选择的是 Stage,重定位是不起作用的,方块还会位于原来的位置。
大家可以通过下面的图感受它们的区别,也建议自己打包出来运行一下。
⚡相机的初始高度
Eye Level:
Floor Level / Stage:
⚡Floor Level 和 Stage 的区别
Floor Level:
Stage: