/ Roadtovr / 0浏览

捕捉虚拟世界:一种拍摄360度虚拟照片和视频的方法

在这个技术深入探讨中,“eVRydayVR”的Coetzee详细探讨了阻止我们与他人分享我们喜爱的VR体验的技术挑战以及可用于克服这些挑战的解决方案。

D是一名VR软件开发人员,也是eVRydayVR YouTube频道的创始人,展示新兴VR内容的背景和游玩过程、开发教程以及技术主题的简介。

D在微软担任软件开发人员工作了5年,在加州大学伯克利分校担任了4年的研究助理/教学助理,并拥有乔治亚理工学院计算机科学硕士学位。D目前在Jaunt VR担任全职软件开发人员,该公司专注于VR中的实时360度视频。

分享虚拟世界的体验是互联网文化的基本组成部分。通过像Imgur和YouTube这样的网站上的截图和视频,以及使用Fraps、OBS和Shadowplay等工具进行捕捉,我们让他人可以以与我们在游玩时在显示器上看到的完全相同的方式看到我们的创作、反应、策略和与其他玩家的共享时刻。即使在无法运行原始应用程序的计算机上,也可以查看内容视频,无需安装任何内容。

虚拟现实使这变得更加复杂:如果你在你的VR头显上记录内容的视频,然后只是在其他人的头显上播放,就会出现许多问题。首先,头显之间(甚至是用户设置)的差异可能导致畸变、伪影以及视点聚焦方面的问题。其次,由于原始玩家控制头部运动,而不是观看内容的人,观看者会感觉到他们的头部被强制转动来查看场景周围,这种感觉通常会引起VR晕眩。可以通过在显示器上观看录制的内容来规避这个问题,但那样没有乐趣 – 你真正想要的是其他人能够以与你在游戏过程中相同的方式在VR中体验这些虚拟世界。

这就是360度捕捉的用途:通过捕捉你周围的完整环境,任何拥有VR头显的人都可以完全沉浸在记录的环境中,就像你一样,不管他们使用什么硬件,从顶级电脑头显到谷歌Cardboard。只需要极少的处理能力,这对移动VR非常适用。他们对自己的头部运动有完全掌控,并保持相同强烈的尺度和距离感。

然而,在记录和与其他VR用户分享高质量360内容之前,还有一些技术挑战需要解决,以使其像录制和分享视频一样简单。本文描述了当今可用的解决方案,它们的工作原理和局限性,以及正在进行研究的问题。

我们今天可以做些什么
如果你是在Unity中创建应用程序的VR开发人员,Unity是最受欢迎的VR应用程序引擎,我在Unity资产商店上创建了一个免费脚本,名为360全景捕获。只需将此脚本拖放到应用程序中的对象上,您就可以激活一个热键,从玩家的视角拍摄一个360度快照,并将其保存为图像文件,如下图所示的全景图像。然后,可以使用各种平台上的360度全景查看工具查看此图像,并上传到VRCHIVE等360度全景共享网站 – 访问下面的图像在VRCHIVE上,在鼠标或移动设备上进行360度探索。

360全景捕获脚本可以捕捉单视图全景(两只眼睛看到相同的图像)和立体视图全景,获得类似于3D电影的效果(如果您有WebVR兼容的浏览器,可以查看上述全景的立体视图版本)。某些VR应用程序,如社交VR世界VR Chat,已将此功能提供给所有用户。

它还可以用于制作360视频,可以上传到YouTube,如下面的视频所示。大多数Android手机可以使用YouTube的Android应用程序在Google Cardboard上观看,并且在PC上,Virtual Desktop可以下载并在Rift上观看360度YouTube视频。

续 第2页…

它是如何工作的?
在Unity中,360度捕捉的基本概念与现实世界中的360度捕捉相似:我们指向(虚拟)相机的多个不同方向,捕捉场景的不同部分,然后将结果合并成一个完整的360度图像。单眼捕捉非常简单:我们只需要将相机指向上、下、左、右、前、后六个方向(立方体贴图格式)。相机在所有六个方向上的位置是完全相同的。下图显示了使用位于盒子内部的相机捕捉一个方格盒子的情况。

