当前位置: 首页>后端>正文

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt

今天来分享下《巫师3》的叙事系统的学习收获,数据来源于GDC2016的分享,分享者是《巫师3》的Anim TD(技术策划?)。

叙事(对话)系统需要由众多的职能协作完成:

  • Animator
  • Programmer
  • Designer
  • QA

《巫师3》的叙事是非线性的,对于CD Project RED而言,所有游戏的核心都是剧情(叙事),因此游戏中的所有系统都是基于这个原则而设计的。

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第1张
【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第2张

《巫师3》中玩家与角色的交流或者说玩家对角色的了解都是通过对话(dialogue)完成的,在对话中玩家可以给出自己的选择,但是这些选择,如果只是借助gameplay的话,说实话都很难做到非常有意义(meaningful),而《巫师3》对这一项的提升关键就是影视化叙事(Cinematic Dialogue)。

要想做到有意义的表达或让玩家做出的选择是有意义的,就需要让玩家在情感上产生共鸣,《巫师3》是通过玩家与角色之间的连接来实现这一点的,具体来说有很多策略:

  • 通过运镜来加强两者之间的联系
  • 通过面部表情或者其他的非语言输出式的交流方式来加强联系。根据“show don't tell”的原则,有时候表演会比对话能够传达更为强烈且自然的感情,比如一个简单手势(gesture)的特写可能会胜过多行的语言对话

那么,既然影视化叙事如此重要,是不是就要请动作同学为每一个对话都设计一个cutscene呢?如果有当然更好,但是考虑到《巫师3》的剧情有35个小时,1400个对话,如果真要按照这种方式做的话,大概一个团的动画设计师都不足以完成这个任务。。。而且每个cutscene的成本是很高的,需要专门的动捕(mocap,motion capture的缩写吧)以及在此之上的大量的动画工作,因此完全的cutscene叙事是不现实的。

那么该怎么做呢?《巫师3》采取的做法是将连贯的影视化叙事逻辑拆解为模块化的组件,通过积木拼接的方式模拟cutscene的效果。

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第3张

举个例子,如上图右侧所示,正常来说,每个cutscene都需要对应一个mocap session,而《巫师3》则是如上图左侧一样,拆解成一个个的积木碎片,通过这些积木元件不断组装成一个个的dialogue,从而实现成本跟质量的平衡。

另外,积木化的另一个好处就是,降低了对话制作的成本,只要有了这些积木元件,任何人都可以在不需要maya & MotionBuilder相关知识的情况下制作dialogue。

此外,这个系统还将animator制作的cutscene作为其中的一个积木模块,从而可以在必要的时候通过cutscene来提升表现,实现更丰富的功能。

《巫师3》最开始是基于《巫师2》的对话系统开发的,而《巫师2》的对话系统只有一些简单的功能:

  • 角色没有动作,或者说只会idle(跟现今的手游类似),只在某个剧情需要的时候,触发一个全身的动作(这些动作其实也是一些通用的动作,主打一个复用性高,但表现就不一定匹配)
  • 相机只局限于简单的切换

将之与cutscene相比,效果天差地别,《巫师3》对对话系统的期望则是达到cutscene的质量,在这个位置有个演示视频,从表现上来看,基本上达成了这个目标。

在深入dialogue的细节之前,先来看下dialogue在整个游戏的定位:

  • 整个游戏由一个个的Story构成
  • 每个Story包含多个Quest(任务),每个quest负责整个故事的一部分,可以理解为故事碎片
  • Quest的实现逻辑类似于UE的蓝图,是通过连线的方式完成编辑的,通过不断新增节点来实现功能的不断扩充
【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第4张
  • Dialogue则是这众多节点中的一个,当运行到这个节点的时候,就会触发一个对话
  • Dialogue还有专用的编辑器用于提供所有需要的功能
【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第5张

下面来介绍一下dialogue的相关细节,这里准备基于单个dialogue的pipeline来介绍

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第6张

