开发者必读:Oculus官方最佳开发实践指南(上)

作为本次VR兴起的领军公司,Oculus无疑对VR的原理、应用以及各种潜在问题有着最为全面及深刻的理解。因此,相信本系列中的内容对VR从业者,包括技术开发、产品设计,甚至商务及投资相关人士都会提供很好的帮助。

关于最佳实践

VR是一种高沉浸性的媒介。它使用户能够被放入一个虚拟的(或真实世界的数字重现)三维的世界,从而产生远高于传统屏幕媒介的体验。这些最佳实践希望可以帮助Oculus的内容开发者开发出为用户带来快乐,但同时又是安全的VR内容。希望开发者们对VR的各方面科学原理有所了解,并确保自己的产品在安全性、舒适度及其它产业标准上有着严格的要求。

综述

如果VR体验没有遵守最佳实践中的一些基本原则,可能会导致一些用户产生晕动症,其症状包括眼部疲劳、失去方向感、恶心。以前,很多这类问题都是由于VR硬件的一些指标(如系统的延时)所造成的。但以Oculus Rift为代表的新一代VR设备已经解决了大多数硬件上的问题。不过即使是在完美的硬件系统上,如果内容设计不当,仍然会造成不舒适的体验。

由于VR仍然是一个新生的行业,对它的某些方面还没有系统性的研究及权威性的论断。针对这些方面,我们提供现有的一些观察结果和理论以供参考。要设计出精彩、同时舒适的体验内容,大量的用户测试是必需的。VR作为一个年轻的大众媒介,还没有建立起能考虑每个方面的规则体系。虽然我们在不断进行研究,但并不能一蹴而就。希望Oculus的开发者们能给我们提供反馈,共同完善VR的最佳实践及原则。

说明:和其他媒体一样,我们不建议不间断地长时间使用VR设备,这对开发者、用户及设备本身都不利。我们最新的健康安全警示在www.oculus.com/warnings上可以找到。

渲染

·使用Oculus VR 畸变着色器。如果使用你自己的畸变计算方式,即使它“看起来可以”,也会给用户造成不适。

·使用完全正确的投射矩阵,并使用Oculus缺省的头部模型。任何对光学流程的改变都会使用户在移动头部时产生眼球转动及身体的不适。

·从始至终保持VR的沉浸感。例如,不要在用户面前固定任何画面,比如对头部移动无反应的静止画面,这会造成方向感的丧失。

·左右眼画面应只是根据视角有不同;一些画面处理效果(如光线折射、发光)对双眼应该是一致的,包括在z 轴上的深度。这样才能产生正确的画面。

·低分辨率在眼镜视野的中心区域是最明显的,可以考虑使用超取样(supersampling)和抗锯齿(anti-aliasing)来缓解。

保持低延迟

·你的代码运行的帧率需不低于Rift的显示刷新率,而且是在v-synced和unbuffered的条件下。抖动和掉帧都会在VR中产生不适。

·理想情况下,争取20ms以内的延迟(指从头部运动到画面显示的延迟,这个可以用Rift内置的检测来度量)。在代码中注意使读取头显传感器到渲染之间的时间最小。

·游戏主循环中的延迟会波动。我们的SDK中采用了一些技巧防止延迟对用户的影响(如predictive tracking 和TimeWarp)。但请尽量减小体验过程中延迟的波动。

·利用SDK中的追踪预测功能,确保向这个功能提供正确的时间参数。追踪预测数值根据每个应用的延迟有所不同,所以必须根据应用调整。

·参照OculusRoomTiny的源代码了解如何降低延迟,使用合适的渲染技术。

优化

·降低eye-render缓存的分辨率以节省显存,并提高刷新率。

·虽然降低显示分辨率看起来可以改进性能,但其在性能上的帮助主要来自eye-render缓存分辨率的降低。因此,只降低eye-render缓存的分辨率,同时保持显示分辨率可以在较少影响画面质量的情况下改进性能。

头部追踪及视角

·避免出现使用户在环境中感觉不稳定的画面。和用户在实际环境中的动作相反(或反应不足)的一些环境中大型要素的移动(如地平线的转动),会造成不适感。

·画面显示在任何时候都要对用户的移动作出反应。即使是在菜单中游戏暂停时,或在过场动画中,用户都需要可以转头观察四周。

·使用SDK中的位置追踪和头部模型,确保虚拟镜头的移动与头部和身体的移动保持一致。如出现差异,会造成不适。

位置追踪

·渲染画面必须直接与用户的实际移动相关;不要改变虚拟镜头运动的增益量。可以总体改变整个头部模型的大小(例如将英尺单位改为米;或放大缩小角色),但不能不按瞳距(IPD)比例来缩放头部的动作。

