全篇干货!Oculus详解VR设计过程中15个问题的处理方法
近日,Oculus负责开发者联络工作的Chris Pruett(他自身也是一名游戏开发者,创建了自己的游戏工作室)发布了一篇文章,总结了过去一年中Oculus开发者在游戏设计的过程中遇到的各种问题和相应的处理办法。文章内容极其丰富,包括从入门规则到具体动作设计的大量干货,并且给出了国外开发者的许多作品作为相应技术的案例。
VR入门:如何处理相对运动错觉导致的眩晕感(vection)?
多年来,VR开发者一直在讨论相对运动错觉导致的眩晕感。这是前庭本体错觉(vestibular illusion)引起的恶心不适的感觉。这里没有必要多说,不过如果你对晕3D的生理学原理感兴趣的话,可以看看Oculus感知科学家Richard Yao的演讲《Oculus Connect: The Human Visual System and the Rift》。
最基础而言,避免相对运动错觉导致的眩晕感需要一个好的头显设备,它要能在很短的时间内形成清晰聚焦的立体图像,而且成像速度和头部运动的延迟要控制到最小。早期的VR设备在这方面做得不尽如人意,但现在的设备已经可以做到这一点。
也就是说,必要的硬件条件已经具备了,那么是否会产生眩晕感这个问题就直接落到软件的设计上。
理解相对运动错觉/眩晕感有助于奠定最基础的VR设计原则,尤其是动作设计。
VR动作设计的基础原则:
1、不要突然加速、减速或者旋转镜头。前庭系统对加速和旋转很敏感,但对匀速运动不会有什么反应。
2、不要固定镜头或者随意运动镜头。镜头的位置取决于玩家,镜头的运动应该由玩家头颈的运动来控制。
3、限制玩家次级视野或者说周边视野中的图像精度/像素流(pixel flow)。
4、决不能卡帧跳帧!你的应用必须一直保持稳定的高帧率。
VR设计并没有什么铁律,但是遵循这些基本原则是创造使人舒适的VR应用的第一步。
通用VR设计
今天VR开发者面临的最普遍的问题,就是如何让玩家在虚拟空间中移动而不引起晕眩。
在早期的VR应用中,我们发现许多开发者是这样处理这个问题的:固定镜头,完全不动。玩家要么站着不动,要么就通过传送的方式来移动。这样就避免了运动,也就不会引起不适。
但现在,一些应用已经逐渐找到了实现平滑流畅运动的同时、又能避免引起不适的方法。
匀速运动(Linear Speed)
我发现,拟真运动实现得比较好的移动系统有一个共同点,就是匀速运动。
镜头可以平滑地向前移动,但绝不会加速或者减速:它要么匀速运动,要么就不动。
管状视野(Tunnel Vision)
另一个逐渐兴起的解决办法是管状视野,也就是将视野边缘逐渐晕开,将中心视野范围缩小,减少视野边缘的视觉接收。
有些游戏在移动的时候采取这种方法,还有一些则通过特殊的场景/视角设计来实现这一点。
比如说,视角设计在潜水头盔中,或者场景设计为一个黑暗的房间,中间只有一束光。
这些做法都可以在不必过于明显地模糊视野的同时,有效减少边缘视野中的像素量。
这种系统设计的一个最生动复杂的例子是育碧的Eagle Flight.
分段转向(Snap Turns)
平滑旋转视角很容易引起相对运动错觉晕眩,为此,开发者找到了一种更加舒适的转向方式:分段转向。
玩家只要向左或向右推摇杆,视角就迅速向一侧跳转,通常是一次转30度到40度。
这种方式避免了主体接收到指示旋转的视觉信息,前庭系统也就不会作出反应。分段转向可以说是非常舒适了。
变化盲视(Change Blindness)
分段转向的做法其实是在利用一种更深层的心理模式,叫做“变化盲视”(Change Blindness,一种心理现象)。
要利用变化盲视,就是把那些很可能引起晕眩的视觉信息用黑屏或者迅速切换视角的的方式给回避掉。在认知流中,大脑会自动填补上这些空白(比如你通常意识不到自己眨眼)。这样,我们就可以利用这一能力,把某些容易引起晕眩的动作用场景切换给切掉。
举个例子,比如说有个人要打开车门坐到驾驶座上。实现这一连串动作显然会违背上面列出的VR动作设计基础原则,很可能导致晕眩。这时我们就可以直接从车门打开,切到已经在车里坐好了,中间短暂黑一下屏就行,这样就会自然多了。
头部导航(Head Steering)
我们发现有很多应用在设计第一人称运动的时候,都用玩家头部的动作来指向。在这样的系统中,玩家总是朝着他们看向的方向前进,只要转动脖子就能在整个场景里自由移动。这样一来,视觉信息和前庭系统接收到的信息之间就不会出现剧烈偏差,因为玩家的头确实在转。
Fallen Planet的AFFECTED: The Manor和OZWE的Anshar War 2都采用了这个模式,效果不错,在Gear VR上的效果尤其好。
景深错乱问题(Depth Cue Issues)
VR开发初学者常犯的一个错误就是把2D的元素直接叠加到3D场景上。
在传统二维显示的游戏中,状态条或者字幕这些悬浮UI元素很常见,开发者很容易在设计VR作品时直接把这些东西丢到游戏里飘着。
但是,如果不好好处理的话,这些悬浮元素很容易引起景深错乱。
通常来说,悬浮UI元素是无视景深和环境遮挡的(你肯定不会把UI放在前景物体的后面)。但是,在VR环境里,当玩家在立体视觉场景中看到这些悬浮元素时,会下意识地评估这些物体在场景中与自己的距离,而粗暴的叠加在此时就会引起玩家的混淆。
如果把UI元素简单地设置为叠加在场景之上,那么很可能本来按距离来说应该在某堵墙之后的东西却显示到了墙的前面。这就会导致物体的景深错乱,引起玩家的不适。
景深错乱这个问题在射击瞄准十字线、字幕和其他悬浮UI元素上特别常见。
我们目前为止看到的对这个问题最好的解决方式是,把状态栏和其他UI元素附着到场景物体之上。比如把字幕贴到墙上,把人物的生命条显示在手臂之上。
把UI元素置入到游戏世界之中,把它们当成场景中的物体而不是简单粗暴的叠加在画面之上,赋予UI元素实际的景深和现场感,这样就可以避免景深错乱问题。
空间音效(Spatialized Audio)
2016年开发中的一个关键收获就是,合理使用空间化的声音效果可以极大增强沉浸感。
空间化音效是指游戏中物体发出的声音要在听觉上展示出方位感,让它听上去就是从它在游戏里的那个方位传过来的,这能够使游戏场景整体的真实感极大地增强。
我们推荐所有的VR开发者一定要使用空间化的音效编辑工具。
并不是说所有的声音都要空间化。环境噪声、背景音乐和其他没有明显空间声源的声音不需要空间化。但是有明确物体来源的声音一定要空间化。
利用头部设备:定位追踪(Positional Tracking)设计
定位追踪,也就是使玩家通过移动佩戴了设备的头部,来改变VR中的镜头位置。这一技术是许多VR应用中的最基本的要素。在定位追踪的设计中我们也会遇到许多问题。
可追踪区域的大小(Tracked Space Size)
定位追踪需要玩家在家里划出一部分空间以供设备定位。但玩家可活动的区域大小差异很大,开发者很难确定到底要设计多大的虚拟空间。
在对Rift用户的调查中,我们得出的结论是,大部分玩家平均可以提供4平方米的可追踪空间。如果这个空间是正方形的话,那这个正方形的边长大概是2米。但实际上玩家所能提供的空间通常是长方形。也有一些玩家能提供比4平方米更大的空间,但是也有相当多的玩家能使用的空间小于4平方米。
在这种背景之下,用户使用VR的偏好会天差地别。
我们到底应该设计多大范围?是360度追踪还是180度追踪?还是说设计成坐在椅子里就能玩的模式?使用移动VR设备的用户在运动上可能更受限制,无法完成物理上的运动或者转向。
不管你最初设计产品的时候,是希望玩家站着玩、还是坐着玩,玩家实际上只会选择他们觉得最舒服最合适的方式来玩。
你的作品能够适应越多的使用场景,你就能得到更广的用户群体。
多边形刚体内部的处理(Polygon Clipping)
我们没办法阻止玩家在虚拟世界中把头伸到墙里去,但如果在镜头与墙交叉的时候直接切断显示的话,会导致很不舒适的体验。
通常的做法是在探知到玩家头要和虚拟的墙撞上的时候就开始逐渐减暗画面,头进入墙越深画面就越暗,到能够穿透物体的时候,屏幕就彻底暗下来。
这么设计的好处是,玩家很快就会意识到,如果随意穿透虚拟场景中的物体,就会导致画面丢失,从而玩家就会自我约束。
Creative Assembly的Alien Isolation是最早一批使用这个处理方式的作品之一。
镜头基准选择(Camera Origin Choices)
在开发VR应用的时候,我们可以选择把镜头基准设置为玩家所处的地面,或者设置为玩家眼睛的高度,这两种做法分别称为地面基准或者眼高基准。两种选择都各有自身的优劣。
把地面作为基准可以使玩家在虚拟世界中的视角高度与现实世界中的视角高度一致,这有利于提高沉浸感,因为这是玩家习惯的视角。
但这样一来,你就无法控制游戏角色在虚拟世界中的身高。如果你要创造角色的虚拟身体,你得让这具身体能够随玩家的高度变化而适当缩放,以匹配玩家的身高。
如果把眼睛的高度作为镜头基准,那么开发者就可以控制玩家在虚拟世界中的视角高度。这对于生成特殊高度的游戏角色很有用,而且还可以给玩家提供不同于现实生活体验的视角。比如说,你可以向玩家展示,在孩子眼里世界是怎样的。(笔者认为,这种做法的要点不仅在于模拟不同身高的人类,更有趣的是可以模拟更多样的角色设置,比如矮人、巨怪、动物或者会飞的生物——鸟类、精灵、天使,等等。)
眼高基准也常用在以坐姿体验的游戏中,EVE: Valkyrie就是一个绝佳的例子。
但是,使用眼高基准的问题在于,开发者无法得知物理世界中真实地面的位置,这会使得类似卧倒、蹲踞和从地面捡起东西这一类的互动设计变得更加复杂。
虚拟人物(Virtual Humans)
我们可以利用定位追踪得到的数据,使NPC更加栩栩如生。关于如何实现这一系统的细节信息,请参看我们之前的文章《开发者视角下的NPC设计:以Dead and Buried为例》(笔者注:这篇文章我们后续会安排编发,请关注我们网站或公众号)
在设计NPC的时候,一定要加上最基本的头部和眼部追踪的动作,NPC要对玩家位置的变化有所反应。在VR里,NPC要是静止不动,看上去就会像个塑料模特一样,很尴尬。
利用手部控制器:控制器追踪(Tracked Controllers)设计
去年VR界的一件大事是,像Oculus Touch这样六度自由(上下、前后、左右的移动和旋转)控制器开始出现。新控制器带来了一系列有趣的设计挑战,而开发者们也创造出了丰富的处理方法。
手部同步(Hand Registration)
Oculus Touch让我们能够在VR中得到一双手,不仅仅是说你可以抓起东西,而是你真的可以拥有一双手。
处理得好的话,这双虚拟的手能够让玩家在虚拟世界中如臂使指,毕竟我们都知道怎么使用自己的手。但如果处理得不好,这双手很可能会导致手的“恐怖谷效应”:过于逼真但又离真实的手还有距离,这样的手可能反而引起玩家的不适。
要设计出合适的虚拟双手,需要做到优秀的手部同步。
手部同步的效果是,大脑在看到这双虚拟的手时,能够很快把它们当成是玩家真实的手的替代。要达到这一点,需要满足以下要求:
虚拟手的位置和动向,必须与真实手的位置和动向高度一致。
要做到这一点,有一个方法:先做一个控制器的模型,然后戴上头显,从头显下面的缝隙中看着真实的控制器,把控制器缓缓向上移动,对比真实控制器和控制器模型的移动,保证一致。如果完成得好的话,你应该可以看到控制器从现实世界中无缝进入到虚拟场景。做到这一点之后,下一步就就是在控制器模型上做出手的模型,然后把控制器模型给隐藏掉。
测试同步的一个简单方法是“手背测试”:在VR场景中用一手食指缓缓划过另一只手的手背,看你感受到的触觉位置和在VR场景中看到的虚拟手的图像动作位置是否匹配。
手部设计(Hand Design)
不推荐设计有血有肉、过于拟真的手,做出来可能会不像活人的肢体,导致不适。(笔者注:参考上文提到的“恐怖谷效应”,可以查一下这个效应的详细说明。)
可以设计一双比较大的手,或者穿戴在手部的装备,大脑会比较好接受,人们会觉得自己的手在那些装备的里面。太小的手就不合适了。
Oculus使用的手部设计是一双优雅的半透明手,可以很好地表现各种人的手,无论他们是什么性别、年龄、种族。
手与物体的干涉(Hand-Object Intersection)
就和头部的定位追踪一样,你也无法阻止玩家用虚拟手伸到各种虚拟物品之中。如果用前面那种处理头部与物体干涉的方法来处理的话,会导致玩家觉得手部追踪断开了,不是很合适。而Oculus使用半透明手的原因之一就是,这样一双手即使穿过了什么物体,看上去也还是很可以接受的。
在这种条件下,一些开发者做出了非常精彩的手部设计。
Bossa Sudio的Surgeon Simulator设计的虚拟手是模拟真实人手的造型,但当玩家把手伸到物体内部的时候,手就会变成透明的骨骼状。这样一来,玩家不会觉得手部追踪断线,而外观的变化又提示玩家在这种状态下,手的动作无法影响到物体。这是开发者用创新来解决VR设计特有问题的一个绝佳案例。
前臂(Forearms)
本体感(Proprioception)是大脑对自身肢体在物理空间位置的内在感知,这种感知即使在看不到肢体的时候也仍然存在(笔者注:比如你闭着眼睛也能准确地摸到自己的耳朵。有人把这种感知能力称作五感之外的第六种感觉)。
这套感知系统非常精确,使得模拟前臂和肘部的虚拟肢体非常困难:你看到了自己的虚拟肢体,但你感觉不到它们(因为没有触觉反馈),本体感也无法定位它们的位置。
通常开发者会以控制器的位置为基点制作反向动力学(IK,Inverse Kinematics,先确定子骨骼位置,反向推导出其所在骨骼链上n级父骨骼位置,从而确定整条骨骼链的方法)肢体,但是这常常会导致虚拟肢体位置和实际肢体位置之间的严重偏差,而本体感可以感知到这一偏差,导致不协调感。
现在也有作品已经做出了可信度很高的前臂和肘部(参见Lone Echo, https://www.loneecho.com/ )。但这个设计问题仍然需要我们高度关注,投入足够的耐心来处理。做得不好的手臂比没有手臂更糟糕。
阻力和扭矩(Resistance and Torque)
虽然设备的进步已经使我们拥有了虚拟手,但现在还是没办法模拟出操作重物时手部感受到的阻力和力矩。像搬起大石、推动巨大的控制杆这样的动作,阻力在其中起到了很重要的作用,而我们现在还无法把这些互动做得足够可信。在操作重物的时候,这些重物就好像是泡沫塑料做的一样。
不过,从另一方面来考虑,那些不需要很大阻力来实现的动作我们现在已经做得很好了。然后,我们在模拟和控制器形状相似的物品(比如枪)互动方面也做得很自然。
所以,在设计手部操作的时候,一定要考虑好让玩家操作什么样的物品,来避免无法模拟阻力而产生的不可信感。(笔者注:我认为作者在这里的意思是,既然没办法模拟好对重物的操作,那么在设计交互的时候,就尽量不要设计操作重物的环节;应该扬长避短,多使用现在已经能够模拟得比较好的动作。)
另外,要小心处理那些需要双手的操作。比如举起很重的箱子,或者使用双手武器。这些动作在VR里可能会感觉很别扭,因为玩家没办法在空空的两手之间感受到应有的触感和阻力,以及双手操作带来的限制。
捡/拿东西(Picking Things Up)
在VR里要捡起或者拿起一个什么东西,最好的方式就是按他们应该持有的姿势来捡/拿。
没有人会捏着枪管捡起一把枪。当玩家打算捡起一个有明显固定握持姿势的物品,我们就让物品直接以正确的姿势出现在玩家手里。玩家用拿枪的姿势把手伸过去,想要拿枪,然后枪就在虚拟手里出现了,用正确的姿势握好,该是什么样就是什么样。
如果是没有明确握持姿势的物品(比如足球),那就在捡持触发的时候让物品出现在玩家手里。在这种情况下,虚拟手触碰到物品的位置和方向比较随意,但只要能拿好不掉,这个效果还是可信的。这种情况下,就不要改变或者修正物品在手中的姿态,拿的时候怎么拿到的、碰的哪儿,就那么拿着。
如果手持的东西,手拿它的姿势还要变化,这就比较麻烦。
举个例子,早先Oculus测试Touch的时候发现乒乓球拍这东西很难搞,我们接球的时候,总要调整一下球拍在手里的姿势。这种角度调整很难靠追踪控制器的位置变化来实现。
Tripwire’s的Killing Floor: Incursion想出了一个超级简单但是非常有效的解决办法。他们的情境是,玩家手里有一把刀,握着刀柄的时候用来劈砍,捏着刀尖的时候用来投掷。而他们设计的改变姿势的方式是:要改变拿刀的姿势,玩家只需要按一下控制器上的按键。
这样,不需要靠什么手势识别或者复杂的动作就能实现简单而可靠的操作。
投掷(Throwing)
要靠追踪控制器来实现稳定的投掷动作比看上去要难。
早先我们测试手部动作的时候,是通过追踪手部速度的变化,得出被投掷的物体在离开手的瞬间获得的平均速度。要得到可信的表现,需要重复模拟很多次,有时还需要一点小花招(比如在有些情境下,我们减小了重力对投掷物的影响)。
这里主要的收获是不同的物品需要表现出不同的投掷方式,扔飞盘和扔纸飞机的动态表现是完全不同的,要使得投掷不同物品的动作都足够可信,需要建立起完备的以物品种类为单位的物理规则来处理投掷动作。
目前在这一点上做得最好的是Owlchemy Labs的 Job Simulator,给几乎每一种物品都实现了各不相同的物理表现。
总结:
在过去的十二个月中,我们从VR开发者那里学到了很多,但是这里说到的各种方法仅仅只是最初级的内容。VR开发最令人兴奋的一点就是它的设计语言很大程度上还是空白,留待我们来创造。
今天,开发者们在这片新天地中探索、追寻,为全新的设计挑战创造解决方法,并且在这个过程中,为未来的VR设计书写规则。
我们要感谢开发者,从他们身上我们已经学到了很多。但前路漫漫,我们仍需上下求索。