在单个图像中表示一个完整的360度环境面临与试图在平面地图上表示地球表面相同的挑战。大多数工具今天使用的投影是等经纬投影。在等经纬投影中,垂直(y)位置表示纬度,而水平(x)位置表示经度。此投影通常被地图制作者避免使用,因为它会扭曲极地的区域,使它们看起来比实际更大;但是对于360度全景图而言,它是很方便的,因为通过简单地将图像投影到大球体的内部并将观察者放置在球体内部,就可以创建一个高效的查看器来支持该格式。
CC-BY-SA/Strebe
请注意,360度捕捉必须具有非常高的分辨率,因为在任何给定时间,您只会“放大”视频的一小部分(通常为10-20%)。为了大致匹配Oculus Rift或HTC Vive的角分辨率,360度捕捉必须至少为4K像素宽。

从捕捉的相机视图转换为最终的等经纬图像需要进行投影操作,将源图像的像素复制到目标图像的正确位置。这可以通过计算着色器在GPU上快速完成;完成后,将最终图像传输到CPU进行保存。
请注意,在某些情况下,这种简单的方法可能会产生视觉伪影。例如,如果应用了一个使视图边缘变暗的晕影滤镜,这将导致六个视图的边缘变暗,使正方体的边缘在视觉上明显可见,如下图所示。为了再现这样的效果,需要在捕捉期间将其去除,然后在查看全景图时再添加回来。会对其产生问题的屏幕空间效果通常会出现在天空和水效果中。其他屏幕空间效果,如泛光或抗锯齿,会均匀地影响整个视图,因此不会产生明显的伪影。

续 第3页…

捕捉立体全景
单眼全景图(即两只眼睛看到相同视图)很容易捕捉,并且通常可以可靠地再现原始视图而没有明显的伪影。除了不支持任何形式的视差或位置跟踪外,它们是正确的。立体全景,即左眼和右眼看到不同图像的全景图,是一种不同的问题:目前没有已知的既正确又实用的复制方法。
进行立体全景的一种策略是在一个球体的表面放置大量相机,比如在一个沙滩球大小的球体上放置几百个相机,并存储和压缩所有这些捕捉的相机视图。在查看期间,可以使用光场技术合成球体内的任何方向和位置的任意相机视图。这使我们能够生成正确的立体结果,无论视角如何,并且甚至支持有限的位置跟踪,但代价巨大:即使进行压缩,一个典型的全分辨率光场图像的大小可能超过500MB。而且这只是一个单独的图像;视频是不可能的。存在更有效的压缩技术,但在实时解压缩方面仍然存在困难。
因此,与其试图完全正确,我们采用了一种基于上方使用的是等矩投影的单目图像。与其只有一幅图像不同,我们有两幅图像:左眼视图(在上方)和右眼视图(在下方),如下所示。观察者仍然高效且易于实施:两个视图都作为纹理应用于包围观察者的大球体上,左眼只看到左视图纹理,右眼只看到右视图纹理(使用摄像机图层)。

最简单的生成此图像的方法是在固定位置放置两个摄像机,这两个摄像机之间的距离等于一个人的眼睛平均距离,然后为每个摄像机捕捉一个单目的360度全景图像。这将在观察者正前方区域得到大致正确的结果,但当向后看时,左右会颠倒,而且在其他任何方向看时,结果也会不正确,如下图所示。

修复这个问题的最简单和最常见的方法是将等矩图像划分为细的垂直条,并分别渲染它们。每个条带都是左右眼直接朝向该条带渲染的,这大大提高了立体效果。

只要条带足够细且足够多,它们之间的接缝通常不会可见。由于条带具有有限的水平视场,它们也可以高效地渲染。
然而,虽然此方案在左右转头时效果很好,但在上下看时会产生奇怪的问题。如果直视向上,您会同时看到所有条带,它们在极点汇聚为一点,但只有一个是正确的。其中一些是完全颠倒的。这通常会表现为在朝向顶部和底部极点时无法适当地收敛。

在基于光线追踪的引擎中,例如OTOY的Octane,它们通过根据上下注视的距离来调整眼睛之间的距离(IPD)来成功缓解了此问题。在赤道(不向上或向下看)时,IPD处于最大值。在极点处,IPD减少到零,消除了任何立体效果。在中间则有中间的值和减少的立体效果。因为在直视向上或向下时立体效果几乎不存在,立体的错误虽然仍然存在,但视觉上的冲击要小得多。

类似的技术是否可以在Unity等实时引擎中使用?答案是肯定的,而且通过借鉴光场渲染和Google Jump相机的思想,这种方法也是有效的。我们创建一个直径等于眼睛之间距离的小圆,然后在周边放置大量的虚拟相机(至少8个,通常是100个)。每个虚拟相机具有巨大的视场:水平和垂直方向均超过180度。由于Unity无法以如此大的视场渲染,每个虚拟相机由一个子数组代表,每个子数组包含约90度视场的四个相机。这四个相机角度分别向左、向右、向上和向下旋转45度,并且共同覆盖我们所需的整个视场。

接下来,输出的每个像素与两个角度相关联,一个是偏航或经度(我们必须左/右转多远才能看到该点),另一个是俯仰或纬度(我们必须向上/向下看多远才能看到该点)。偏航用于将眼睛旋转到都直接朝向该点,就像使用垂直切片方法一样。但是现在,也使用俯仰来调整眼睛之间的距离。因此,眼睛可以位于圆的周边,也可以位于圆的内部。

为了渲染一个像素,两只眼睛分别向圆投射射线。当它们击中圆时,它们击中的位置位于两个虚拟相机之间。然后,我们从这两个虚拟相机继续投射射线,以确定每个视点对应的正确颜色。最后,根据到每个相机的距离混合这两个得到的颜色。视野(每个摄像机视图实际上是使用四个视野为108度的摄像机进行捕捉的)。有三种情况:

当俯仰角为零(不向上或向下看时),眼睛位于圆的周围,它们在圆上的位置决定使用哪些摄像机。在图中,左眼使用摄像机8,右眼使用摄像机3;在不同偏航/经度值下,会使用不同的摄像机。光线相对于摄像机是横向的,这是可以的,因为摄像机的视野仍然足够宽广以捕捉它们。
当俯仰角为中间值时,眼睛位于圆内。在图中,左眼看到的像素是通过组合摄像机9的视图的像素和摄像机10的视图的像素形成的(摄像机10的像素值影响更大,因为左眼的光线击中的位置比摄像机9更接近摄像机10)。右眼同理。
当向上或向下直视时,眼睛都位于圆心。它们发出相同的光线并接收相同的像素颜色。

尽管这种方案能有效减少在极点附近的伪影,但如果使用的摄像机不足够多,特别是存在非常接近的物体时,仍可能产生伪影。这些物体看起来会模糊或者重影。这是因为摄像机的光线击中物体的位置与眼睛的光线击中位置略有不同。幸运的是,在实时渲染环境中,渲染大量的摄像机视图是很快的。由于没有足够的内存一次性存储所有这些视图,通常只会同时渲染几个(通常是3个广角虚拟摄像机),然后使用它们来渲染部分最终视图。

如果向极点方向移动时IPD缩小,会有一些微妙之处。简单的线性函数会在赤道附近产生可见的“折痕”。一个好的IPD缩放函数应该在赤道上是连续的,同时在所有的俯仰值下产生可接受的视觉效果。这是一个有些经验性、特别处理的过程。

继续第四页…

限制
尽管360度捕捉正在逐渐在越来越多的应用中可用,但与传统的基于显示器的捕捉工具(如Fraps、OBS和ShadowPlay)相比,它仍然存在一些限制。
需要应用程序支持
对于常规的捕捉工具,很容易捕捉几乎任何应用程序的视频。应用程序本身无需提供任何特殊功能来支持此操作。目前,只有那些为之添加了特殊支持并且需要访问项目源代码的应用程序才能使用360度捕捉。
原则上,可以使用类似于vorpX和Vireio这类工具使用的注入技术,在某些DirectX标题中操作摄像机来捕捉360度图像,但尚无人实现。此方法无法满足360度视频的录制需求,因为它无法实时录制,并且还会出现来自屏幕空间效果的伪影。

无实时视频
传统的基于显示器的捕捉工具可以以全分辨率和帧速实时捕捉应用程序,且开销较小。如上所述,360度视频必须具有非常高的分辨率,至少为4K像素宽。每帧必须渲染至少6个不同的场景视图(对于立体捕捉则更多)。此外,在VR中,保持显示屏的高帧速率以确保良好的体验是至关重要的。所有这些导致捕捉帧速率低于10帧每秒。
鉴于这是无法接受的低帧率,唯一的选择是离线渲染视频。对于像“Welcome to Oculus”、“Senza Peso”、“Colosse”或大多数过山车应用等固定轨迹体验的应用程序,其中玩家只是观察者,这很简单:只需逐帧进行捕捉,然后进行处理。音频后期添加。
对于其他需要玩家主动控制行动的应用程序,需要实现一种逐帧重放系统来捕捉。玩家的行动,然后在回放时捕捉每一帧。确保回放能准确重现原始场景在某些包含随机元素或审查目标时间的应用中可能会有些棘手。

立体全景格式
立体全景格式,拥有独立的左眼和右眼图像,容易实现高效的观看软件,使用现有的图像和视频格式易于压缩和存储,并且体积足够小可以下载和流媒体传输。然而,即使在先前章节提到的所有渲染修复中,这种格式仍然存在一些基本的限制。

首先,它无法正确显示当你把头歪在肩膀上时(旋转)的立体视图。如果尝试这样做,收敛是不可能的。另一个例子是:如果你将头后仰到可以看到身后时,你的视角将被反转。即使你的头正向前指,如果你用眼睛向左或向右看,你也无法看到正确的边缘视图,而且这个问题在HMD的视野增加时会更加严重。眼睛之间的距离(IPD)被固定在图像中,这会给那些具有非常特殊的IPD值的人产生一种尺寸的扭曲感。

最后,它无法提供任何形式的位置追踪-除了防止观看者在观看时向左、向右、向前或向后倾斜,这也导致头部旋转时的视差错误,因为眼睛在两眼之间的一个固定点周围旋转,而不是像在现实生活中一样在脖子中心周围旋转。这在静态场景中表现为头部旋转时附近物体的一种感知运动,即使在这些物体应该保持静止的静态场景中也是如此。(可能可以通过前面描述的光场技术来减轻视差问题,但这也可能加剧伪像问题。)

玩家在看哪里?
在传统视频中,很容易看出原始玩家在游戏过程中看向哪里。在360度视频中,观看者接管了所有头部运动,因此不再有明确的方法可以知道原始玩家看向哪里。在这个领域有很多可以尝试的空间,但以下是一些想法:

世界空间UI和空间音频:箭头可以表明玩家看向的方向;一个正方形或圆圈可以突出显示他们所看场景的部分;他们正在看的场景可能会随着他们的注视点照亮,就像他们的眼睛像手电筒一样照亮场景;可能位于他们所看方向的空间音频源,如持续发出的嗡嗡声。

第三人称摄像机和头部动画:观看者在某种程度上是与原始玩家一起玩的另一个人,所以身处他们的身体内会感到奇怪,即使是在第一人称游戏中也是如此。通过将观看者放在原始玩家的身体之外,你可以看到他们的身体和头部转动,同时也可以自由地四处看。第三人称摄像机还提供了在移动时平滑动作和减少不适感的能力。然而,与所有第三人称摄像机一样,在狭小的环境中如Minecraft中的小屋子中,它们可能会变得混乱或以意想不到的方式移动。

总结
在Unity和Unreal Engine 4等引擎中捕捉实时渲染的内容为VR开发人员和玩家分享他们的创作和体验提供了令人兴奋的可能性,让他们的朋友能像他们一样完全沉浸其中,完全自由地观察周围。现在已经有了工具和技术来开始将这些整合到各种应用中,但在360度捕捉变得像视频捕捉一样快速和简单之前,仍然存在一些令人生畏的障碍。

本文中所有原始内容的所有权通过CC0公共领域捐赠放弃。

0

  1. This post has no comment yet

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注