·由于有了位置追踪,用户现在可以移动视角去看一些你本不想让他们看到的地方,如物件的下方,架子上方,或墙角的另一面。所以需要考虑一些遮挡的方案。

·在某些情况下,用户可能会利用位置追踪穿过一些虚拟场景(如把头探到墙壁里面,或穿透到一些物件里面)。从我们的经验来看,即使用户发现他们可以这么做,但除非可以看到一些有意义的东西(如游戏设计的“内幕”),否则用户通常会避免这么做。但不管怎样,作为开发者,需要考虑一些解决方法。一个较为常用的方法是触发一个提示,告诉用户他/她已离开镜头的追踪范围(虽然技术上他们可能还在镜头范围内)。

·当用户快要走出镜头追踪范围时(但在位置追踪失效之前),向用户提供警示,并提示如何移动以避免失去追踪。

·我们建议当用户离开镜头的追踪范围时,在Rift中不再显示虚拟环境。可以让场景变为黑色,或使图像衰减(降低亮度或对比度)。这样的处理会大大降低用户的不适程度。同时一定要给用户信息,解释为何会出现问题及解决方法。

·增强或减弱位置追踪都会引起不适,需尽量避免。当位置追踪失效时,把显示变暗,或至少保持对转动的追踪(利用SDK中的头部模型)

加速度

·加速度会在视觉、前庭及感知之间造成冲突,因此需要减少这种冲突的时长及频率。尽量避免频繁的加速,使加速持续时间尽量短。

·“加速”不仅仅指增加前进的速度;任何用户本身运动的变化(不论是速度上的,还是方向上的)都是加速。减速或停止,静止时或移动时的转向,侧向移动等都是加速的形式。

·尽量使加速由用户自己掌握。镜头的抖动、晃动都会对用户造成不适。

移动速度

·在VR中,从一个静止的位置观看周围环境是最舒适的;如果必须在环境中移动,以恒定的速度移动对用户来说是最舒适的。和现实世界相近的速度能保持较长的舒适体验。人类步行的平均速度是1.4m/s。

·相对于在两个位置点之间走动,瞬移的方法在某些情况下值得一试,但有可能会造成方向感的丧失。如果采用瞬移的方法,需向用户提供尽量多的视觉线索,使其能保持方向感,如果可能的话,在瞬移之后保持原先的朝向。

·在移动过程中,朝另一个方向看会造成不适。尽量不要让用户朝其它方向看,特别是当移动速度高于步行速度时。

·避免垂直方向上的线性振动,这种振动在0.2Hz的时候是最难过的,而垂直轴的偏向转动在0.3Hz的时候是最难受的。

镜头

·镜头的拉近及拉远会引起或加强晕动症,特别是当头部和镜头的运动失去1:1的比例关系时。我们建议在找到其他更舒适及对用户更友好的方式前,避免使用这种方法。

·对于第三人称视角的内容,不论其中的角色在做什么,关于加速度及移动的要求同样适用。另外,用户必须随时可以在环境中四处转头观看,这可能会对内容的设计提出新的要求。

·尽量避免使用欧拉角(Euler angles);四元数会比较好。用向上及向下看的动作来测试你的镜头。镜头应该一直是稳定的,并且和你的头部方向保持一致。

·不要使用头部上下摆动的镜头效果,这会造成一系列微小但不舒服的加速度。

管理及测试晕动症

·用各种不同的无偏见的用户来测试你的内容,以确保大多数受众会感到舒适。作为开发者,你自己是最差的测试受众。由于你对Rift和你的内容已经非常熟悉,相对于新用户,你会对内容中的问题及晕动症非常不敏感。

·对不适感的反应和容忍度因人而异,由视觉引起的晕动症在头显中比在电脑或电视中更容易出现。不要期望你的用户会在一个太过激烈的体验中坚持下来,他们会很快放弃。

·可以考虑加入一些允许用户自行调节激烈程度的机制。具体的机制需根据内容设计,但一般来说包括移动速度,加速度大小,或者视野的宽度。这些机制的缺省值应该是最不激烈的数值。

·对于以上这些用于晕动症管理,用户自己可调整的数值,用户可能需要在体验过程中实时进行调整(例如,当用户已适应VR时,或感到疲劳时)。因此尽量使用户能在不重启的情况下实时调整这些设定。

·在虚拟场景中,用一个和现实中相似的,具有惯性的独立背景可以减轻视觉和前庭的感知冲突,并增加舒适度。(例如,不会随手柄输入移动,但可以用头部转动观察的天空盒)。

