虚拟现实最佳实践

关于开发VR的信息。

Windows
MacOS
Linux

开发虚拟现实(VR)内容确实需要对工作流程做一些调整,这样才能确保用户得到尽可能好的 VR体验。本指南的目的是帮助指出你在开发 VR项目的内容时应该注意的一些主要事项。

VR项目设置

创建新的VR项目时,无论项目是基于蓝图还是基于C++,最好创建使用 手机/平板电脑(Mobile / Tablet) 选项 以及 可伸缩3D或2D(Scalable 3D or 2D) 图形且 不含初学者内容包(No Starter Content) 的项目,这样可以确保你的VR项目从一开始就以正确的帧率运行。

单击查看大图。

VR.INI设置

下列.INI设置取自使用UE4引擎的VR演示《对决(Showdown)》。 如果要使用这些.INI设置,应该将它们添加到项目的 Config\DefaultEngine.INI 文件的 SystemSettings 下面。

[SystemSettings]
vr.PixelDensity=1
r.SeparateTranslucency=0
r.HZBOcclusion=0
r.MotionBlurQuality=0
r.PostProcessAAQuality=3
r.BloomQuality=1
r.EyeAdaptationQuality=0
r.AmbientOcclusionLevels=0
r.SSR.Quality=1
r.DepthOfFieldQuality=0
r.SceneColorFormat=2
r.TranslucencyVolumeBlur=0
r.TranslucencyLightingVolumeDim=4
r.MaxAnisotropy=8
r.LensFlareQuality=0
r.SceneColorFringeQuality=0
r.FastBlurThreshold=0
r.SSR.MaxRoughness=0.1
r.rhicmdbypass=0
sg.EffectsQuality=2
sg.PostProcessQuality=0

VR帧率优化

大部分VR应用依靠自身的程序来控制VR帧率。因此,可以关闭一些会影响VR应用的通用UE4项目设置。

  1. 菜单栏 中选择 编辑(Edit),然后选择 项目设置(Project Settings)

  2. 引擎(Engine) > 通用设置(General Settings) > 帧率(Framerate) 下:

    • 不勾选 平滑帧率(Smooth Frame Rate)

    • 不勾选 使用固定帧率(Use Fixed Frame Rate)

    • 自定义时间步长(Custom Timestep) 设置为

    • 点击 应用

Framerate_after.png

VR世界场景比例

确保世界场景的比例正确是帮助在 VR平台上提供尽可能好的用户体验的最重要方法之一。如果比例错误,可能给用户造成各种感知问题,甚至可能导致模拟器 眩晕症。距离玩家摄像机 0.75到3.5米 的物体在VR中看起来最舒服。 在UE4中,1个虚幻单位(UU)等于1厘米(CM)。也就是说,在虚幻引擎中的Object 如果距离玩家的摄像机(当使用VR时)75UU到350UU,那么观看效果最好。

距离

以虚幻单位(UU)计的距离

1厘米

1虚幻单位

1米

100虚幻单位

1千米

100000虚幻单位

你可以使用 世界场景设置(World Settings) 下面的 World to Meters 变量调节世界场景的比例。 增大或缩小这个数值将会使用户感觉自己相对于周边的世界场景变大或变小。 假设你的内容是按照1虚幻单位=1厘米构建的,那么将 World To Meters 设置为 10 将会使世界场景显得非常大,而将 World To Meters 设置为 1000 又会使世界场景显得非常小。

T_VR_World_To_Meters_00.png

VR与模拟器眩晕症

模拟器眩晕症是在VR世界场景中使用HMD设备时会出现的一种晕动病。模拟器眩晕症可能 大大影响用户的VR体验,在某些情况下甚至会彻底毁掉VR体验。为了帮助降低 用户得到糟糕的VR体验的几率,请 严格 遵循下面列出的最佳实践。如果你不这么做,你的用户 可能会得到非常不快的VR体验。

  • 你必须维持一定的帧率,在理想情况下,一点缓冲区就能保证你的运行帧率始终高于HMD的原生帧率。 低帧率是引发模拟器眩晕症的因素之一,所以一定要尽量优化你的项目。 下表显示了各种HMD的UE4支持,以及你的VR项目在这些设备上运行时需要达到的目标帧率。

    HMD设备

    目标帧率

    DK1

    60 FPS

    DK2

    75 FPS

    Rift Retail

    90 FPS

    Vive

    90 FPS

    Gear VR

    60 FPS

    PSVR

    120 FPS以下不等

  • 开发人员是最糟糕的试验对象,因为他们往往已经习惯了使用VR设备。为了确保不引发模拟器眩晕症,要尽量多找不同的人员来检验你的游戏,次数越多越好。

  • 避免使用电影摄像机或任何阻止玩家控制摄像机移动的设计,因为这往往是给玩家造成糟糕的VR体验的罪魁祸首。

  • 不要手动覆盖视野(FOV),也不要向最终用户公开这一设置供其编辑。这个数值必须与头戴式设备和镜头的物理几何形状匹配,应该通过设备的SDK和内部配置自动设置。如果出现错配,世界场景就会在用户转动头部时出现扭曲,导致失真或不适。

  • 不要在摄像机效果中做出行走时的上下摆动(就像大多数第一人称游戏那样)。让摄像机上下摆动来模拟人体运动会使玩家出现模拟器眩晕症,从而毁掉他们的VR体验。

  • 不要为了让玩家感受事件而"抖动"摄像机。在非VR游戏中,如果有一颗手榴弹在玩家附近爆炸,抖动摄像机可能显得很逼真,但是在VR游戏中,这种效果会非常迅速地引发模拟器眩晕症。

  • 在为VR游戏设计世界场景和关卡时,一定要使用比通常情况暗淡的光源和色彩。在VR游戏中,鲜艳而强烈的光照可能使模拟器眩晕症更快发生。为了避免这个问题,要使用比通常情况下更冷的色调和更暗的光源。

  • 避免设计楼梯,应该用电梯代替。如果玩家快速移动,特别是沿着楼梯上下移动,很容易失去方向感。

  • 玩家应该从一开始就全速移动,而不是逐渐加速到全速。此外,移动速度应该始终保持恒定的加速度。

  • 不要使用景深或动态模糊后期处理,因为它们可能大大影响玩家看到的内容,更重要的是,可能引发玩家的模拟器眩晕症。

请注意,这里并没有详尽地列出模拟器眩晕症的所有根本原因;但是,它应该能让你很好地了解到,哪些因素会导致玩家在玩你的VR游戏时感到不适。

VR摄像机设置

在UE4中,VR摄像机如何设置完全取决于你的VR体验是坐立式还是站立式。 在坐立式体验中,你需要人为地把摄像机原点提高到角色站立的高度。 但是在站立式体验中,你应该确保摄像机原点位于0(地面上)。 要实现这两种效果,你可以将摄像机组件连接到位于角色底部的场景组件(地面),或将"眼高(Eye Height)"设置为 角色上的碰撞胶囊体的"圆柱体高度(Cylinder Height)"的一半(负值)。

站立式VR摄像机

坐立式VR摄像机

VR角色设置

使用VR头戴式设备的角色设置与标准角色的设置略有不同。角色的 高度、宽度、速度和摄像机位置等设置都必须稍加修改,才能容纳VR角色。

在为VR世界场景构建Object时,务必使数字Object的比例与 真实世界中的物体保持一致。把物体做得比真实世界更大或更小都会影响你想要 实现的沉浸感。

角色高度和宽度

角色高度和宽度应该尽可能模拟真实尺度。如果使用的尺寸过大或过小, 都可能毁掉你想要实现的沉浸感。

属性

UE4默认

建议的VR

高度:

192 cm

176 cm

宽度:

84 cm

68 cm

移动速度

VR移动速度是一个很难有建议设置的属性,因为你选择的移动速度主要是 根据你想要实现的体验类型决定的。例如,在《元素(Elemental)》VR演示中,移动速度 就被设置为正常速度的1/4左右。

属性

UE4默认

建议的VR

移动速度:

60 m/s

24 m/s

摄像机位置

VR摄像机应该置于略低于基础眼高处,这样才能符合角色的眼睛高度。

属性

UE4默认

建议的VR

基础眼高处:

180 cm

160 cm

VR内容考虑因素

在创作VR内容时,要牢记用户可能从多种角度观察该内容。下面是几种你 过去可能做过、但是在VR中应该避免的操作:

  • 调整比例——对于VR世界场景中的Object比例,最好的做法就是尽可能模拟现实比例。如果Object大于或小于现实中的物体,可能引发困惑或模拟器眩晕症。

  • 多边形面缺失——在普通游戏中,从Object上移除玩家不会看到的多边形面往往是可以接受的(也是首选的做法)。 但是在VR游戏中,玩家四处观察的自由度大大提高,这种做法有时就可能让玩家看到不该看到的东西。

  • 选择使用的光照类型——在制作VR项目时,你应该始终使用 静态光照光照贴图……这是成本最低的渲染选择。 如果你需要使用动态光照,一定要将动态光源限制在尽可能少的数目,并确保它们永远不会相互接触。 如果有室外场景,应该将定向光源设置为动态而非静态,然后打开级联阴影贴图(CSM);在能够得到阴影效果的前提下将设置调整得尽可能简单。

  • VR与VFX——一些VFX技巧(例如使用 子UV纹理 模拟火焰或烟雾)在VR中的观看效果并不好。 在许多情况下,你需要使用静态网格体代替2D粒子来模拟VFX,例如爆炸或烟迹。
    近场效果或出现得离摄像机非常近的效果在VR中表现良好,但前提是这类效果由静态网格体粒子组成。

  • VR与透明度——在3D图形中,渲染透明度效果的成本极高,这是因为通常需要逐帧对透明度重新求值,以确保效果不变。 由于这种重新求值计算,在VR中渲染透明度效果可能得不偿失。 但是你可以使用 DitherTemporalAA 材质函数来规避这个问题。 这个材质函数可以让材质看起来像使用了透明效果一样。这个函数还能帮助你避免自排序等常见的透明度问题。

    单击查看大图。

  • 尽你所能伪造一切——找到聪明的办法再现成本高昂的渲染选择(例如动态阴影和光照)可以大大帮助你达成VR中的性能目标。 在《对决》中,让角色逐帧投射动态阴影的成本实在太高,这就意味着项目中不能使用动态阴影。 但是,这却会使角色移动时像是漂浮一样。 为了解决这个问题,我们引入了团状假阴影,它可以根据角色在世界场景中与物体的距离来动态调整自身的位置和强度。 这就帮助我们做出了角色靠近地面(或其他物体)时投射阴影的错觉。

    单击查看大图。

已知VR问题

由于HMD的工作方式,一些视频游戏开发中的重要美工技巧失去了它们曾有的作用。 在下面你会找到在VR中表现可能不如预期的功能列表,以及解决问题的变通办法。

  • 屏幕空间反射(SSR):虽然SSR在VR中依然有效,但它们产生的反射可能与世界场景中被反射的物体不匹配。不要使用SSR,应该使用 反射探针(Reflection Probes) 来取代,因为它们的成本低得多,而且产生的反射对齐问题也比较少。

法线贴图问题

在VR中查看Object上的法线贴图时,你会注意到它们并没有产生应有的效果。 这是因为法线贴图没有考虑双目显示或动态视差。 正因如此,在使用VR设备观看时,法线贴图看起来往往是扁平的。 但这并不意味着你不应该或不需要使用法线贴图; 这仅仅意味着,你需要更仔细地评估你在法线贴图中尝试表现的数据是否可以利用几何体更好地表现出来。 在下面,你将找到可以用来替代法线贴图的不同技巧。

  • 视差贴图视差贴图考虑了法线贴图并未考虑的深度提示,从而在法线贴图的基础上更进了一步。视差贴图着色器可以更好地显示深度信息,使物体看起来有更多细节。这是因为无论你从什么角度观察,视差贴图始终会自我修正,展示在你的视角下正确的深度信息。视差贴图的最佳用途是鹅卵石路面和表面上的精微细节。

Tags
Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback