VR基本技术
由于Glass的镜片是凸透镜,手机显示的图像在经过镜片后会发生枕形畸变,物体会发生扭曲,影响用户体验。因此在一次渲染后,会对图像做一次筒形畸变,以抵消镜片产生的扭曲。
对左右眼分别处理,为了节省GPU开销,会将原始图像分割成32x32个矩形。根据镜片的参数和畸变公式,计算出各个矩形的顶点对应在原始图像上的位置,矩形内部由openGL进行线性的插值并贴图,最终显示到屏幕上。
和平精英VR基本技术
由于Glass的镜片是凸透镜,手机显示的图像在经过镜片后会发生枕形畸变,物体会发生扭曲,影响用户体验。因此在一次渲染后,会对图像做一次筒形畸变,以抵消镜片产生的扭曲。
对左右眼分别处理,为了节省GPU开销,会将原始图像分割成32x32个矩形。根据镜片的参数和畸变公式,计算出各个矩形的顶点对应在原始图像上的位置,矩形内部由openGL进行线性的插值并贴图,最终显示到屏幕上。
一个马甲收藏了!
重走丙察察收藏了!

6-dof
要确定一个点在一个平面中位置,需要x、y两条轴,要确定一个点在一个立体空间中位置,需要x、y、z三条轴,假若要知道一个点在立体空间运动方向,只要知道该点运动前后两组x、y、z轴数据即可,也就说只需3DoF即可实现。
在今天智能手机早已普遍内置了陀螺仪与加速计,能够提供3DoF数据,安装上VR眼镜后也是靠手机自身检测头部运动的方向与速度,所以廉价VR眼镜真的只是一个眼镜而已,几元到百元的VR眼镜并没有质的区别。
外力实现6DoF
只有3DoF的VR眼镜有一个非常严重缺点——无法在现实世界中行走,假若在人现实世界中前进时,会产生一个向前的速度,头部同时运动,那就在同一方向上再产生一个速度,3DoF无法分清楚谁在运动,是头部呢,是身体呢,还是二者都在动。
要解决此问题必须将自由度提升到6DoF,比如说HTC Vive上的Lighthouse技术。Lighthouse定位技术源自Valve,它主要由两部分组成,一是VR眼镜,但与普通VR眼镜不同,Lighthouse VR眼镜表面带有多个光学传感器;二是两个Lighthouse基站,每一个基站都具有红外LED阵列与两个转轴互相垂直的旋转红外激光发射器。在部署时,两个基站放置在高位、对角线放置,其中一个作为主机,然后光学同步,让二者发射的红外线成为一个能扫描整个空间的网络。眼镜上的光学传感器接收到红外信号后,就可以算出眼镜到基站的距离,最终计算眼镜在空间的位置、运动方向,获得完整的6DoF数据。若在VR眼镜中加入陀螺仪与加速计,能进一步提高Lighthouse的定位精度。
单机解决6DoF之路
以HTC Vive为代表的Lighthouse定位技术的确能带来很好的体验,可HTC Vive并没有普及的原因也显而易见,即该产品部署非常耗费时间,使用空间有局限,使用时还会干扰家电的红外遥控器,其结果是更多的应用在商业领域,而非普通用户层面。因此,在近两年VR眼镜解决方案多是追求一机提供6DoF,高通骁龙835 VRDK正是其一。
为了充分利用已有技术,骁龙835 VRDK的6DoF采取分两步走的方法,第一步沿用手机的上成熟的三轴陀螺仪、三轴加速计获得3DoF,而且这些传感器刷新速度提高到800-1000Hz,有效提高了响应速度,减少了头部快速运动下的不适。
第二步是眼镜的正面加入双摄像头构成的立体摄像头,每个镜头配备了鱼眼镜头,能够获得超广视野,在镜头之后是一百万像素的(1280×800)单色传感器,有效提高了在低照度下捕捉影像的能力。工作时两个摄像头协同工作,以30FPS速度扫描周边环境,通过三角测量原理计算眼镜与当前景物的距离。其原理与手机双摄像头拍摄虚化背景照片一样,不过两个镜头间距很大,精度更高。距离信息经处理后变换为空间位置信息,再与传感器数据融合,最终提供了厘米级的6DoF。
VR眼镜是一种讲究快速响应的设备,只有motion-to-photon(MTP)时延低于20ms时才能给用户带来更好的体验,这要求骁龙835 VRDK必须能快速处理6DoF数据。骁龙835 VRDK的核心是骁龙835移动平台,它采用异构运算结构,比如说摄像头捕捉的图像就可依靠Adreno GPU异构运算,实现了点对点连接,减少了单个任务处理的时延,同时尽可能增加并行任务数以最大限度减少MTP时延。此外骁龙处理器早实现了传感器接口统一与管理,6DoF数据能直达到SoC各个子处理器中。
束缚在10平方米空间之中、一条电缆距离是当前6DoF VR眼镜最大缺憾,因此它只能止步在商业应用领域,而无法成为人们手中玩物。像高通骁龙835 VRDK这种解决方案,摆脱外部传感器的限制,单机实现6DoF了,让人随时随地VR。更重要的是高通骁龙835 VRDK是一个完整的平台,它带有Kryo CPU、Adreno GPU,可以播放视频、进行3D游戏,更重要的是它内置了骁龙X16 LTE Modem,拥有1Gbps下行速度以及150Mbps上行速度,走到何处都能获取VR资源,换言之,其硬件上是无线设计,而内容上也是“无限”和无线的。