·高重复性的图案(如条纹)会在虚拟环境中增加速度感,并导致不适。在场景中使用(或提供用户选择)尽量平坦的贴图(避免有花纹)以提供更舒适的体验。

立体感的程度

·要实现针对个体的真实性及正确的显示比例,请使用SDK中根据用户数据提供的眼部距离向量(middle-to-eye separation vectors)。

·立体影像中的深度感觉在靠近眼镜时是最敏感的,而随着距离的增大,会很快消减。因此,远处两座相距几公里的山峰,与面前距离几寸的两只钢笔,所呈现的深度感是差不多的。

·虽然增加两个虚拟镜头间的距离会增强立体成像中的深度感,但需注意会有一些副作用。首先,这会迫使用户将双眼向中间聚拢,如果同时不把物体相应从镜头拉远,就会对眼睛产生压力。其次,如果没有将头部的动作与双眼距离正确匹配的话,会导致感知异常及不适感。

用户界面

·用户界面(UI)必须是虚拟世界中的3D物体,距离用户大约2-3米远——即使只是在用户面前的简单的面片、柱体或球体。

·不要要求用户在眼眶中转动眼球去看清UI。理想情况下,你的UI应该在用户视野中心的1/3处。否则,用户应该可以转动头部来查看UI。

·对随着用户头部转动移动或缩放的UI需要很小心(例如,长条的菜单会随着用户头部的转动而滚动或移动)。确保这些UI对用户的移动反应准确,并清晰可辨,不会造成干扰或不适。

·尽量将UI设计为3D世界中的合理的要素。例如,枪支的弹药数量最好是直接在该枪支上显示,而不是在飘在空中的HUD上。

·所有的准星类的UI都要画在其瞄准的物体的同一深度上。否则,当双眼聚焦在某一深度上时,会看到准星成为重影。

控制游戏中的角色

·当用户戴着Rift时,是无法看见输入设备的。因此请使用用户熟悉的控制方式作为缺省输入方式。如果一定要使用键盘,需要考虑用户会需要摸索的方式来找到相应的控制键。

·考虑利用头部移动作为一种直接控制方式,或作为控制方式中的起始步骤。

声音

·在作声音的设计时,记住如果戴着耳机,输出的音源是可以跟踪用户的头部移动的,而用扬声器就做不到这一点。所以应该允许用户选择输出设备,并确保游戏中的声音从正确的位置发出(通过计算头部和输出设备间的相对距离)。

·用中间声道或平均的左右声道来表现NPC的语音是一种通用的做法,但这在VR中会破坏沉浸感。而使用空间定位的声音,即使比较粗糙,可以加强用户的体验。

·在声音设计中考虑位置追踪。例如,如果用户靠近音源,声音应该变大,即使用户的Avatar并没有移动。

内容

·关于距离有关的建议,真实世界中的一米大致相当于Unity里的一个距离单位。

·DK2的光学组件使距离用户眼睛0.75- 3.5米的物体看起来最舒适。虽然你的整个场景可以有各种景深距离,但那些用户会经常看的物体(如菜单或avatar)应该位于上述距离内。

·如果将物体移到比上述舒适距离更靠近眼睛,会使眼睛对焦失误,看到的影像模糊,及造成眼部紧张。

·过于明亮的图像,尤其是在视野外围时,会让一些敏感的用户感到显示闪烁。尽量使用暗一些的颜色防止不适感。

·在VR中,用来代表用户身体的虚拟avatar既有好处也有坏处。一方面,相对于无形的实体,avatar可以增强沉浸感,使用户更加融入到VR体验中。另一方面,用户在现实世界中与虚拟世界中的差异,可能会引起一些异常的感受(例如,往下看到avatar在走路,而现实中用户正坐在椅子上)。在设计内容时需要考虑到这些因素。

·在VR中,图像分辨率和贴图锯齿是要解决的问题,因此需要仔细考虑贴图和物件的大小(例如,避免出现很“薄”的物体)。

·意外的垂直方向的加速,比如经过不平的地形时的那种颠簸,会造成不适感。因此要么把地形变平滑,要么稳定用户的视角。

·记住,你的用户将有前所未有的沉浸体验,而恐怖或惊悚的体验会给用户(尤其是敏感的用户)造成传统媒体无法带来的深刻影响。所以如果有这些体验,应该提前给用户警告,让用户自己决定是否要继续体验。

·不要只是依赖双眼立体效果来提供内容的深度感。光线、贴图、视差(用户移动时看到的不同物体间的相对移动),以及其他视觉因素都可以同样地(有时甚至更有效)营造深度感和空间感。这些因素应该与双眼立体效果的方向和大小保持一致。