整个流程可以分成四步:

  1. writer:文案,负责输出text script,这个过程是在dialogue editor中完成的,如下图所示:
【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第7张

在这个阶段,整个流程是按照section跟choice来组织的,因此对话系统可以看成是一个graph。从上图可以看到,对于文案同学来说,《巫师3》提供了一个类似文本编辑器的工具,这个工具具有如下功能:

  • 能够一眼浏览到整个剧情的走向,比node graph要更为直观
  • 将story分层进行组织,每个choice下的后续走向通过超链的方式进行跳转

从上面的设计来说,文案同学期望的编剧工具应该具备如下能力:

  • 能够较为容易的了解到整体剧情的走向(有信息分层的作用),且能够兼顾到剧情的非线性(即各个剧情节点的连接是一个graph)
  • 能够让文案同学在前后对话节点上进行跳转,即可以跳转进入下一段剧情或者回到上一段剧情
  • 要能够轻易的对当前的剧情进行修改(如需要具备在当前节点上,进行新增下一段剧情,修改当前剧情,以及删除当前节点的处理逻辑)
  • 要能够快速定位到想要编辑与修改的剧情(即需要一个ID进行表征与搜索)
  • 要能指定对话参与人
  • 需要能够自动将分支后的对话拆成新的对话entry,并且将choice暴露出来,从而允许剧情跟随choice做变化。
  • 如果能够在编辑对话的同时,编辑对应的表情、动作、运镜会更好
  • 编辑完成后,可以方便预览效果,比如可以选择从当前节点起进行预览会更好
  • 需要考虑系统的可伸缩性,当对话过于复杂时,支持情况是否会存在问题等
  1. Quests:任务系统。
    dialogue编写完成后,数据就会提供给任务(剧情)制作团队,《巫师3》使用一个节点式的工具来完成剧情编辑,而dialogue是其中的一个节点:
【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第8张

dialogue触发的时机就通过上图的event graph来指定,而dialogue的参与人则由writer在之前的对话编辑器中完成(同时还可以看到,这个编辑窗口中除了角色的定义之外,还有道具、特效、光照等的定义):

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第9张

基于不同的choice,角色可能会有不同的装扮:

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第10张
【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第11张

最后还要指定dialogue发生的位置,但是这里没有给出明确说明位置是如何指定的,看上图显示,似乎是手摆,但是从逻辑上来说,应该是会基于event graph中上一个节点结束后的节点来?

由于是非线性叙事或对话,那么在玩家的选择下,剧情与对话都会有不同的走向,这里的流程控制是由Quest Designer来负责的:

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第12张

从上图也可以看到,《巫师3》这里是按照分支拆分的逻辑对dialogue进行拆分的,如果没有分支,那么dialogue就会做成一个节点(这里被称之为一个section),如果存在分支,那么就需要新增节点来装载。

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第13张

从上图也可以看到,在对话之间,还可以插入其他节点来完成对应的事情,这些节点可以包括:

  • 播放sequencer
  • 播放视频
  • 执行脚本对世界造成变化
  1. Dialogue Designer:Quest完成之后,就轮到Dialogue Designer接手了,他们负责的是对话相关的视觉相关工作。
【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第14张

Dialogue Designer类似于电影的导演,工作使用的主要工具是类似于sequencer的timeline。

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第15张

timeline的时间节点与character voice的结束节点绑定,这个也就是说,玩家如果要跳过某条对话,那么表情、动作、文本、语音、镜头等都要做同样的时间跳跃(即动作、表情等直接跳到最后一帧,镜头直接切到最终的位置)。

timeline下半部分描述的就是事件控制逻辑,由一个个的track组成,用于描述角色(动作、表情等)、场景、镜头、道具等各种游戏元素的具体行为变化(不知道这里是怎么跟UI界面的文本匹配起来的),这里提供了种类丰富的event:

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第16张

