《Unity虚拟现实开发实战》——第3章,第3.6节虚拟现实设备的运行原理

本节书摘来自华章出版社《Unity虚拟现实开发实战》一书中的第3章,第3.6节虚拟现实设备的运行原理,作者[美] 乔纳森·林诺维斯,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.6虚拟现实设备的运行原理
戴上头盔,体验透视图吧!出现了3D,感受3D,可能你会有一种真正处于这个合成场景中的感觉。我猜想这不是你第一次体验虚拟现实,但是既然我们一起体验了,就让我们花几分钟讨论一下它的原理。
显而易见的是,虚拟现实看起来真的很酷!那它是怎么做到的呢?
沉浸感和存在感这两个词用来描述虚拟现实体验的特性。Holy Grail就是用来增强这两个特性的,让它看起来非常真实,让你忘记了是在虚拟世界中。沉浸感是模拟你身体接收的(视觉的、听觉的、运行的等)感官输入感知的结果,这可以从技术上解释得通。而存在感是你被放在一个环境中的本能感—一种深刻的情感或直觉。你可以说沉浸感是VR的科学,而存在感是艺术且很酷。
很多不同的技术和技巧聚合在一起使虚拟现实体验运作起来,可以分成两个
基本域:

  1. 3D视觉。
    2.头部动作跟踪。

换句话说,也就是显示器和传感器,就像现在手机中的显示屏和传感器,这就是为什么现在可以负担得起虚拟现实的一个很大的原因。
假设虚拟现实系统可以随时准确地知道你头部的位置,假设系统可以立即立体地渲染和显示这个精确视角的3D场景,那么无论何时何地你移动了,你都可以看见虚拟场景,都会有一个几乎完美的虚拟现实视觉体验。这就是它的基础,哈!
好了,我们慢一点来,逐字解释。