·在设计环境和互动方式时,尽量避免要求玩家左右平移、后退以及转圈,这些动作都会在VR中引起不适。

·如果需要用户在目前注视的方向移动15-20度以上的角度去注视另一个地方,通常会需要转动头部或身体。尽量避免让用户做这么大的移动,以免造成肌肉疲劳及不适。

·记住用户可能会在任何时间看任何地方,因此需确保他们不会看到破坏沉浸感的东西(例如一些渲染时的破绽)。

Avatar的外形

·在你开发的体验中,你可以让玩家作为一个鬼魂(没有具体的形象),也可以让他们有一个和自己非常不同的身体。例如,你可能会让玩家成为一个历史人物,一个虚构人物,卡通人物,龙,巨人,兽人等等。只要你遵守最佳开发实践中对于舒适度的指导,并配以便于理解的操控方式,这些avatar都不会造成问题。

·虽然avatar是为了在虚拟世界中代表玩家自己,但如果玩家往下看到和自己不一样的手或身体,反而会破坏沉浸感。例如,一个女性玩家如果看到自己的avatar有男性的身体和手,就可能会失去沉浸感。让玩家能够定制自己的手和身体会在很大程度上改进这个问题。但如果这个功能太过复杂,开发成本无法承受,你也可以用其他方法减小VR和现实中的差别造成的问题。例如,避免太过男性化或女性化的身体特征。或者使用合理的中性化的手套和服饰,也可以帮助模糊角色的一些特征,如性别、体型、肤色等。

健康及安全

仔细阅读Rift附带的警示(www.oculus.com/warnings),并在你的产品中实现,以确保对你、你的用户及所有测试你的内容的人的健康及安全。

图像安全及图片敏感性癫痫(Photosensitive Seizures)

某些类型的图像被认为会触发小部分人群的图片敏感性癫痫。国际标准组织正在开发旨在防止这种问题的图像标准。你有责任了解这些标准及有关这种疾病的知识,并在设计内容时遵守标准及这方面的最佳实践。

双目视觉,立体影像以及景深信息

·大脑利用双眼观察点看到的差异来感知深度。

·不要忽视单眼的深度信息,例如贴图和灯光。

·用户在Rift中看起来最舒适的景深范围是0.75米到3.5米(Unity中的一个单位=1米)。

·在OVR config工具中,将两个虚拟镜头间的距离设为用户瞳孔间的距离。

·确保每个眼睛看到的影像正确显示及融合。只在单眼中显示的效果(或在双眼中明显不同的效果)会看起来不正常。

基本知识

双目视觉是指我们同时看到周围世界的两个影像——两个眼睛看到的影像稍有不同,而我们的大脑将它们组合成一幅三维的立体影像,这被称为立体视觉。我们左眼和右眼看到的差别产生了立体视差。立体视觉的产生来自于双眼对现实世界的不同视点,也可以来自于两个具有适当差别(视差)的平面图像。

Oculus Rift对每个眼睛显示一个图像,这两个图像来自于相隔少许距离的两个虚拟摄像机。下面是一些术语的定义。两眼间的距离称为瞳距(IPD,interpupillary distance),而我们把捕捉虚拟世界的两个渲染相机间的距离称为ICD(inter-camera distance)。IPD可以介于52mm到78mm之间,平均的IPD大约为63.5mm(这个数据来自于对大约4000名美国士兵的调查)。这个距离正是Rift的平均IAD(interaxial distance),这是指Rift中两个透镜中心间的距离。

单眼深度信息

立体视觉只是我们的大脑处理的许多深度信息中的一种,很多其他的深度信息是单眼看到的:这些信息即使只有一只眼睛看到,或两只眼睛只看到一个平面的影像,也可以传达深度。在VR中,由头部移动产生的运动视差不需要立体视觉来感知,但它对感知深度非常重要,而且给用户提供一种舒适的体验。

其它重要的深度信息包括:曲线透视(直线伸向远方时会收拢),相对大小(远处的物体看起来变小),遮挡(近处的物体会挡住远处的物体),空气透视(远处的物体由于折射的原因显得比近处的物体更模糊),材质浓度变化(重复的纹理离开越远,密度越高),以及光线(高光和阴影帮助我们判断物体的形状和位置)。现阶段的CG内容里其实已经使用了很多这些手段,我们在这里提到这些是因为很多人会只注重立体视觉,而忽视这些手段。

在Rift中舒适的观看距离