对于每个event而言,可以进行trim(动画裁剪,比如只播放部分)、join(动画的拼接,将多个动画拼在一起)、weighted(可能是动画混合相关的)、interpolated(在前后两个动画之间进行插值)等操作。

这个编辑器还提供了在不同场景预览的效果,比如在空白场景以及在正式场景(可以通过Scene进行控制)等。

上面展示的其实是单个section的相关数据,对于每个section而言,都有一个对应的数据窗口:

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第17张

下面介绍一下Dialogue Designer的工作流程,首先来看一下dialogue的设置:

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第18张

从截图来看,这里描述的应该是对话时的配置,包括参与对话的角色,他们的位置,可见性、表情等参数,可以将dialogue set看成是文字版的对话的截帧数据。

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第19张
【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第20张

上面截图给的是通过代码生成dialogue的generator的说明,目标是通过代码来用一些basic的events填充timeline,这个逻辑通常是编辑生成dialogue的第一道工序。

这种做法的好处是对于一些不合理的events可以快速删除,而如果策划同学需要新增events的话,流程就会相对复杂繁琐,所以总体看来,虽然程序生成的events并不一定就能直接使用,但是从工作效率来考虑,这种做法还是比较高效的。

此外,一些不那么重要的dialogue甚至可以直接不需要修改就能工作(将这部分逻辑用AIGC接管,或许效果还有进一步提升?)

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第21张
【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第22张
【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第23张

Generator的输入包含三类数据:

  1. Dialogue Set:角色的相关信息
  2. Generate Rule:生成时需要满足哪些约束,比如上面图中给出的角色要face-to-face站立等
  3. Data Processing:这里指的是从Voices中获取到对应的数据,这里介绍了一种叫做MFCC的算法,这个算法可以对Voices进行处理,最终得到一个feature vector(可以用来做语音识别),并基于这个feature vector拿到对应的角色的数据(marker、accent),从而可以为对应角色生成更匹配的events/animations

把这三种数据输入程序,就能够生成出各种各样的events:动作(body gestures)、表情(facial gestures)、镜头控制、角色lookat等。

这里还给了一个演示视频,看效果还挺不错的。

Generator可以快速生成大量的对话效果,虽然质量不如手k,但是这不是Generator的目的,对于不满意的dialogue,可以一键重试再来一次,直到大体符合需要为止。

在Generator之后的下一步就是角色手动调整,再之后就是设计角色的待机动作,这个对品质影响比较大:

  • 《巫师3》为每个角色设计了35个站姿待机动作,所以可以使得角色的动作表现比较生动丰富
  • 对于不同的pose,比如坐姿蹲姿跪姿等,还会有额外的待机动作

在实际使用的时候,会根据角色的social status(high、low?这个是啥,从截图来看,似乎是角色的名称或类型,应该匹配一种骨骼种类)、emotional state以及pose来进行选择,正好构建出一棵树:

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第24张
【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第25张

完成idle动作设定之后,就会进入到lookat的编辑中,对于《巫师3》来说,lookat是策划同学能够使用的一项非常强大的程序化动作工具。

《巫师2》中的lookat是通过形变来实现的,即将头部以及躯体(torso)旋转某个角度,这种属于标准方案,但是并不是所有情况下都适用,比如当角色坐下或者躺下时,表现就会有点奇怪。

《巫师3》希望能够让animator对角色的pose有完全的控制能力,因此这里也就同样升级为通过动画来驱动lookat了。

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第26张

整个算法的输入是一个带有lookat pose的动画,比如每秒录制一个pose,animator可以根据需要创建对应数目的poses,所以相对于之前的完全通过代码来完成的lookat不同,这里不再是只用简单的少数骨骼变换来实现,而是完全的基于动画的驱动,只需要根据需要调用对应的动画即可,这种方法可以覆盖任意的pose,可以是站姿也可以是坐姿或者躺姿。

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第27张

前面说过,lookat的所有输入就是带有lookat poses的animation,在编辑阶段,会将这些pose提出来,找到每个pose的lookat的target point,之后基于这些target point,构建一个三维的Mesh,如上图所示,这个mesh由若干三角形组成。

在运行时,当我们需要拿到看向某个方向的lookat pose的时候,就将这个方向投射到上述mesh上,得到与之相交的三角形,之后拿到三角形对应的顶点,也就是对应的三个pose,并基于一定的权重(比如可以是重心来计算权重)对3个pose进行混合,就能得到最终的pose,按照一定的时间进行插值就能得到lookat动画了。

《巫师3》提供了三种层级的lookat:

  • 只转动眼部的lookat,基于facial rig实现
  • 只转动头部的lookat
  • 转动身体的lookat

如果不考虑眼睛的方案,这里就需要为每个idle动作设计两套点云animation(这里的点云animation是不是指的就是前面的针对不同角度的lookat pose?)

整体的lookat方案看起来要做很多pose,可能会显得耗时较长,但实际上由于animator只需要制作pose(单帧)而非animation(连续帧动画),所以时间消耗不会太多;此外,由于这些数据都是离线提供的,程序同学可以在离线的时候对这些数据进行分析,并做好整合,在运行时可以基于整合数据输出更多更好的程序化的表现。

lookat之后就是animations,《巫师3》有超过2400个专属于对话的动作,工作量真实大。。但是如果考虑到角色数目、idle数目、姿势种类(还得考虑monster,部分也有对话),可能算下来平均也没那么多,因此实际上还是会有比较多的动画重用来满足对话的需求。

《巫师3》中的动画播放有三种方式:普通、叠加(additive)以及覆盖(override),在播放的时候,还可以控制说屏蔽某些骨骼的动作(mask out)或者调整骨骼的权重,且整个animation clip可以通过用户自定义的curve来控制(速度?),这些加在一起,就会使得整体的动画效果在有限的资源下做到比较丰富的表现,比如通过这些工具完成从站姿到坐姿的变化:

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第28张

效果看起来不如手k的好,但是关键只需要几秒钟的时间,成本大大降低了,《巫师3》中的角色动作有较多是通过这种方式实现的。

对话动画系统中另一个需要说的feature是Control Rig,据说灵感是来自于Source Filmmaker,这个工具的作用是允许策划同学而非动作同学可以在引擎编辑器里编辑动作,这就大大的提高了生产效率(不知道UE的Control Rig跟这里的Control Rig是否是同一个事情,看功能颇有相近之处)。

《巫师3》中Control Rig通常用于如下三种情景:

  • 自定义pose,不过这个从零开始做起来比较费时间,因此更常用的是对已有的pose进行微调(比如调整头部、手臂跟手指等细节),实现更好的效果
  • 对gesture进行修正,比如视频中展示的通过增加key来调整对话参与人的lookat方向,且调整过程非常简单,不需要专业的美术或者程序知识就能完成
  • 修正idle动画中的瑕疵,比如用的最多的就是通过这种方式来修正穿模问题
【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第29张

除了动作,面部表情也大量的使用了这种方法,与动画是通过对骨骼的控制不同,这里控制的就是影响表情的大量的joystick,每个joystick代表着控制某个部位(比如眼睛、眼帘、嘴唇,可以看成是blendshape的某个参数)的一个关键参数,通过对joystick的拖动,可以实现参数的变化,之后反应到表现上,就是面部表情的相应调整。

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第30张

对于表情,还提供了一系列的控制参数,比如上图中的jaw_open等,用于控制嘴巴的张开幅度,通过调整这个参数可以使得角色说话时嘴巴张开的幅度更大。

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第31张

除了对角色操控,还可以对场景中的任何元素(如道具等)进行编辑,而且可以通过插值、贝塞尔曲线等实现一些简单的动画效果,而且可以将某个物件attach到另一个物件上,从而实现动画的一个同步。

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第32张

