如何用极客范儿打造一个HTC Vive虚拟演播室?(上)
雷锋网 (搜索“雷锋网”公众号关注) 按:作者王锐,VR行业资深从业者。在本文讨论“如何用极客范儿打造HTC Vive虚拟演播室”之前,王锐还曾写过一篇广受欢迎的 《如何用极客范儿做一款VR头盔?不是插个手机的那种》 ,有兴趣的读者可以看看。那么,打造HTC Vive虚拟演播室的原理是什么?本文将会给你答案。
| 看起来很酷的玩法
HTC Vive如期在四月份开始供货以来,已经有相当一部分尝鲜者拿到了第一批产品,由 虚拟现实 头盔,手柄以及Lighthouse定位装置组成的完整的VR互动体验也着实让从业者和玩家们感到兴奋。当然,从现阶段来看,针对Vive的内容还远未到位,很多游戏体验还处在预告或者试玩的阶段;更大的一波攻势怕是还在路上,即将到来。
而在这为数不多的初期体验当中,有一则有趣的 新闻 吸引了笔者的注意。
对于游戏者本人而言,她所看到的内容并没有什么实质的变化,只是在进行一个VR游戏并与其中的内容和角色进行互动(例如下图中的小女孩正在尝试用手柄“吸引”电子宠物)而已。而让人感到啧啧称奇的是,现场观众可以通过直播画面看到如下的情景(图片来自相关新闻的视频截图):
而实际的拍摄场地,则类似下图的布置,游戏者在一片绿色幕布的包围下开心地进行玩耍,而手持摄像机的工作人员则将她的现场表现通通记录下来,再与第三人称视角的VR游戏场景直接叠加,让其他也许正在排队等待的人能够更真切地目睹游戏中的一切,以及预想自己即将在别人眼中呈现出来的英姿(或许是丑态也说不定)。
这无疑让一个可能的线下VR体验馆变得热闹了许多,而且对于难得参与一次VR重度游戏的孩子而言,也是一次重要的经历,值得用这种直观的方式记录下来,回去慢慢品味。
那么问题就来了,这个看起来十分炫酷的游戏方式,在现实中有可能实现吗?还是说这只是为了宣传而专门拍摄的画面而已,或者只能专属于一些领先的国外技术团队呢?
就让我们再次举起极客的大旗,去努一努力好了。
| 虚拟演播室的定义
首先,前文所述的种种并不是多么高深的“ 黑科技 ”,它事实上 源于一个现实中已然到处存在的视频制作技术——虚拟演播室(Virtual Studio System,简称VSS) 。
这一技术的 本质是将计算机制作的虚拟场景(通常是三维场景)与现场拍摄的实时活动画面进行叠加 ,并且确保两幅画面的运动与透视关系完全一致 ,从而自然和迅速地得到了虚实结合的画面效果。在这类应用当中,通常会采取前景和主持人为真实拍摄,而千变万化的背景通过计算机实时演算生成的结合手段,并将叠加完成的效果传递到电视信号。例如:
很显然主持人并不是真的站在这么一个抽象数字和图形组成的空间里。要随着我国的GDP突飞猛进而经常更新直播间的室内装潢,这也远不如在计算机上动动手指来得有效率。所以,实际的拍摄场地往往可能是这样的布置:
或者也常使用蓝色的背景:
要在这样的场地条件下谈笑风生,还真是对演员和嘉宾能力的一种考验了。而这样的演播过程同样包含了对大量设备与技术的集成和应用,仅仅掐指一算,就有 虚拟场景设计与实现,灯光,实时抠像,摄像机跟踪,色键合成,视频合成,实时转播等种种门类涵盖在其中 。要想在这一篇短文里把它们都讲解清楚,恐怕非笔者力所能及,也非本文所能容纳的了。
不过,仅仅是针对我们在文章开头的需求,还是大有工夫可做的。那么我们就来思考第一个问题,也许也是虚拟演播室技术实现中最为核心的一个问题: 电脑生成的背景,与气定神闲的演员,是怎么叠加在一起的?
| 从虚拟摄像机开始
主持人或者演员的表演是怎么被记录下来的,这一点不用多说,自然是通过摄像机进行拍摄,然后输出直播画面或者录制到文件再做处理,所以这并非我们所关注的重点。至于为什么演员的前后左右都要用纯粹的绿色或者蓝色伺候,这是我们稍后将会讨论的话题。而在此之前,我们需要引入一个也许并不陌生的概念—— 虚拟摄像机(virtual camera)。
当然,这里要说的绝不是VR全景摄像机的概念。 我们所指的恰恰是 不存在于现实当中的摄像机设备 ,它存在于我们的游戏场景里,就仿佛是在游戏场地中架设了一台摄像机,将走过路过的主角和敌人,以及他们之间的恩怨情仇统统拍摄下来,就像是拍摄动物世界的纪录片那样。
这样很酷,不过既然是摄像机,那么它自然也应当具备真正的摄像设备的基本参数了,例如镜头焦距,景深,视场角(FOV),最关键的是,这台摄像机是放在游戏场地的什么位置上?又是朝着哪个方向进行拍摄的?如果这是一台可以运动的摄像机的话,那么还需要考虑它的运动跟踪。当然,用斯坦尼康之类来做运动拍摄时画面的防抖处理,这样的繁琐需求在这里应该是用不着了。
(Via 《 3ds MAX and VRay Tutorial: Basic daylight interior visualization for beginners – Render like a photographer》 )
而对于虚拟演播室的需求来说,更重要的一条原则是 :这个虚拟摄像机的光学参数与运动位姿,必须和拍摄演员的摄像机完全同步和一致。 这样才有可能在后面的叠加处理中做到两幅画面的统一,以及透视关系的正确性。
(Via 3dcpptutorials.sk )
听起来很简单,但实际上这是一个不小的挑战。事实上在我国,长期以来高端的3D虚拟演播室业务都是被Orad(傲威)等行业龙头所占据的。为了做到上述的摄像机跟踪的需求,他们会采用非常高精度的编码器云台来做角度的探测,其售价通常会以20万元起步,令人生畏。
后来也有部分高端虚拟演播室系统用到了计算机视觉(Computer Vision,CV)的方法来识别蓝幕上的浅蓝色线条,从而实现摄像机的运动和姿态探测。但是这样做的算法并不容易,售价同样很昂贵。
而Orad的虚拟演播室系统的销售是以“信道”为单位的,之前 一个信道可以卖到70万左右的价格 ,而采购是最少3个信道起价的。当然我们也能见到售价十多万的虚拟演播室系统,但是其中很可能会直接无视摄像机跟踪的需求,仅仅把实际拍摄的片子做绿幕抠像,然后导入到虚拟场景中直接叠加。合成的结果很容易让真实的演员显得像是早期建筑动画和海报里不自然的纸片人一样。
回归正文,如果只是确保虚拟系统和真实系统的光学参数一致的话,我们倒是可以简单地给虚拟摄像机的焦距,FOV等数值(尽管这样并不准确,不过多数情况下变化的幅度可以容忍)。难点在于摄像机的位置与姿态的跟踪,如果用数学公式来表达的话,大致如下:
(Via slideplayer.com )
是不是有点似曾相识的感觉?没错,如果您已经熟练地掌握了OpenVR API的使用(也就是HTC Vive的C++开发工具库),那么想必也已经发现了一个现成的函数:
它的作用就是获取指定Vive设备的位置和姿态矩阵,而这个设备可能是头盔,手柄,或者是Lighthouse定位装置。如此一来,假设我们开一个 脑洞 ,把某个Vive设备完全绑定在真实的摄像机上的话,那么摄像机的移动和旋转信息就会被完整地记录下来,并传递到OpenVR API以及我们自己的应用程序里——换句话说, 虚拟摄像机的位置和姿态信息也就由此被确定了 。
这样的做法事实上也并不是笔者首创的,国外早就有玩家把Vive的控制手柄固定在大腿上来读取和模拟人的腿部姿态和运动,如下面的 新闻 (图片同样来自Yivian):
当然了,这种做法并不是没有局限性,否则高端的虚拟演播室系统开发和集成厂家也都要找笔者算账来了。因为HTC Vive的控制器只能在Lighthouse所圈定的优先区域内被识别(例如5x5米),所以这种做法并不能跟随实际的摄像机大范围地运动。 不过Lighthouse在理论上是可以被拼接和扩大识别范围 的,所以不久的将来我们也许真的能够见到基于Vive控制原理的虚拟演播室系统模块也说不定。毕竟科技是飞速发展的,颠覆一些传统和守旧的做法也是毫不稀奇的事情。
| 抠像的传说
实现了虚拟摄像机与实际摄像机的同步之后,我们要面临的 第二个大问题,叫做抠像(keying) 。它的基本含义是——
从拍摄的画面中抽取某一种颜色作为透明色,即把这种颜色所对应的像素点从画面中抠掉,让可能的背景画面显露出来,从而呈现出叠加的效果。
抠像之前的布景条件往往比较严格,现场会要求前景的演员和道具与背景的幕布之间区别明显,色调也不接近,同时背景的光照要均匀布设,避免有过大的阴影区域或者褶皱。而通常的抠像场景会选择蓝色或者绿色的幕布来作为背景,这是因为在人体上几乎不存在这两种颜色,因此不会出现错误的抠掉演员本身的问题(当然部分人的瞳孔会有绿色和蓝色的色彩,此时要单独进行处理)。如果在场景中故意布置一些绿色包裹的道具,例如让演员站在绿色的箱子上,那么抠像处理完成后就会产生浮空的效果,再加上计算机生成背景画面的巧妙叠加,就会形成如今各种好莱坞大片中的特效场面。
这样的话,再返回头去看本文开头的游戏现场布景,就不难理解他们这样做的用意了。进行游戏的小女孩是在绿幕构成的环境中运动的,摄像机将她的一举一动拍摄下来,然后抠像处理将绿色的背景透明化,再与Vive游戏的画面相叠加。因为摄像机的位置和姿态都被传递到虚拟游戏场景当中,因此两幅画面叠加的透视效果是完全一致的,再加上合适的深度遮挡判断的话,就可以做到一种混合现实(Mixed Reality)一般的现场感了。
当然,这里面有两个重要的事实需要声明:
-
一是游戏本身必须支持这种第三人称的观看模式,并且能够接收来自位置跟踪设备(例如Vive的手柄)的数据和设置自身的虚拟摄像机参数。
-
二是这一画面只会呈现给其他的观看者,正在进行游戏的人看到的画面依然是VR的第一人称视角内容,不会看到自己的真实形象混叠于其中。
原理既然已经阐述完毕,下面的时间,我们就自己试做一款基于Vive的虚拟演播室系统,当然所有的功能都是最简的。Unity和Unreal这样的游戏引擎在这里恐怕也起不到什么用武之地,让C++的代码遍地开花就好。
如何自己动手做一款基于Vive的虚拟演播室系统?请继续关注《如何用极客范儿打造一个HTC Vive虚拟演播室?(下)》。
雷锋网注:作者王锐,本文为雷锋网独家约稿,转载请联系并保留完整信息, 不得删减、修改 文章。