对于眼睛在注视物体时的舒适度,有两个因素是非常重要的:聚焦需求和聚散需求。聚焦需求是指眼睛调节晶状体的形状以聚焦到一个深度平面。聚散需求是指眼球向中间转动以便让双眼的视线在某个深度平面上汇聚。在现实世界中,这两个需求是相互关联的;因此我们有所谓的“聚焦聚散反射”:眼睛的聚散角度会影响晶状体的聚焦,反之亦然。

像其他立体3D技术(比如3D电影)一样,Rift对眼睛产生了一个特殊情况,将聚焦和聚散这两个需求间的关联打破了:聚焦程度是固定的,但聚散度会改变。这是由于产生立体3D的实际影像一直是显示在离眼睛固定距离的屏幕上,但是我们的眼睛仍需要转动以便使双眼的视线交汇在不同的深度平面上。

已有一些研究试图发现聚焦和聚散需求最大能有多少差异(在不对用户产生不适的情况下)。DK2的光学镜头组相当于让用户注视距离眼睛大约1.3米的屏幕(由于生产中的误差,这个数字是一个大致的估计)。为了防止用户眼睛疲劳,对于用户会较长时间注视的物体(如菜单、场景中的重要物件等),需要显示在距屏幕0.75米到3.5米之间。

当然,在一个完整的虚拟环境中,有些物件会在上述的舒适距离之外。只要用户不需要长时间注视这些物体,一般来说问题不大。在Unity中,一个单位大致相当于现实世界中的1米,因此关注度高的物体应该在0.75至3.5个单位之间。

我们仍在持续地研发,将来的Rift有可能会改进光学组件以扩展舒适观看距离的范围。但不管这个距离范围会如何改变,2.5米应该是一个安全的、理想的距离,能让用户舒适地较长时间注视菜单或GUI。

一些开发者发现,当可以确定用户的注视范围时,景深效果可以带来沉浸感,同时又很舒适。例如,你可以故意将菜单后面的背景显示模糊,或者将一个需要仔细观察的物件的前后景深模糊化。这不仅可以模拟真实世界中视觉的功能,还可以避免用户焦点以外的物体分散视觉的注意力。

我们不能控制不让用户作出一些不合理、不正常、或不可预见的行为。有些用户可能会靠近一个物体,一整天都盯着它看。虽然我们知道这会造成视疲劳,但如果采取特别的方法去防止(如加入碰撞检测防止用户靠近),反而会影响正常的用户体验。所以,开发者要注意免的是,对于一些已经知道会造成问题的地方,不要主动让用户进入。

ICD(相机间距离)的作用

改变ICD,即两个渲染摄像机之间的距离,会给用户带来重要的影响。如果ICD增加,会使景深感放大,从而产生一种“超立体”的体验。而如果ICD减小,会使景深变平。除此以外,改变ICD还会对用户产生另外两个影响。首先,会改变双眼看某一个物体时的聚集度。当ICD增加,用户需要使双眼更加向中间聚集,以看清一个物体,这会使眼睛容易疲劳。其次,它会改变用户在虚拟世界中对自身大小比例的感知。这一点我们会在以后的章节中详述。

将ICD与用户的瞳距(IPD)保持一致可以在虚拟世界中实现真实的比例和深度。如果需要调整比例,务必请调整整个头部模型的比例,这样才能在用户移动头部时,提供反映真实世界中感知的体验。同时也需遵守我们所说的其它关于距离的指南。

左右两个摄像机之间的距离(ICD;下图左)必须和用户双眼瞳距 (IPD;下图右)保持比例一致。任何对ICD的调整都必须等比例地调整到整个头部模型。

融合两个影像时可能出现的问题

在现实世界中,我们经常会碰到每个眼睛看到完全不同影像的情况,比如在墙角探出头用一只眼睛观察。这一般不会有什么问题。在VR中这类情况同样不会有问题。实际上,有时候两眼看到不同的影像反而会有好处:例如,一个特工躲在草丛后观察敌情,他双眼不同的视点可以让他的视线“穿过”草丛看到周围的情况。而如果在一个2D屏幕的游戏中,草丛会完全挡住视线。

不过,VR(如同其它立体影像)有时也会对用户造成一些异常的情况。例如,一些渲染效果(如光线扭曲,粒子效果,光晕等)就必须在双眼中显示正确的视差。否则,会造成影像闪烁(当这些效果只在单眼中显示),或造成物体漂浮在不正确的深度平面上(当没有视差,或者后期效果没有显示在正确的物体上)。因此,一定要确保除了实现双目视差所需的不同视点,两只眼睛看到的影像是一致的。

