我要发帖 回复

管理员

177

主题

720

积分

0

专家分

兴趣点(最多三项):

Unity

私信
发表时间 : 2018-6-20 12:24:27 | 浏览 : 213    评论 : 0
      在本文中,GameDev.tc的萨姆·帕图兹(Sam Pattuzzi)将与我们探索一系成功的VR移动机制。对于每种方法,他都将解释为何其有效,何时应使用,什么地方不适合,以及提供用于“研究”的部分示例游戏。
      当你为一款游戏构思出优秀的点子,并希望将其带到VR中时,你首先遇到的挑战之一是移动,或者说是移动机制。玩家如何移动对大多数游戏而言都是基本要素,而且是你开发过程中的首要设计考量之一。VR中的移动机制与众不同,如果正确地实施。你将能完全改变用户的体验。


游玩空间移动

这是一种非常普遍的移动方式,你甚至不会将其看作是一种移动机制。但对于我们将要讨论的内容而言,在游玩空间中自由移动可能是最为自然的移动种类。

   如何沉浸用户?

很简单,我们令大脑认可眼睛所看的虚拟场景,然后我们在真实世界的运动能够同步至虚拟空间,一一对应。这意味着我们的本体感和前庭系统将认可当前的状态,它们的感知将与眼睛所看匹配。

   局限

尽管游玩空间移动很棒,但同样存在着相当的限制,这意味着我们通常需要用其他移动机制进行补充。

受限于游玩空间大小

只适合人类范畴的移动,不适合超人范畴的移动。

   实施技巧

第一个挑战是,令玩家对象(Unreal中的actor)追踪camera的位置。

通常来说,头显移动通过camera相对于其父对象的移动而在引擎中再现。这意味着如果你有一个camera来作为玩家对象的子组件(一种非常常见的设置),你需要采用一定的技巧来移动玩家的游戏空间。

我们假设以下这个设置(我将使用Unreal引擎作为示例,但这个概念同时适用于其他游戏引擎):我们假设拥有作为玩家根的Capsule碰撞体。在那之下,我们拥有一个VRRoot场景组。在那之下,我们有Camera。所以我们就有了:




当我们在游玩空间移动时,Camera将发生什么事情呢?

你会注意到camera(黑色头显设备)相对于VRRoot和玩家中心都有偏移。知道玩家对象的实际位置没有好处。

当camera在游戏区周围移动时,我们希望capsule紧随其后。但我们无法将capsule制作成camera的一个子组件,原因有二:

Unreal中,capsule必须是Character的根组件。
我们不想上下移动capsule,只想沿水平面移动。
所以我们可以做的是,将整个玩家移动到camera的位置(下面的紫色箭头)。现在,这将使camera更远离玩家中心,因为它是通过VRRoot进行相对定位。所以我们需要更新VRRoot的局部变换,从而令camera保持在同一个地方(下面的蓝色箭头)。

这种方法可以轻松结合其他的移动方式。


传送




传送已经成为最常见的移动机制之一,因为它灵活,可以与游玩空间移动相结合。但是,它同样存在非常严重的缺点。

以防你不知道何谓传送,传送涉及指向你想要去的地方(通常是利用激光或标记),然后按下按钮并在非常短的时间内达到这个位置。


   如何沉浸用户?

在传送过程中,屏幕常常会淡出然后返回。这在移动发生时抑制了视觉系统,意味着大脑将无法否认它所看到的一切。

   局限

沉浸感不是很够
不逼真
移动时无法控制,而这可能是多人游戏中的一个问题。

   实施技巧

实施基本的机制非常简单:

  • 建立从控制器到地面的追踪。
  • 在那里渲染某种标记(我使用一个带有渐变材质的圆柱体)。
  • 按下扳机键后,淡出camera并保存当前位置。
  • 将玩家actor移到新位置。
  • camera淡入。
  • 如果你想创建一个抛物线路径,你可以在Unreal中使用以下组合:[UGameplayStatics :: PredictProjectilePath(),[USplineComponent]和[USplineMeshComponent])。



原地慢跑



原地慢跑可以有多种形式,但主要思想是用原地慢跑的运动量来影响移动幅度。这可以带来一种非常身临其境的移动方式。

   如何沉浸用户?

与传送不同,我们不会在运动过程中压制视觉系统。相反,我们试图通过上下跳动欺骗本体感和前庭系统。

请记住,前庭系统基本上是一个加速度计。就像加速度计一样,当它经历大量移动时,它无法准确地追踪位置。我们可以联想小孩子常玩的“贴驴尾巴游戏”(用纱巾捂住眼睛,然后给黑板上的驴贴上尾巴)。可行的原因是大量的运动混淆了我们的位置感。

   示例

