重构导播镜头(Directed Camera)——从视觉研究到游戏开发

作者:转载小公举
2016-08-21
1 4 2

授权声明

本文获得作者 Feitong Yang 授权,转载自其知乎专栏文章

引言

在过去的三个月中,我在一家游戏公司实习——写游戏引擎,因为我们的引擎是自己开发的。现在团队的一批成员正在科隆游戏展的一线宣传这款还在 Close Beta Test 的游戏:这是一个即时战略和 MoBA 的混合体,要求 1 个玩家在 15 分钟内同时操控 3 个英雄在游戏中通过打野采矿和攻击对方得到最多的分数,从而获得胜利。如果读者碰巧在科隆游戏展,欢迎来 Hall 6 玩我们开发的游戏。游戏正在线上和线下发放 Beta Key,而且似乎大佬们正在跟国内的一些公司接洽,讨论游戏进入中国的方案,但是到底什么时候能跟中国玩家见面我就不知道了。

当然,这是一个视觉科学的专栏,我显然不是专门在这里给游戏打广告的。今天是想从视觉注意的研究方面来重构一下『导播镜头』这个功能——在观赏游戏的时候,如何让AI来自动切换镜头,把相机焦点放在游戏最精彩的部分。

什么是『导播镜头』?

玩Dota或者LOL的玩家应该会知道在观战模式中,观众可以选择『导播镜头(Directed Camera)』观战。在这种模式中,游戏AI会自动将相机焦点导播到游戏最有趣的部分,让玩家看到游戏双方是如何战斗的。这个AI系统会随着游戏的发展,选择在不同的时间看不同的地区中玩家的战斗情况。在我前期搜索资料的过程中发现,很多玩家都很喜欢这个功能,因为他们发现这个AI系统通常可以捕捉到很精彩的游戏场面,比如大招啊,有趣的配合啊之类的。于是,玩家可以通过观看战斗来学习游戏玩法,而一些主播也可以通过这个功能来减轻自己的负担。

a3ee4a2adde96a5ffe52841a3b734050_r

Fig 1:LOL的导播镜头介绍

『导播镜头』是使用了什么样的算法?

我也不知道。显然,Dota和LOL的制作方没有把源码公布出来,所以我们并不知道他们是是用什么算法来实现这个功能的。网上有很多关于算法的猜测,但是基本上都是对于数据和参数的猜测,具体算法也没有人知道。再说,Dota和LOL很有可能使用的是不同的算法来实现同一个功能的。另外,我们也没法直接用LOL的系统,因为他们把这个系统申请了专利……

因为我们的游戏是一个竞技性很强的游戏,整个团队也想把这个游戏推入电子竞技圈,所以我们希望自己的游戏中有一个智能导播镜头能够在观战(包括游戏直播和观看录像)的时候自动地将镜头焦点放在游戏最有趣的部分,这样玩家就可以躺着看比赛了。

于是,我的工作就是从头设计和制作这样一个导播镜头的功能。

但是我并不知道别人的算法是什么,我只好想一个自己的算法。但是我从来没做过游戏开发啊,我在过去的几年都是视觉科学研究者,跟游戏开发差别好像还挺大的。

没事,我有一个特点:虽然我长得丑,但是我想得美呀!

用视觉注意研究来设计智能『导播镜头』

我们重新来看一下『导播镜头』需要做的事情:在某一个时间,我们的相机只能聚焦在一个地方,而我们希望这个地方是此时游戏最有意思的地方。这个要求本质上就是一个选择过程:我们要选择在某一个时刻地图上最有趣的地点。

说白了,这就是我们的空间注意系统在做的事情:在某一个时刻加工空间中最显著的信息。

既然说白了是要设计一个类似关于人类注意系统的AI系统,这东西我比较熟,所有的注意研究领域内相关的理论我都可以用起来,我们就来看如何用是视觉注意的研究理论来重构这个『导播镜头』。

1. 人类注意会选择空间中最显著的信息——显著图(Salience Map)

现代关于自底向上(Bottom-up)的注意模型都基于同一个思路:显著图(Salience Map)。这个显著图的功能在于计算整个空间中每一个位置的显著值(Salience),并且假设最显著的的信息会自动吸引注意到那个位置。

举个例子,如果你突然听到一声巨响,你会不由自主地扭头往那个方向看,因为那声巨响对你来说非常显著,可能在那个地方发生了什么重要的事情,所以你的注意一下子就被吸引到那个方向了。再举个例子,一个百无聊赖的下午,你跟基友在商场里面闲逛,毕竟你们俩都没有妹子。本来在犹豫要不要买眼前这件T恤的你,眼睛突然一下跳转到了10点钟方向,一动不动。因为那个位置突然出现了一个非常符合你审美的美女,这个视觉刺激非常显著,以至于她出现在你眼角的一刹那,你的注意就被吸引过去了。这两种情况都展示了显著刺激会主动吸引注意的现象。