要确保用户的眼睛能接收到足够的信息,以供大脑正确地感知和分析,虽然这在一个较复杂的3D虚拟环境中应该不是什么问题。组成3D场景的线条和边界通常是足够的,但还是有一些需要注意的。如大片的重复花纹会使融合双目影像发生异常。另外如果缺乏足够的单眼深度信息的话,会产生一些错觉(如把凹面看成凸面)。

视场角(FOV)及比例

虚拟相机的FOV必须和可见的显示区域相匹配。一般来说,Oculus不建议改变缺省的FOV。

视场角有一些不同的定义,我们先来解释一下。如果是显示视场角(dFOV),这是指VR内容所占据的物理显示区域,是硬件和光学组件的物理特性。另一种FOV是镜头视场角(cFOV),是指渲染镜头所看到的虚拟世界的范围。所有的视场角都以横向、纵向和/或对角线上的角度数值来界定。

在传统的由屏幕显示的画面中,你通常可以将cFOV设为任何你需要的角度:从鱼眼(大角度)一直到长焦(小角度)。虽然有些用户可能会在玩游戏时产生一些由视觉引发的晕动症状,但大多数用户不会因此受到影响,因为他/她看到的影像是在用户视野之内的一个物体上的。电脑用户可以看到显示设备周围的环境,而且显示器通常也不会对用户的头部转动作出反应。虽然显示的画面也会有一定程度的沉浸感,但大脑一般不会相信是在一个真实的环境中,所以cFOV和dFOV之间的差异对大多数用户都不会造成问题。

在虚拟现实中,看不到周围的真实环境,虚拟世界充满了用户的视野。所以保持cFOV和dFOV的一致十分重要。这两个数值间的比例称为scale,在虚拟现实中scale必须一直为1.0。

Rift的最大dFOV取决于屏幕、透镜,以及透镜到用户眼睛的距离(眼睛离透镜越近,dFOV越大)。配置功能测量用户可以看到的最大dFOV,并把这个信息存储在用户的配置文件中。 SDK会根据这个信息建议与之匹配的cFOV。

说明:由于一些用户两眼到屏幕的距离是不一样的,所以每个眼睛会有不同的dFOV,这是正常的。

dFOV和cFOV之间的差异已被发现会造成用户的不适。如果scale的数值不是1.0,畸变矫正数值会使渲染出的场景产生扭曲。改变cFOV也会造成晕动症状,甚至有可能引发前庭眼反射的错乱——前庭眼反射是在头部转动时帮助眼睛稳定地注视某一物体的机制。这种错乱会使用户在体验VR内容时感到不适,也会在用户脱下Rift后影响视觉和运动的协调性。

我们的SDK可以让你在不改变scale的情况下,修改cFOV和dFOV,这是通过在影像周围加黑框来实现的。减小影像的范围可以帮助提高渲染性能,也可以用来实现一些特效。但请注意,如果你选择40度的可见影像,大部分的屏幕会是黑的——这是正常的,不是bug。另外,可见影像范围减小后,用户在查看四周时,会需要更大幅度地转动头部,这有可能会使肌肉紧张,及造成头晕。

有一些游戏会用到望远镜或瞄准器的效果。这在VR里很复杂,实现起来需要很小心。直接实现镜头拉伸的效果会造成头部运动和光学运动之间的视差。我们会在以后的文章和demo中论述这个问题。

显示分辨率

DK2使用分辨率为1920×1080的低余晖OLED显示屏,刷新率为75 Hz。相对于DK1的1280×720@60Hz的LCD显示屏,是一个很大的提升。高分辨率意味着图像更为清晰和锐利,而低余晖和高刷新率则消除了DK1中的大部分的运动模糊问题(运动模糊-motion blur,指在转动头部时发生的模糊)。

DK1的显示面板使用的是网格像素结构,会产生较明显的“纱窗效应”(因为像透过纱窗看周围而得名),这是由于像素点之间的空隙而引发的。而DK2面板的Pentile结构产生的是一种蜂窝状效果。由于显示子像素分割的特殊几何结构,红色通常会使这种效果更明显。

上述问题再加上镜头畸变的效果,使一些高细节度的图像(如文字或复杂的贴图)在Rift里和在电脑屏幕上看起来会不一样。因此在开发过程中需要确保在Rift中查看美术资源,并根据Rift中的显示效果作调整,以保证画面质量。

纱窗效果

了解并避免显示闪烁

显示闪烁一般认为是由于整个屏幕中快速的明暗“波动”而引起的。有些人对闪烁极为敏感,并会导致视觉疲劳、头痛及身体疲劳的症状。但也有人根本不会注意到闪烁,也没有任何症状。不过,有一些因素会在整体上增强或减弱显示闪烁对一般人的影响。