3.6.13D立体视图
分屏立体画是在摄影术发明之后不久被发现的,就像1876年展出的图片(B. W. Kilborn & Co, Littleton, New Hampshire,中的那个非常受欢迎的立体画查看器。一幅有立体感的照片为左眼和右眼分成两个视图,这两个视图有略微偏移以造成视差,这种欺骗让大脑以为它是真的3D视图。设备也为双眼准备了两个镜头,让你很容易聚集在两张靠近的照片上。


《Unity虚拟现实开发实战》——第3章,第3.6节虚拟现实设备的运行原理

类似地,渲染这些并排的立体图是Unity中开启了虚拟现实摄像机的第一件事。
假设你正戴着一个虚拟现实头盔并且静静地抱着你的头,那这张图片看起来就像是静止的,会比一张简单的立体图看起来要好一些。为什么?
那张过时的立体图中有两张相对小一点的带有矩形边框的孪生照片,当你的眼睛聚焦在视图的中心时,3D效果令人信服。但是你会看到视图的边界,把你的眼球向四周移动(保持头部静止),剩余的沉浸感完全消失了。你现在只是一个在外边窥视透视图的观察者。
现在,不戴头盔的Oculus Rift的屏幕看起来是这样的(见下图):

《Unity虚拟现实开发实战》——第3章,第3.6节虚拟现实设备的运行原理

第一件你会注意到的事情是每只眼睛都对应一个桶形的视图。为什么是这样的呢?头盔的镜头是一个非常宽角度的镜头,所以,当你透过镜头看图的时候也会有一个非常宽的视野。其实,它是非常宽的(也非常高),它使图片变形(枕形失真,pincushion effect)。图形软件(SDK)对变形做了一次逆(inverse)操作(桶形变形,barrel distortion),这样透过镜头看起来就正对我们了,这也被称作一次视觉变形纠正(ocular distortion correction),结果是一个未必真实的视野(Field of View,FOV),它足够宽到容纳很多边缘视觉。比如,Oculus Rift DK2 就有一个大约100°的FOV。(我们将在第9章中深入讨论FOV。)
另外当然了,两只眼睛的视角是稍有点错位的,与你两只眼睛间的距离或者说瞳孔间距(Inter Pupillary Distance,IPD)值相差无几。IPD用于计算视差,每个人的值都不相同。(Oculus 配置工具箱用一个工具测量和配置你的IPD,也可以让眼医测一个精确的距离。)
可能不那么明显,但是如果你离近一些看虚拟现实的屏幕,你会发现色彩分离,就像彩色打印机的打印头没有对齐打出来的效果一样,这是刻意为之的。光穿透镜头时会根据光的波长产生不同角度的折射。而渲染软件会对颜色分离再做一次逆操作,让它看起来正对我们,这也被称作为色差校正(chromatic aberration correction),这样可以使图片看起来清晰(really crisp)。
屏幕的分辨率也是得到一个有说服力的视图的重要因素。如果分辨率太低会看到像素,或者有些人称之为纱窗效应(screen door effect)的东西。显示器的像素宽高是对比头盔显示器时一个经常被引用的规格,但是每英寸像素数(ppi)值可能更重要。显示器技术的其他创新点比如像素拖尾(pixel smearing)和注视点渲染( foveated rendering)(恰好当你眼球观看时显示高分辨率的细节)也能够帮助减少纱窗效应。
当你用虚拟现实技术体验3D场景时,你还必须考虑每秒帧数 (Frames Per Second, FPS)。如果FPS太低,动画就不是很连贯。影响FPS的因素包括图形处理器(GPU)的性能和Unity的场景的复杂度(多边形和光照计算的数量),还有一些其他因素。这在虚拟现实中是较复杂的,因为你需要绘制两次场景,为每只眼各绘制一次。技术上的创新,比如对虚拟现实的GPU优化、帧插值(frame interpolation)及其他技术,可以改进帧率。对于我们开发者来说,Unity中的移动游戏开发者用到的那些性能调优技术也可以用于虚拟现实。(我们将在第8章中深入讨论性能优化。)这些技巧和光学让3D场景显得逼真。
声音也非常重要,比很多人所认识的更重要。我们应该戴着立体声耳机体验虚拟现实。其实,当音频很棒而图像很糟糕时,你仍然可以有一个很好的体验,这种现象在电视和电影院中很常见,在虚拟现实中同样适用。双耳音频(binaural audio)以这样方式给双耳提供其声源的立体视图,让你的大脑想象想象它在3D空间中的位置。不需要特别的收听设备,一般的耳机就可以(扬声器不可以)。比如,戴上你的耳机在这个网址 https://www.youtube.com/watch?v=IUDTlvagjJ 查看《Virtual Barber Shop》。真3D音效,比如VisiSonics(由Oculus颁布许可),提供一种更逼真的空间音频渲染。声音在临近的墙上反弹后会被场景中的障碍物阻挡,以增强第一人称的体验和现实感。
最后,虚拟现实头盔的大小应该刚好适合你的头和脸,让你感觉不到正戴着它,并且应该遮挡你周围真实环境中的光。

3.6.2头部跟踪
那么,假设我们有一张好看的3D图片,可以在一个舒适的带有广角的虚拟现实头盔中查看,你移动头部就会感觉到有一个透视图盒子粘在你的脸上。移动头部时盒子也随之移动,这就像你手里拿着古董级的立体画设备或者小时候玩的魔景机(View Master)。幸运的是,虚拟现实要酷得多。
虚拟现实头盔内部有一个动作感应器(IMU),用于检测空间加速度和三个轴上的转速,叫作六*度(six degrees of freedom)。这也是在手机和一些控制台游戏控制器里同样常用的技术,安装在头盔上,当你移动头部时,会计算当前视角(viewpoint),下一帧画面绘制时使用此视点,这也被称作运动检测(motion detection)。
如果你想在手机上玩游戏,那么当前的动作感应器也许还行,但是对于虚拟现实,它还不够精准,误差(化整误差)会随着时间而累积,因为感应器每秒钟要获取几千次样本,偶尔会丢失对你在真实世界中的跟踪。漂移(drift)问题是基于手机的虚拟现实头盔的主要偏差,比如Google Cardboard,它能够感应你头部的动作,但是它会丢失对你头部位置的跟踪。
高端的头盔显示器用分离的位置跟踪(positional tracking)机制解决飘移问题。Oculus Rift用一个由内向外的定位跟踪器(inside-out positional tracking)解决这个问题,在头盔显示器上有一组(不可见的)红外LED,通过外部的光感应器(红外摄像头)读取这些LED的值,从而决定你的位置。你需要保持在摄像机的视图中让头部跟踪能够运行。
另外,Steam VR Vive Lighthouse技术公司制作了一个由外向内的定位跟踪器,有两个或多个不发声的激光发射器放在房间中(更像是食品杂货店收银台的二维码扫描器中的激光),然后有一个光感应器在头盔上读取这些激光的射线以确定你的位置。
两种方法的主要目的都是精确地定位你头部的位置(以及其他类似配备的设备,比如手持控制器)。
位置、倾斜和头部的正方向,或者说头部姿势(head pose),被图形软件用于在这个便于观察的位置上重绘3D场景。诸如Unity这样的图形引擎擅长做这个。
现在,假设屏幕正以每秒90 帧的速度刷新,并且你正在移动你的头部,软件确定头部姿势、渲染3D视图并绘制在头盔显示器的屏幕上,而你还在不断地移动头部,所以在显示的时候,图片相对于你当前的位置有点过时,这叫作延迟(latency),它让你感觉到恶心呕吐。
晕动症(cmotion sickness),是当你在虚拟现实中移动头部时产生延迟,但你的大脑却期望你周围的事物随之同步变化而导致的。至少可以这么说,任何可感知的延迟都会让你感到不舒服。
延迟可以用从读取动作传感器的值开始到渲染出相应图片的时间来衡量,或者说是传感器到像素(sensor-to-pixel)的延迟,根据Oculus的John Carmack所说:
“总量为50毫秒的延迟是可响应的,但还是有明显的延迟感。20毫秒或更短的延迟水平被认为是可接受的。”
有很多非常聪明的方法可用于实现延迟抵消(letancy compensation),具体的细节超出了本书的范围,且必然会随着设备厂商的技术改进而变化。其中之一是Oculus称为时间扭曲(timewarp)的方法,它尝试预测渲染完成时你的头部的位置,并且使用那个预测的头部姿势取代真实检测到的头部姿势。所有这些都由SDK处理,所以作为Unity开发者,不需要直接处理它。
同时,作为虚拟现实开发者,我们也需要知道像延迟这样导致晕动症的原因,延迟可以通过快速渲染帧(保持建议的FPS)来减少。而快速渲染帧可以通过抑制头部移动太快和其他让用户感觉到接地和舒适的技术实现。晕动症(motion sickness)在第6章中会深入讨论。
Rift所做的改进头部跟踪和现实感的另一件事是使用一个颈部的骨骼表示(skeletal representation),让它接受的所有旋转更精确地映射到头部的旋转。比如,向下看你的膝盖时会产生一点向前的位移,因为它知道你几乎不可能立刻向下旋转头部。
除了头部跟踪、立体画和3D音效之外,虚拟现实的体验还可以用身体跟踪、手部跟踪(以及手势识别)、运动跟踪(如虚拟现实跑步机)和带触觉反馈的控制器而加强。所有这些技术的目标都是增加你的沉浸感和虚拟世界中的现实感。

上一篇:蚂蚁金服隗华:十五年时间见证分布式数据库的崛起


下一篇:左手代码右手滑板 支付宝这个程序员有些酷