根据这样的基本规律,我们就可以设计这样一个智能系统:这个系统智能地计算每一时刻游戏地图上最显著的区域,然后我们把导播相机聚焦在这个区域就可以了。这样,我们就只要解决一个稍微简单点的问题:如何计算每一个区域的显著值。

像LOL和Dota这样的游戏,显然我们不能去计算每一个像素的显著性。但是我们完全可以假设游戏最有趣的地方一定是某一个或某一群英雄附近。一般情况下,如果某一个区域没有任何一个英雄在活动,作为想了解玩家游戏策略的观众而言,这样的区域比较没有意思。于是我们就需要设计一个方案来计算『什么叫做有趣的、显著的信息』?

『什么信息是显著信息』是一个非常难的问题。这个问题目前有困扰着所有研究注意的科学家。因为对于人类而言,很多因素可以变成显著因素——颜色对比度,声音强度,奖赏相关性等等。在诸如DOTA和LOL的游戏中,显著因素相对少一些,但是仍然比较难搞。有些因素很容易找到:比如,我们可以认为英雄死亡是一个显著事件——我们想知道怎么补刀拿人头的,另外,英雄的大招也显然是显著事件——如果有人放大招了,我们肯定不想错过。再比如一些重要的事件,比如推塔什么的,也有可能我们觉得很有趣。

另外一些因素就相对比较难定义了。比如,团战。最简单的定义是不同阵营的人在某一个区间内同时出现,我们就认为发生了团战。这样的定义显然很粗糙,比如有可能玩家估计把站在一起,就是不打。再比如,伏击。游戏AI是很难知道一个英雄的一系列走位是为了伏击的,因为游戏AI只能看到游戏数据,看不到人的思想。你穿树林有可能不是为了伏击,而是为了逃跑。再比如,一些比较高级的玩法,玩家之间的配合之类的,这些策略都很难通过简单的规则来判断和定义。

3ff18310519ac6df0d2225efc47f5bfd_r

Fig 2. 『打野』这个事件就是一个比较抽象的事件,他没有明确的起始时间和中止时间,也没有明确的触发条件,只有『玩家和野怪的交互』这样一个模糊的定义。

但是,设计游戏系统最重要的一点就是不要把设计思路搞得太复杂。如果我们上来就思考:『我怎么才能刻画和定义玩家的不同策略,争取把所有有趣的操作都让相机找到』,那我们很有可能会发现这个任务太难了——有可能要来点机器学习,在凑点大数据什么的。一个复杂的系统可能非常准确,但是也可能会非常糟糕,非常难用。其实仔细想一下,玩家的任何游戏策略最终都会转换为游戏中英雄在某一个时刻的位置和使用的技能。位置是可以测量的,技能的影响是可以测量的。HP的改变和CoolDown都位置和技能的副产品。

LOL和Dota的玩家应该在一段时间的游戏和看视频之后逐渐地知道我们一般在什么情况下会说什么事件发生了。如果你仔细考虑,你会发现真正称得上『事件』的其实也就那么一些,关键是你如何通过仅有的游戏数据——每一个物体的位置、Hp、触发技能——来反向归纳出这些事件。人,用眼睛看,当然是一目了然的;但是AI系统,看到的只有一帧一帧的游戏数据,如何把数据解析成事件——这才是AI导播系统需要花点时间的。

2. 人类注意滞留的时间是有限的

人的注意是不会在任何一个物体和空间上停留很久的。人很容易感觉无聊。即使是你在看电视,甚至是看美女帅哥看的津津有味的时候,你的眼睛和注意焦点也不会在同一个地方太久(可能一次也就停留个半秒)——你会在不同的有趣的地方来回打量。但是,你的注意终究会在一些特别有趣的地方停留时间久一些,而在不那么有趣的地方停留时间短一些。

在观赏游戏的时候,观众也不会愿意盯着一个地区或者一个英雄(特殊情况除外)看太久。看了一段时间之后,观众可能就会想:咦,我想看看另外几个英雄在做些什么有趣的事情呢?

考虑到注意这样的属性,我们需要设计导播镜头在每一个显著性的点上停留多长时间。如果导播镜头停留的时间太短,观众会感觉镜头跳来跳去,看不清楚到底是怎么回事;如果停留时间太长,观众会感觉到无聊,希望看别的地方。我们希望导播镜头能够尽量智能地控制时间在某一个位置的时间长度。

如果你掐表看LOL的导播镜头的话,你会发现镜头一般在一个位置停留5s,然后跳转到下一个区域。有时候,你会发现镜头在同一个位置停留10s,甚至20s。这多半是因为这个位置有多个英雄在团战。因为这个场面足够有趣,英雄足够多,技能足够华丽,观众可能愿意在这个场景中多花一点时间,看看游戏的走向。因此,导播系统也就自然地多花了一些时间在这个上面。