用户对闪烁的感知程度是由几个因素决定的,包括:显示在“打开”和“关闭”模式中循环的频率,在显示“打开”阶段的发光量,用户视网膜被刺激的程度,个体用户易疲劳的程度,甚至用户体验的时间段都会有影响。

有两个信息对开发者很重要。第一,人眼对视野外围的闪烁,比对视野中心的闪烁更为敏感。第二,亮度高的图像会造成更多的闪烁。特别是在外围高亮度的图像(比如站在白色的,明亮的房间中),很可能会造成明显的显示闪烁。所以尽量使用较暗的颜色,特别是在用户视野中心以外的区域。

刷新率越高,闪烁越不明显。这就是为什么要保证75fps的刷新率(在V-Synced和Unbuffered的情况下)。随着VR硬件的成熟,刷新率和帧率很可能会超过75fps。

渲染分辨率

DK2的显示分辨率是1920×1080,但由于透镜会产生畸变,屏幕上显示的画面需要先经过某种变形,以便在用户眼中正常显示。为了给变形提供足够的像素密度,针对每只眼睛的渲染画面需要有比一半显示分辨率更高的分辨率。

这么高的渲染目标会超过某些显卡的性能,而如果牺牲帧率,则会影响VR体验的质量。降低显示分辨率效果不明显,而且会造成一些视觉上的缺陷。不过,降低Eye Buffer的分辨率可以在保持画面质量的情况下提高性能。

这个方法会在SDK的说明中详细解释。

动态渲染的面片

对深度感知的敏感程度会随着距离的增加而减弱。在很近的距离,你的立体视觉可以分辨出前后相差几毫米的两个物体哪一个离你更近。而当距离增大,这种判断就会变得困难。如果是在花园对面的两棵树,可能只有当它们前后相聚几米远时,你才能分辨哪一棵树离你更近。如果范围再扩大,远处的两座山可能要相距几公里才能被分辨出哪座在前哪座在后。

根据这种对远处深度感知的相对不敏感性,可以用一些面片的贴图来取代全3D的场景,以节约电脑的计算量。例如远处的一座山,你不需要用3D来渲染,而只要在一个四边形上贴一张平面的图案来表现。在VR中,这张图和传统的3D游戏中看起来是一样的。

说明:这种方法的有效性取决于一些因素:如物体的大小,物体中和周围的深度信息,以及物体周围的环境。每个个体资源都需要经过测试,以确保看上去是正确的。注意这种面片需要离镜头足够远,对3D场景与这种面片间的过渡也要小心处理,否则会影响沉浸感。

Normal Mapping vs. Parallax Mapping

Normal Mapping这种技术使3D模型不需要增加顶点细节就能在贴图上表现深度。虽然这种技术已被广泛用于游戏开发中,但在立体3D中,它的效果并不明显。这是由于Normal Mapping没有考虑双眼视差或运动视差,因此在VR中,Normal Mapping的效果与普通的平面贴图差不多

Parallax Mapping和Normal Mapping的思路相似,但考虑了前者不具备的深度信息。Parallax Mapping利用贴图软件中的Height map,对表面材质的取样后的材质坐标作了调整。这种材质坐标的调整是在著色器(Shader)层面上对单个像素或顶点的查看方向做计算的。Parallax Mapping最适合使用的地方是在不影响碰撞的多细节表面上,例如砖墙和鹅卵石地面。

运动

综述

·在最舒适的VR体验中,用户除了转动头部和身体四处看之外,是不需要自身的运动的。

·如果一定需要移动用户,低速地移动(如走动或慢跑)对新用户来说是最舒适的。

·对任何形式的加速,都是越短越好,越少越好。

·不要分割用户的移动和镜头的移动。

·在第一人称的游戏中,不要使用“头部振动”模式。

·为保证舒适度,应在设计上避免要求玩家向后移动,或侧移。

·有些情形会在视觉上引发强烈的运动感,比如占据屏幕较大位置的阶梯或重复纹路。

移动速度和加速

这里的“移动”特指那些在虚拟环境中运动,但在真实世界中并未产生相同运动的情况。移动和加速通常是由于用户的avatar在虚拟环境中移动(自身移动或驾驶车辆),而用户在真实世界中的躯体保持不动。这种情况会造成不适,因为用户的视觉告诉他们在空间中移动,身体的感觉(前庭和本体感知)正相反。这种由视觉引发的感知幻觉被称为“相对运动错觉”,这是晕动症的主要原因。

研究发现,在虚拟环境中的移动速度与晕动症的产生速度有比例关系,但与晕动症的严重程度似乎并无关系。我们建议尽可能地使用人类的典型移动速度(1.4米/秒的行走速度,3米/秒的慢跑速度),把这个速度作为用户可选(或最好是缺省)的速度。