Timewrap
在理想的情况下,渲染引擎发送给显示之前使用测量好的实时的头部姿态(方向和位置).但是,在现实情况下,渲染需要耗费时间,所以渲染引擎使用的姿态是发送显示设备之前几毫秒的.在这几毫秒的时间里,头部运动了,但是图像是会比实际情况延迟一些的.
让我们举一个带数值的例子,假设我们需要每秒渲染90帧(90FPS),这种情况下每一帧渲染需要11毫秒的时间.我们假设头部追踪数据是连续不断的,但渲染需要10毫秒.已知渲染时间,渲染引擎开始渲染的时间越晚越好,需要发送到显示设备的是10毫秒之前的桢.因此渲染引擎使用头部追踪的数据是10毫秒之前的.如果头部旋转的速度是200度每秒,这样10毫秒就是旋转了2度(200*0.01=2).如果HMD水平视场角是100度,在水平视野上横向排列有1000个像素,2度的延迟意味着图像与实际图像延迟了20个像素点.
但是,实验证明即使是2度的变化在远处图像上是不容易被人察觉的.因此,如果有一种方法在屏幕上移动20个像素(例如,在例子中的2度).那么最终的图像是相当准确的.
这正是时间扭曲(或简称为”TW”):它非常迅速的(小于1毫秒)转换图像,这个转换基于渲染引擎使用头部信息的时间和时间扭曲之间这段时间的头部旋转(渲染开始到执行TW之间的时间).
处理时间扭曲相当的简单:渲染引擎执行渲染,然后渲染引擎执行完毕时,这时候将时间扭曲迅速的运用到最终的图像上.
但是如果渲染引擎需要的时间大于帧与帧时间的时间,会如何?这种情况下,时间扭曲的一种版本,叫做异步时间扭曲(“ATW”)通常会被使用.ATW使用最后一个有效的帧加上时间扭曲来处理这种情况.如果渲染引擎没有及时完成(图像渲染的工作),ATW使用前一帧,并用时间扭曲处理它.如果使用的是前一帧,头部很可能已经不再当时的位置,所以需要更大的移位.不能指望渲染引擎都能准时的完成,ATW使用先前一桢的数据来进行处理,仍然会比丢失一桢的数据所带来明显的抖动画面要来的要好.这就是为什么ATW被称为渲染的”安全网络”,当渲染不能准时完成时这个动作很有用.ATW的异步来自于ATW是一个独立于渲染引擎的线程或进程,并运行在比渲染引擎更高的优先级,以便于在渲染引擎没有按时完成渲染的情况下更新帧(插入帧).
这里对技术要点进行详细说明:
时间扭曲的例子可以解决左右侧(yaw方向)的头部运动得到补偿.实际上,所有三个旋转方向-yaw,pitch和roll-都可以补偿,以及在某些假设的情况下的头部位置.例如,OSVR实际上执行6DOF扭曲基于假设物体与投影中心2米的距离.它处理关于实现方向的旋转,并接近所有其他的平移和旋转.
在场景中的物体例如:手,如果渲染引擎没有及时渲染一个帧,尽管加入时间扭曲,将仍然会出现抖动的情况.
为了使时间扭曲工作的更好,渲染帧需要略大于显示器分辨率的尺寸.否则,最终可能会看到空的像素(例如图像向左移动20像素位置,那么屏幕最左边的20个像素位置即为空像素).实际上渲染真需要多大,依赖于帧率,以及预测头部旋转的速度.更大的帧图像意味着更多的像素要被渲染,占用更多的内容,所以时间扭曲并不是完全”免费”的.
如果HMD里的图像是被渲染到一个单一的显示屏上(而不是两个显示屏,每个眼睛对应一个显示屏),时间扭曲需要对每个眼睛使用不同的扭曲程度,因为一只眼睛刷新的图像比另外一个早(60FPS的情况下,一只眼睛比另一只眼睛早1/60/2,大概8毫秒).
一些对象,例如在头部空间里的菜单(例如,应该相对于头部时固定的),需要单独的代码来渲染和提交,因为他们不应用于头部运动投影的修正.
预测追踪(估计未来的姿态,这基于先前读到的方向,位置以及角速度)可以帮助提供输入信息给渲染引擎,但实际测量的数据往往比预测未来的姿态的更加准确.
依赖于HMD显示配置,左眼比右眼的渲染来的更迟一些(例如,如果屏幕是竖屏,渲染从上到下,左眼对应的是屏幕的上半部分).在这种情况下,需要对每个眼睛使用不同的时间扭曲(这2个眼睛刷新的时间相差1/FPS/2秒).
我要发帖子
HarmonyOS NFC的每种技术的说明在哪里看? (API12+)
【有搜必应】HarmonyOS 热搜技术问题解析第五期
HarmonyOS 开发中如何引入Flutter技术?(API12+)
HarmonyOS 音频播放技术支持 (API12+)
HarmonyOS aspectRatio数据精度为何出现偏差?(API12+)
HarmonyOS 人脸识别预览适配PC端设备 (API12+)
阔直板 & 折叠屏应用 UI 适配典型场景与通用开发指南
HarmonyOS componentUtils.getRectangleById获取组件位置信息不准 (API12+)