撰写了文章 发布于 2018-11-27 08:38:04
【Daily GDC】DOOM中的AI与动画
原视频GDC- Bringing Hell to Life: AI and Full Body Animation in DOOM
概述
主讲人Jake Campbell是id software中AI开发者,本次GDC主要介绍的是DOOM中如何通过AI来直接控制人物动画从而让游戏中的敌人更加多态,更加有趣。
内容概要
Part1为什么要通过AI去直接控制人物动画
Part2几个具体的例子以及其数学实现
Part3总结:通过AI让游戏中的敌人更加有趣
P1通过AI去直接控制人物动画
1.全身动画
DOOM中绝大多数角色动画都为全身动画,几乎很少用到部分肢体动画,以及动画layer叠加,一个动作由一段全身动画完全展现
2.通过AI直接控制角色动画
游戏中给了AI对动画播放绝对的控制,AI能根据游戏内的情况去控制动画的播放时间/播放速率/播放节点等等。在代码中你几乎分不清哪一部分是AI代码,哪一部分是角色控制代码
因为游戏中使用了全身动画,在很多情况下需要通过特殊的AI算法来让全身动画更加有可拓展性,能够应用到丰富多变的玩法与关卡地形中。
3.为什么要用全身动画以及AI控制动画
1)敌人种类数量众多
游戏中有19种AI,每一种都会有一种客制动画控制方案
2)游戏希望能让动画师能有更少的技术上的限制去创作动画
在技术上经常会要求动画师在做动画的时候必须要做动作分解/动画分层/姿势匹配等等,但是动画师只有在完全专注与动画本身而不用care其他的许多限制时才能制作出更好的动画,所以我们选择制作全身动画并且通过AI去控制匹配动画与玩法,来实现尽可能少的给动画师设置技术上的限制。
比如游戏中的敌人伤害反应动画就为全身动画,而结果也十分令人满意。
游戏中有4中伤害反应,痛苦程度逐级递增,它们分别是:
Twitch:不是全身动画,为肢体动画混合得到
Pain:为全身动画,夸张的动作给了玩家巨大的爽快感
Death:一般死亡,为角色倒地动画blend到由物理控制的死尸状态
Classic:肢体分解
3)敌人可以更加生动,能做出机敏的反应
我们希望能在敌人动画中做很多玩法上的修正,如前摇时间控制,取消施法充能
下图为一段带施法中断,连续变向跳跃接攻击的流畅动画。可以看到这一整套动画构建出一个非常灵活的敌人的形象,图片中一套动作可能只需要3-4个原始动画,通过AI控制动画根据不同的情况来特殊播放,以达到这种效果。
P2四个具体的例子以及其数学实现
1.Delta correction
在游戏中一段动画往往只能让敌人朝一个方向位移到特定的位置。但是很多情况下,我们希望敌人能够跳跃不同不同的距离来应对游戏中的各种情况,而又不需要每一段距离都制作一段动画加载到电脑内存中。于是,通过AI来修正动画的位置和旋转就非常重要了。
DOOM中采用的是全身动画。一个动作只对应一段动画,需要通过delta correction来逐帧修正动画中的位置和旋转信息。
数学实现:
一段跳跃动画,敌人已经起跳,动画结束敌人原本会在tn时落在y处。但是在时间tc与位置x时刻,计算出敌人应该落在z处。
计算出下一帧的位移修正比例(式子的意思就是下一帧占整个动画剩余时间的比例):
计算出下一帧的位移修正量(保证整段修正位移均匀分布在每一帧):
于是在tc+1帧向前修正位移ec+1即可保证整段动画总体向前修正位移e:
在爬窗户时使用delta correction
会在敌人更加自由的状态(也就是空中)应用delta correction,而在敌人够到窗户边缘后就会禁用。
游戏中具体应用:下图(蓝线部分代表应用了delta correction的部分),可以看到,画面中所有跳跃动作都只由一段动画实现,但是却可以适应不同的跳跃距离/跳跃高度等等。
2.Focus tracking
在游戏中让敌人能够在pose animation(站立不动的时候敌人的一段类似于呼吸动画)里保持武器/头持续朝向敌人。
数学实现
1)找到一个当前角色的参考朝向
2)找到目标朝向
3)计算出旋转参数
4)将旋转参数应用到每个关节上(在pose animation中每个相应关节增加旋转参数,等同于additive animation)。这里如果简单的将统一参数应用到每一个关节可能会出现视觉上的问题,可以逐个计算每一个关节的旋转偏移量来解决这个问题。
5)可以通过骨骼继承关系来控制哪些部位会被focus tracking影响,哪些部位不会
上图中天蓝色骨骼受到focus tracking,于是可以保证敌人主轴/头/头上的两个炮筒始终朝向主角,而其他部分可以自由根据动画运动
3.Foot Phase Synchronization(脚步同步)
游戏中敌人行走的动画非常多样,如何将时间/位移长短不同的行走动画在特定的情况下去来回混合切换?
AI知晓动画的播放时间和播放速率
在行走动画中放置4个标记:
左脚落地
右脚越过左脚
右脚落地
左脚越过右脚
如何同步:数学实现
两端时间不同的动画要同步混合
动画A角色跨两步,动画B角色跨一步。
取一个相同的时间点,同时向前选定1.3帧,计算1.3帧在一步中的比例
计算修正比例
转换为修正帧数
4.Bad zones
Bad zone是在行走中一段动画没有办法很好转换过去的角度,就好像你在左脚迈出去之后没有办法朝左转向,因为那样你的两条腿会绊在一起
如上图,绿色箭头为角色朝向,紫色箭头为目的地朝向,蓝色箭头为攻击目标(玩家)朝向,红**域为bad zone
这时候,通过修正角色朝向来让目标朝向脱离出bad zone
但是这样,敌人的朝向(绿色箭头),就会偏离攻击目标朝向(蓝色箭头),这时候,前面提到的指向系统会修正这一偏离。
P3总结:通过AI让游戏中的敌人更加有趣
1.设计目的
作为一个AI开发师,我们永远希望能达成两个目标:让游戏中所有敌人更加有生机,更加机敏;同时能让玩家在玩游戏的时候觉得有趣(比如说有的时候你不能让一个敌人动作太过灵敏而导致游戏难度过大挫败玩家)
游戏中敌人的每一个动作都应该目的明确,让玩家能清楚的做出具体的反应,也让玩家在遭受伤害之后清楚的知道自己遭受伤害的原因:噢,这里我起跳晚了,这里我躲闪方向不对,从而让玩家持续进步。
在DOOM中我们希望玩家能够感受到自身的绝对强大,去屠杀游戏中所有敌人,在游戏中敌人每一个攻击动画都有自己独特明显的前摇停顿,这些停顿让玩家能够充分去解读游戏中的敌人,去做出反应。
但是DOOM是一个关卡地形非常多变的游戏,在一个空旷的地图上,玩家可以通过敌人攻击前摇来准确判定躲闪方式从而很容易的遛着敌人玩,但是在狭长的地图里,这种做法往往会十分困难,于是不同的地形+动作前摇提供了控制关卡节奏的一种很好的方式:
狭长的室内关卡往往节奏会很快,高度紧张,难度偏高,玩家很容易被击中
开阔的室外场景更容易躲避敌人的攻击,节奏相对较慢,也不那么紧张
2.灵活性
AI控制动画播放,让敌人在复杂的地形条件以及游戏环境(玩家操纵主角的不确定性)下能够有更多选择去做出更加自然的动作。
上图为一次Debug Run,可以看到AI在根据主角的位置和关卡地形判定敌人应该执行的动作,并且控制动画去丝滑的实现这套动作。
目录