在VR内容中,对加速的视觉感知是造成不适感的主要诱因。这是由于人类的前庭系统对加速会做出反应,而对持续速度则不会。只在视觉中感知加速,而头部和身体没有加速感的话就会造成不适。

注意,这里的“加速”是指用户在虚拟世界中看到的任何在运动速度和方向上的变化。虽然通常我们认为加速是指“增加前进的速度”,其实加速也可以指减速或停止;翻滚、转向,或者移动或静止时的摇摆;也可以是侧向或上下的移动(或停止移动)。任何速度或方向上的改变都是加速。

瞬间加速的舒适性要好于逐渐加速。这是因为加速发生的时长也是感知发生冲突的时长,不适感会随着感知冲突的频率、大小及持续时间的增加而加大。通常我们建议尽可能地减小加速的频率和持续时间

控制程度

在现实的车辆中,驾驶员比乘客更不容易感到头晕;同样,在VR中,让用户可以控制自己的运动会防止晕动症。让用户主动控制在环境中的移动,而不要让他们被动地移动,而且要避免镜头的抖动(比如在用户被击中或撞击的时候)。这种做法在显示器上是有效的,但在VR中会引起晕动症。同样,也不要锁定显示,以至于无法对用户的头部运动作出反应,因为这样会造成运动错觉,并引起不适。总之,要避免任何原因产生的用户和镜头移动之间的不同步。

研究表明,如果用户的avatar能帮助用户对即将看到的运动进行预测,可以帮助用户对此作好心理准备,并减小不适感。这是第三人称视角的游戏的一个好处。如果avatar的行为(如车辆开始转向,或角色朝某一方向开始跑动)可以准确地指示镜头将要发生的运动,这可以帮助用户对即将在虚拟环境中发生的移动作好准备,因而提供更为舒适的体验。

头部振动

一些第一人称的游戏为了模拟角色走路的效果,采用了让镜头轻微地上下移动的效果。这种方式可以有效地在电脑或电视上表现人类的移动方式,但在VR中,会对很多人造成问题。每一次上下的振动其实都是对用户视角的一次加速,如前所述,加速会造成不适。因此不要采用任何与用户头部实际运动不符的头部振动,或其他对镜头位置或方向的改变。

向前及横向的移动

在真实世界中,我们最常用的是站立不动或向前移动。我们很少向后倒退,而我们几乎不会横向移动。因此,如果必须在VR中移动,往前走是最舒适的。向左或向右的平移会产生更多问题,因为我们在现实中通常不会这样移动,因此会对用户产生异常的光学流动模式。

总的来说,你需要遵守人类运动的机制,在现实世界中人们的运动是有一定限制的,在设计中需要考虑这一点。

上下楼梯(或较大的坡度)会造成用户的不适。这除了是因为垂直方向上的加速外,另一个原因是,楼梯的水平边界占据了大部分显示区域并朝同一方向移动。这就产生了“相对运动错觉(Vection)”的强烈视觉效果。用户一般不会看到这类影像,除非是在靠近有纹路的墙壁或地面行走的时候。我们建议开发者尽量少用楼梯或陡坡。这也适用于其他会引发“相对运动错觉(Vection)”的环境,如在一个电梯井里上升(电缆或其他重复性的贴图在用户周围持续下降)。

在实际开发中,建议开发者考虑以上这些指南相互之间的限制。例如,在操控设计中去掉后退或侧移可能在理论上是合理的,但这可能会使用户需要更多的运动(如转身、前进、再转身)来移动到一个目标。这反而会导致更多的视觉上的移动,并引起更多的“相对运动错觉(Vection)”——可能还不如直接允许后退或侧移。因此设计环境和体验时要尽量避免这些问题所带来的影响。

另外,请尽量简化复杂的行动,减少用户在体验中感受相对运动错觉的机会,例如把一些绕过障碍物的复杂行动自动化或简化。有人做过实验:要求受试者走过一段复杂的路径,给他们两种操控方法,方法一有3个自由度的运动;方法二有6个自由度的运动。虽然3个自由度的操控一开始看起来使用户减少了对镜头的控制(因而会更容易导致晕动症),但实际上正相反,使用这种控制方法的用户反而较少感受到头晕,这是因为用户感受到的视觉运动更少。

上面这个例子说明没有一种能适合各种类型内容和情况的通用方法。需要通过周全的考虑、用户测试以及设计上的不断迭代来优化用户的体验和舒适度。

开发者必读:Oculus官方最佳开发实践指南(下)