Oculus Rift DevKit 2,在公开预定之后没多久,就停止了向中国的直邮,我拿到它已经快到年底了。它真的是代表未来吗?相比DK1它有哪些改进?又出现哪些问题?哪些是作为开发者必须先了解的?花了点时间写了这篇《试用手记》,算是对它的初步总结。
新特性
OLED@960×1080~3ms
相比DK1的1280×800 LCD面板,DK2的1920×1080 OLED面板让单眼分辨率达到了960×1080,是原有像素数量的2倍。观感改善了不少,但仍不能说有质的飞跃。
OLED暂留时间达到了3ms,据说相比DK1对减轻眩晕有较大提升。不过由于我个人对视觉残留造成的眩晕不是特别敏感,所以我一直觉得在这方面Oculus Rift做得不错。
很多人还是抱怨单眼960×1080的分辨率仍然能看见像素点。这里就另外提一句:Rift和我们平常使用的平面显示器不一样,它具有宽广的100° FOV(field of view)。为满足“几乎消除死角”的需求,Rift要把960×1080的单眼分辨率全部分配到这100°的FOV。而iPad则没有这种需求,它只消在占据FOV很小一部分的屏幕上显示清晰的图像即可。同时要求这两者达到“视网膜屏”级别的效果,对于Oculus Rift是很不公平的。另外,Rift中看到的图像是经过软件变形(桶形)加透镜变形(枕状)双重处理过的结果。经过这两次信号处理,若要忠实再现点对点的分辨率,整个render target又要增加约1倍左右的分辨率,这样下来,相当于渲染2张1080p的实时图像。再加上为了消除眩晕影响,还得上到75Hz的帧率。这对于填充率瓶颈的普通3D显卡也是一个沉重的负担。
位置跟踪
位置跟踪(Positional Tracking)当之无愧是DK2最显著的新特性。可惜鲜有demo支持。它本质上是通过Rift上多个红外发射头,发射的红外信号到接收器。(顺便说一句,索尼的Project Morpheus也是通过类似的方式进行定位,但它是用四个蓝色可见光LED进行标记。)接收器可以夹在显示器上方,或者固定在三脚架上。虽然官方文档里写位置跟踪传感器的刷新率是60Hz,但跑下来感觉延迟很小,稍稍比头部跟踪传感器慢了一点而已,正常使用下不会引起眩晕。
位置跟踪器可以在0.5-2米范围内,距离接收器一个锥形体内,跟踪人的位置运动(可以在官方Demo Scene里打开Camera Bounds选项实际感受这个椎体)。如果和接收器保持1米以上的距离,基本上一套广播体操的动作都能捕捉到位。把小范围的头部线性运动加入VR应用内,将会很大程度上提升沉浸感和降低眩晕几率。官方带的demo就是个很好的测试范例。在官方demo里,从椅子上站起、凑近观察桌上文具、窥视桌子底部、拿椅子当掩体等动作轻而易举地同步到场景里。
Direct HMD(head-mounted display)模式
这可能不是DK2的新特性,而是新版Oculus Runtime所支持的新显示模式。以前Rift只能作为一个扩展桌面出现在操作系统里。所以要运行3D应用只有两种办法,一种是镜像显示器,这会让主显示器被拉伸成Rift的现实分辨率;二是把对应的3D应用拖到副显示器上,但拖入Rift后再进行操作会非常痛苦,由于双眼获得的图像不同,通常需要睁一只眼闭一只眼来搞。
而Direct HMD模式直接去掉了扩展桌面。运行3D应用时,在主显示器上现实缩小的立体图像,而Rift中则全屏运行应用。这样只要脱掉Rift就能在主显示器操作窗口,而又不会像镜像模式那样把主显示器搞的很丑。目前Direct HMD模式只在Windows下有效。
易用性
DK2可以在USB供电下使用,电源成为了可选项,少一条线。但HDMI+USB的两条线还是少不了,感觉还是有点烦人。另外,若要使用位置跟踪,则又多出两条线:一根USB和一根和Rift的同步线。总之,加上了位置跟踪之后,线好像更麻烦了。
那么问题来了
色彩走样
色彩走样的原因是,从屏幕上发出的不同波长的光线,会以不同的折射率通过透镜到达眼睛。微小的折射率差异,会导致在(画面中的)物体边缘处出现很明显的色彩走样,就像一台信号接收不良的老式电视机。Oculus Rift上这个问题是如此地普遍、明显,以至于很多人会在戴上后的第一时间注意到它。
对此,Oculus Rift的runtime会根据不同的瞳距(IPD)、透镜镜片和Eye Relief设置,对双眼生成的图像进行预处理,以反向补偿色彩走样。也就是说,你如果脱下Rift,直接观看屏幕上的图像,会发现接近边缘处的图像会有动态生成的色彩补偿。但很少人会在戴上Rift之前做好设备配置,所以大部分人都会或多或少地看到色彩失真现象。
所以要解决色彩走样问题,关键还是在于能否准确获取到像瞳距这类的真实世界数据。
真实世界数据获取
Oculus Rift DK2的体验好坏,有很大程度上取决于你的配置。就像上节所述,获取人眼的真实数据有助于消除色彩走样。此外,身高和位置跟踪器也会影响到人的移动和VR场景的互动。
这方面,DK2还做得很不够。这方面问题主要有:瞳距(IPD)的自测程序被不少人吐槽说不够准确、Eye Relief调整部分不能从机器中自动获取、透镜镜片的种类也不能从机器中自动获取。
眩晕
相比DK1,采用低暂留OLED和1000Hz头部跟踪器的DK2已经减轻了很多眩晕的潜在因素。现在又有了60Hz的位置跟踪器,在坐姿状态下的大部分动作都能被很快地同步到VR摄像机上,更是向消灭眩晕前进了一步。
但不可否认的是,在相当多快节奏demo中,我们还是能很快感受到眩晕。这是由于眼睛能感知到图像的剧烈位移,但人脑处理平衡相关的其他器官(前庭系统)并未感知到物理上的加速度变化,所形成的不同步造成的。而这一点我想是不能倚靠Oculus Rift自身的改进而解决的,应该从VR应用的类型入手,避开这些产生眩晕的应用特性。例如在一个VR过山车场景中,列车时常进行爬坡、俯冲、横滚(剧烈的加减速),这时用户转动头部浏览四周画面,会产生强烈的不适感。而如果改变应用场景,在一列匀速行驶的蒸汽机车顶部,或在航行在太阳系内的一艘飞船上,由于可感知的加速度几乎为0,用户转动头部看到的画面并不会和平衡感知器官产生冲突,于是大大降低眩晕感。
竖屏问题
DK2在初次接入系统时会被认成竖屏显示器,需要在显示器设置里调整。不知道为什么这样做。用户对操作系统必须熟悉,否则分辨率不对demo都运行不起来。
开发建议
若要开发游戏级应用,强烈建议完整阅读官方的Oculus Best Practice Guide和Oculus Developer Guide。这里简要列几条我认为重要的:
- 从头部动作到画面展现之间的延迟控制在20ms以内,以减少眩晕感。可使用内置的延迟测试工具测试应用的延迟。
- 使用位置跟踪的场合下,当用户接近跟踪区域边缘时,以某种方式提示用户回到跟踪区域内。
- 不要尝试修改图像变形算法、不要尝试修改头部跟踪数据、不要尝试修改位置跟踪数据。
- 人眼通过立体图像获得场景深度信息,对近处物体很敏感,一旦物体拉远则感知度立即变差。
- 尽可能地将UI融合在场景内,且最佳显示的位置是距离观察者2-3米的位置。准星一类的UI应该以聚焦对象的深度进行渲染。
- 加速/停止会引起视觉和平衡器官之间的感知冲突,如果加速/停止不是由用户发起的,则尽可能地避免上述情况。
- 避免线性垂直震动,接近0.2Hz频率的垂直震动让人最感不适。非垂直震动在接近0.3Hz的频率让人最感不适。
- Zoom,或镜头缩放效果,尽可能避免。
- 避免要求用户平移、后退、旋转的场景。
- 使用用户熟知的环境作为背景(如响应头部转动的天空盒)有助于减轻视觉冲突和增强舒适感。
- 避免使用高频纹理(如条状、精细的纹理),高频纹理会增强环境中对于运动的感知,会让人不适。改用低频纹理可以改善这一状况。
- 解决用户接触输入设备困难的问题,或者将头部运动本身作为一种输入方式。
- 使用3D音效加强沉浸感。
从网上可以获得的VR demo来看,开发者对Rift这类头戴式显示器理解还不够透彻,不少人还在用传统的思维设计应用(让我想起了早期国内iOS市场上充斥着Symbian风格app的时代)。特别是传统游戏,若不从设计上进行修改,是很难让Rift用户获得最佳体验的。
我已经有设计想法了,你准备好了吗?
下载支持Rift的demo: http://www.theriftarcade.com/ https://share.oculus.com/ (下载需注册账号)
哈囉~
謝謝你寫了這篇實用性頗高的文章.
讓我能夠更多了解dk2
但不知道您對ue4有涉獵嗎?
想問你您應用上的問題~