18659f805bc8e59c78730709c8de340e_r

Fig 3. 比如这样的游戏团战,双方英雄和野兽都存在,我们就希望智能系统停留久一点。

我们设计导播镜头也要做到同样的效果。真正的实现有很多种不同的方法,比如你统计某个区间内的英雄总数,然后根据英雄的数量设置时间。或者,引擎可以统计某个区域发生了多少伤害,多少技能输出,多少移动,然后根据统计量的多少来决定相机的停留时间。当然,我不是这么实现的,我的方法比较简单粗暴,而且这种因为英雄多而增长镜头停留时间的现象也只是一个副产品,在这里就不多赘述了。

3. 人类会主动回避刚刚看过的地方——返回抑制(Inhibition of Return)

人类注意系统还有一个很有趣的现象,我们刚刚看过的地方,在一段时间内我们不会再去看了。我们把这种现象称为返回抑制。

比如,你在桌子上找铅笔的时候,你花了一些时间搜索了一个区域,接下来的一段时间之内你可能就不会再搜索这块区域了。但是如果再等了一会儿你还是没有找到铅笔,你可能才会回来再查一遍。

在观战LOL和Dota的时候,如果你是想了解游戏进展,很有可能你不是很希望在一方的同一个英雄身上花太多时间。比如你看到A英雄1在x路线上推进,没发生什么特别的;接下来你去看了看B方英雄做什么;接下来你又回到A方英雄,这个时候,你可能就不会再想去看英雄1在干什么,而是想知道你之前没有看过的英雄2,英雄3在干什么。

智能导播系统应该也要考虑到这样的问题,在同一阵营的不同英雄之间分配时间,不至于总是把镜头放在某一个特殊的英雄上面,毕竟其他的英雄可能正在做着很重要的事情。

4. 综合在一起,加上一点点先知

现在,你有了一个导播系统,这个系统会计算每一个时刻地图上哪里最显著,然后这个导播系统会把相机聚焦在这个最显著的区域内,并且聚焦一段时间;然后导播系统会寻找下一个显著区域,然后更新相机的聚焦点;如此反复。相机通过定义显著的事件和事件之间的显著级别来判断什么是有趣的,什么不那么有趣。如果你定义的有趣的事件比较正确,你设定的注意停留时间也比较合理,那么你就能得到一个相对不错的智能导播系统,帮助你无缝连接游戏的每一个精彩瞬间。

所有的游戏都是会缓冲的。你能在游戏里面看到的在线Dota和LOL的直播,至少是在真实游戏开始的2分钟以后。因为AI系统比观众多了2分钟的信息,所以AI系统可以做到一定的『未卜先知』。比如AI系统提前知道10s之后会发生『第一滴血』事件,导播系统就可以提前3s把镜头移动到这个事件会发生的地点和英雄身上。坐在一旁观战的玩家,就能够看到这个受害者英雄从HP下降到死亡的全部过程。

综合到一起,你就会得到一个提前帮你安排好的导播系统,让你轻松观战,不用碰一下鼠标或键盘。

从认知研究到游戏开发

我的智能导播系统的设计思路大概就是这样了。不太重要的具体细节当然是省略了一部分。至于这个系统好不好用——至少我们现在是每天都用它。将来等游戏入境中国的时候,欢迎大家亲自尝试一下我们这一款导播功能。毕竟我知道的现在电子竞技的游戏中提供智能导播观战功能的游戏并不是很多——实际上除了Dota和LOL,我并不知道第三个。

很多人问学心理学有什么用,我没法回答这个问题。但是我现在可以说,如果你研究『认知心理学』,那么你是可以去开发游戏的,甚至是开发即时策略游戏的游戏引擎。有很多游戏引擎的设计服从一些基本的人类认知特点,比如人类的视觉知觉、注意系统等等。虽然学认知的人不一定知道游戏渲染怎么做,但是有很多游戏智能系统,学习认知心理学的人还是可以去尝试开发一下的。

顺便说一句,视觉研究搞得好,你也是可以去Blizzard的。我就知道有一个研究视觉认知和视觉注意的PhD,毕业以后去了Blizzard——当然,人家的研究方向似乎就是『电子游戏对人类视觉和注意的影响』。

预告片视频

最后是关于游戏的视频花絮

游戏Close Beta的预告片

电影风格的预告片

近期点赞的会员

 分享这篇文章

您可能还会对这些文章感兴趣

参与此文章的讨论

  1. tnl 2016-08-26

    要是 MoBA 还好,但如果是和 RTS 结合的话,恐怕就需要相当复杂的权重系统了吧

  2. WuYu 2017-06-18

    问下第二张图片是什么游戏的?

您需要登录或者注册后才能发表评论

登录/注册