查看原文
其他

如何实现VR的旁观者系统

2017-12-21 Unity官方 Unity官方平台


对于一段有趣的游戏体验,玩家会希望炫耀、记录和分享。对于VR,通过一个单一的矩形屏幕观看玩家所见并不能传达全部的感觉。这意味着,旁观者通常会觉得“观看玩家视角”的体验太过无趣。如何解决这个问题呢?Unity的工程师Tom Baird将会在本文中给出答案。

 

我希望制作一个简单的初始系统,展示如何设置旁观者摄像机,为那些不在VR体验之中的观众增加更多的乐趣。幸运的是,已有一些发布的示例,成功设计了不错的旁观者视图。本项目的目标是基于那些设计构建一个旁观者系统,紧凑便携,可轻松集成到你自己的项目中。

 

源代码下载

 你可以访问Github下载本文的项目源代码《Spectating VR》。

 地址:https://github.com/Unity-Technologies/VR-Spectator-Sample

 

 注意:该项目需要Unity 2017.2或更高版本。

 

新建一个基本的旁观者摄像机

首先我要做的是新建一个旁观者(Spectator)专用的摄像机。我创建了第二个摄像机,并将它面对我的第一个最初的摄像机。然后在Camera Settings中,将Target Eye 设置为 None (Main Display) 。



在编辑器中运行项目,Unity的游戏视图已经与VR头盔中的显示不同。就是那么简单! 


制作一个玩家

如果将那个旁观者摄像机指向自己,并点击运行,将不会看到任何东西!我需要在这个世界中创建一个代表自己的化身。我使用Unity内置的形状创建了不错的头部和手部模型,将它们连接到一起作为头和手。我希望它们能跟真实世界中的跟踪设备一起移动。在Unity 2017.2中,新组件Tracked Pose Driver可以将这些链接到一起。将它添加到一个游戏对象上,设置希望使用头盔还是控制器,那个游戏对象就会成为你指定VR硬件在游戏内的代理对象,实时更新。这使得快速创建一套玩家VR装配变得十分轻松方便。


 

添加摄像机角度

现在我想要更多的游戏内角度。我所需要的只是一些世界位置,以及叫做Spectator Controller的一小段脚本,来遍历这些位置。这个脚本的核心是跟踪摄像机当前的变换。


在示例中,我们跟踪的是m_CurrentTransform。我希望摄像机可以在虚拟现实玩家视角和旁观者视角间切换,所以我把它和VR控制器上的触摸板/摇杆点击,以及键盘上的空格键连接到了一起。这个Spectator Contr 45 32779 45 14988 0 0 1404 0 0:00:23 0:00:10 0:00:13 2927oller的第二个职责是启用和禁用当前活动摄像机的颜色和取景器。我将创建一个名为CameraAttachPoint的MonoBehaviour,用于处理那些特定于我的高科技摄像机和取景器的元素。


游戏内旁观者摄像机预览

接下来,我希望能在VR中看到旁观者的视角。只有实时看到自己的样子,才能知道自己的姿势是否够棒。所以我需要一个渲染目标以及一个额外的摄像机。


如果我将旁观者摄像机渲染到一个渲染目标,那随后就可以将输出同时重定向到世界中的纹理,以及对应Main Display的摄像机上。这个部分只需要再多一点资源,它们就在Assets/RenderTarget文件夹中。


我还需要第三个摄像机。我现在有三个摄像机:VR摄像机、旁观者摄像机,以及旁观者显示摄像机,这个用于获取旁观者摄像机的渲染目标并显示给用户。我这里将选择使用一个Canvas UI对象,以便能在随后添加一个对VR玩家和任何旁观者渲染对象不可见的额外UI。

 

与摄像机交互

现在我可以看到自己跳舞了,我不想一个个的遍历预设角度,我想要自己进行设置。我想要能够抓住那架摄像机,好好地秀自己一把。为此,我需要构建一个叫做Grabber的小组件。这是一个简单的系统:当按下触发键时,会检查在一个特定图层上某个半径内的所有物理对象。在触发键按住的同时,会持续更新任何被发现的物体的位置和旋转,以匹配抓取手的位置。很简单,但能达成目的。

 

关于移动摄像机的一个重要提示:将摄像机像一个小布偶一样到处乱扔,可能会让旁观者感到头晕不适。如果没有强大的内耳,你将很难适应不规则的运动。因此所有的摄像机运动(Grabber和Spectator Controller的行为)都包含了平滑的设置。这些平滑的值,从0(没有平滑)到1(永久停留在原始位置),将在起始和理想的摄像机位置和方向之间使用线性插值来平滑任何突然的运动。0.1基本上已经足够,但这是一个个人偏好,并和实际环境相关,所以可以根据需要进行调整。

 

后续步骤及注意事项

现在已把所有东西都打包妥当。我有一系列可以切换的旁观者摄像机,你可以对它们进行抓取、摆拍,并呈现在虚拟现实的世界里。我仍然需要一种方法来确保用户知道他们可以操纵什么,而不会干扰旁观者的观看。由于我已经为旁观者和玩家配备了不同的摄像机,所以使用摄像机层遮罩来创建一个只有玩家的图层,并在那里放置指令是一件很简单的事。

 

值得注意的是,所有这些摄像机对性能会产生影响。我们把整个世界绘制了二次,然后在第三次中重新渲染了旁观者的视图。在不使用的情况下禁用两个旁观者摄像机将是一个有用的补充。要做到那一点,可以关闭旁观者摄像机和旁观者视图摄像机,这样系统将会回退到最初“玩家视角渲染”的旁观模式。

 

就谈到这里,剩下的留给你们。现在已有一个可抓取的,可移动旁观者摄像机,它有自己的游戏内取景器和两个分别对应玩家和旁观者的独立的UI。把它拿出来,替换资源,改变摄像机的切换行为和UI,把这个项目变成你自己的。


我已尽力让它保持轻量,易于分拆,环境和可视化的资源很容易被排除,并且只有最少限度的自定义脚本。这将是一个开始了解Cinemachine的好地方,选择合适的角度,保持良好的动作视图。心灵手巧的开发者甚至可以为旁观者UI和输入添加更多的东西,并设计出一种新的不对称风格的游戏方式,使旁观者可以成为真正的参与者。


小结

 你觉得一个好的虚拟现实旁观者系统应该是什么样的呢?欢迎告诉我们,更多VR相关技术信息,请访问Unity官方社区(Unitychina.cn)!

 

推荐阅读


官方活动

  • 上海大师课程

    在2018年1月14日,Unity将在上海举办全年首次Unity大师课程。如果您想开发出一款适用于房间规模(Room Scale),科技感十足的的VR游戏,赶紧报名吧!https://www.bagevent.com/event/1031633


  • Neon全球挑战赛

    为期1个半月,由Unity举办的《Neon挑战赛》全球开启,寻找最具创意的你!感兴趣的朋友们请访问Unity Connect了解详情。
    地址:https://connect.unity.com/challenges/neon


  • Unity机器学习挑战赛

    为了激发更多开发者使用ML-Agents制作创造性的机器学习用例的灵感,Unity将推出首个Unity机器学习社区挑战赛。对机器学习感兴趣的开发者一定不能错过!

    地址: https://connect.unity.com/challenges/ml-agents-1



点击“阅读原文”访问Unity官方社区!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存