我见过的最佳示例之一是“Freedom Locomotion VR”这个免费的技术演示作品。系统将根据手臂移动量和头部摆动量来检测运动程度。在初始校准之后,它能够检测你是否正在移动,以及速度有多快。

然后再配合以摇杆或触控板,用户将能指明运动方向。

这种方法的优点是,它可以释放双手来抓取对象或与环境进行交互。你不需要看着运动的方向,而且可以帮助你消耗卡路里。

   局限

虽然这是一个很棒的系统,但这主要是适合于奔跑的模拟。而且,这不适合奔跑模拟。

   实施技巧

一个简单的实施方法是,将头部摆动与摇杆的输入方向和控制器的方向相结合。除了头部运动检测之外,这非常简单。

检测头部运动的一种简单方法是追踪上下维度的速度。如果这样做的噪点太多,一个简单的指数移动平均值应该足以带来流畅的信号。当然,随着越来越复杂的技术出现,只有天空才是极限。

   驾驶舱模拟




我们在上面讨论了人类运动,但对于需要驾驶机器的游戏呢?这种游戏非常适合就座式开玩,因为在现实世界中你就是需要这样做。通常情况下,你会坐在控制面板的前方,然后周围是不会移动的驾驶舱。这时,外面的世界将响应你的控制。

这非常适合飞行模拟体验,竞速游戏,甚至是机甲对战。

   如何沉浸用户?

这个移动机制与其他方式稍有不同。它不会欺骗任何人体系统,而是试图给视觉系统一些可以锁定的参考物。

   局限

一个固定的驾驶舱可以大大减少感官之间的分歧。但如果发生极端加速,感官分歧将再次出现。最后,这只适用于驾驶舱游戏。

   示例

Lunar Flight
Elite Dangerous
Microsoft Flight Simulator X
Project CARS 2


Blinkers(抑制外围视场)




   如何沉浸用户?

外围视觉对运动最为敏感,所以如果我们用这种方式来抑制外围视觉感知,我们应该可以减轻运动不适的程度。它也很像上面描述的驾驶舱方法,不同点只是没有将游戏限制在驾驶舱模拟之中。

此外,附近的任何运动都会产生更强烈的运动信号,因此如果你靠近快速移动的对象,屏幕上的这个区域可能也需要进行遮挡。

   局限

部分用户不喜欢减少视场。尽管可以巧妙地实施,但当你专注于正要前往的地方时,视场减少将非常明显。然而,朝注视点以外的任何方向移动都会导致更多的视场遮挡。事实上,根据Blinker的实施强度,这有可能导致完全的黑视。

   实施技巧

在Unreal中,我使用了后期处理材质来实现这个效果。你必须将材质域设置为“Post Process(后期处理)”。





攀爬



尽管这是非常特定的移动机制,攀爬对许多人而言是十分自然的移动方式。

   如何沉浸用户?

其有效是出于数个原因:

移动不是非常快。
控制器可以作为固定的参考点。
手臂运动可以欺骗本体感系统。

   局限

这可以用于攀爬之外的用例,例如潜行游戏。不过,这永远都不会成为普遍性解决方案。

   实施技巧

方法是追踪手部开始抓取的位置。一旦获取了这个位置,每一帧都需要更新用户的位置,这样手部才能位置在相同的位置。基本上是:FVector HandControllerDelta = GetActorLocation() – ClimbingStartLocation;
GetAttachParentActor()->AddActorWorldOffset(-HandControllerDelta);


拓展延伸

很有可能的情况是,没有单单一项解决方案可以满足你的游戏。你通常需要结合多种方法,甚至是发明一整套全新的机制。理解什么是可行的解决方案,以及为什么可以为你提供一个良好的基准来继续探索新的方案。

在这篇博文中,我只是简要探讨了这些移动机制的实施细节。但是,我们在 Unreal VR course on Udemy 中详细进行了介绍。

为什么是Unreal引擎呢?尽管你可以选择其他不同的引擎来开发VR体验,但我认为Ureal提供了优秀的支持,而且你允许你用C++进行编程,从而最大化利用硬件的性能。

许多设计师或许会对C++感到害怕。如果你对编程没有信心,Unreal同时提供了视觉语言Blueprint,希望帮助你更轻松地入门C++的基础。



     想学习VR开发吗?我们有积累8年的资源库、教程库和交流社区,点击进入。

最近VR访客

UE4   |   虚幻引擎   |   Unity VR    |    Hololens

手机版|VR开发网 ( 津ICP备18009691号 )|网站地图 统计 网安备12019202000257

GMT+8, 2018-12-12 04:09 PM

返回顶部