这里对dialogue designer的工作流做一个总结:

  1. 先配置基本参数
  2. 借助程序化功能完成数据的自动生成
  3. 对相机的控制逻辑进行调整
  4. 添加角色的待机动作
  5. 完成角色lookat的编辑
  6. 完成角色动画的编辑
  7. 完成角色面部表情的编辑
  8. 完成场景中的元素如道具的编辑
  9. 最后进行验收与调优

前面说过,希望基于dialogue system达到cutscene的效果,但是基于前面的工作,想要在平均制作水平上达到cutscene的效果还比较难,但是对于一些特殊的场景,走完全手k的方式还是有可能比较接近的,这里给了一个十字弓的例子(详情可以看视频):

  • 基于接钥匙的动作,改造成接十字弓的动作
  • 调整相机的位置,尽量规避一些弓跟手掌不匹配的细节部分

《巫师3》的制作原则是不以量取胜,每个对话都要传达一些情感要素,争取做到与玩家的共鸣,这里还给了一个视频,演示了一个基于dialogue editor编辑的对话效果,虽然其中手k工作量较多,但是能达到这个水平已经是非常厉害了。

下面看下叙事系统的最后一个模块——Post Production。

对于叙事来说,光照是很关键的,部分场景如果不加一些额外光照,基本上就啥也看不见,而要在开放世界中时刻保持一个较好的光照是很困难的,因为有日夜变化,还有天气的影响,这些对于光照效果都有较大影响,比如一个重大的挑战就是,当日夜变化或者天气变化时,此前的灯光设定如果不做调整,就会显得格格不入,这里也给一下策划期待的一个效果。

【GDC2016】Behind the Scenes of the Cinematic Dialogues in The Witcher 3- Wild Hunt,第33张

整个画面的光照分为两部分,分别是全局光与对话光,两者是相乘的关系,每个光照的属性,考虑到日夜变化与天气变化,都不是一个静态的数值,而是一条曲线,所以在实际操作中,会先设定天气的光照,之后根据天气的光照来调整对话的光照,从而保证任意时刻与任意天气下的光照表现是符合需要的。

特效跟音效也是Post Production的一部分,这个数据其实是通过前面介绍过的timeline的工具完成编辑的,所以这里就不做展开介绍了。

上面介绍的就是《巫师3》中的叙事编辑器的所有功能与经验,下面来看一下相关的教训与问题。

第一个问题是本地化,前面说到,timeline是基于语音来驱动事件的,但是这里有一个问题,不同的语言对应的语音长度是不同的,那么就会导致在本地化的时候遇到比较多的适配问题,解决这个问题的方式是将所有的event的持续时长以及开始时机与语音的时长以及时机绑定(比如基于语音的百分比来调整事件的起始位置),从而使得所有的事件都能够相应的匹配上对应的语言(可能不是所有的事件都需要缩放,这种方法可能也不是能够适用于所有的情况)

这里给了个例子,分别用英语跟法语来完成一段对话,通过缩放的方式进行适配,看起来表现都是正常的。

第二个问题是一个玩家可以自由控制的对话(可以决定是否需要跳过)在一个玩家并不能自由控制的世界中的表现冲突的问题。

举个例子是,角色在场景中触发对话,但是NPC可能正好出现在角色行走的路径上,这个时候角色就会穿过NPC,导致效果异常,这个问题的解决方案是在制作对话的时候,用一个denied area来把对话相关的元素都包含进来,并且在运行时,禁止NPC等进入这个区域。

第二个例子是,剧情编辑的时候设定角色是步行的,但是玩家可能会有时候选择骑马,那么当剧情发生的时候,就会强制要玩家下马步行,导致体验上存在问题,解决方案是为这种情况播放一个制定好的cutscene,实现两者之间的自然衔接。

参考

[1]. Behind the Scenes of the Cinematic Dialogues in The Witcher 3: Wild Hunt
[2]. The Witcher 3: Crafting a compelling narrative in a believable open world


https://www.xamrdz.com/backend/3kn1929077.html

相关文章: