对动画的选择和控制系统的讨论【转载】
一直在说AI可以分为决策层(Strategy Layer)和行为层(Behavior Layer),和行为层打交道最多的,就是动画了,说到动画,游戏引擎一般都会提供完整的底层的动画系统,包括如何转换数据,如何做动画Blend等等,但这些一般不属于AI程序员的工作范畴,所以不在这次的讨论范围内,我们这次说到的“动画的选择和控制”是相对比较高层的东西,在我的定义里是属于AI行为层的内容。
现在的游戏中,动画越来越多,也越来越复杂,据说FIFA里就用到了4000到5000个动画,所以如何来驱动和组织这些动画,就成了AI行为层需要考虑的问题。就拿足球游戏为例,比如决策层发出“射门”的请求,那行为层就要从几千个动画中决定播放哪个动画来完成这个请求。直观感觉上,这就是一个if-else的问题,但我们要做的,是要有一个好的AI架构来做这样的一个对于动画的选择和控制。
从上面的描述中,我们可以看到,其实行为层的决策问题,和决策层的决策问题是一样的(这也是为什么他们都属于AI的原因),只是输入和输出的不同。对于决策层而言,输入是游戏世界信息(Game World Info),输出是请求(Request),而对于行为层而言,输入是请求和游戏世界信息,输出是动画和动画的播放控制信息(Animation Info)。如下图所示:
对于单个动画来说,我们可以定义两个附加的信息来选择和控制动画
- 动画的选择条件信息(Animation Condition)
- 动画的运行时状态(Animation Running Info)
动画的选择条件信息定义了播放此动画的条件,举个例在来说,在足球游戏中,我们有一个倒挂金钩的动画,要播放这个动画,就需要定义一系列的条件,比如球要在一定的高度,人要背对球门等等,这些条件都是预先定义好的,是选择动画的一个依据。
动画的运行时状态定义了动画在播放时的所有相关信息,诸如当前放到哪一帧等等,我们都知道,动画数据中存的都是用关键帧(key-frame)信息,有时,AI程序员需要在动画的关键帧中添加一些自定义辅助信息,比如,假设我们想在某一帧之后就可以接下一个动画,那就可以在这一帧上打个标记来标识,再比如,我们想在身体某部位触到地面的时候发个声音,那也可以在动画中身体碰到地面的那一帧上打标记。再用前面那个倒挂金钩的例子,我们可能会在触球的那一帧上有个标记,在更新动画运行时状态的时候,我们就可以知道在这一帧,要把球踢出去了。所以,这些信息,都是需要被监控的,它会影响到游戏方方面面,不仅仅是给行为层来使用。
下面是示意图,可以看到动画运行时状态是可以在多动画间共享的,因为一般来说,同一时刻只会有一个动画在播放,如果会有多个动画的Blend,比如上下身分开的动画系统,可以仅关心需要关心的那个主要动画的运行状态。所以动画运行时状态也可以称为“当前动画运行时状态”。
有了动画,有了动画选择的条件后,我们会发现,这和行为树(Behavior Tree)的结构很像,如果我们把动画看成行为树的节点(Node),把动画选择条件看成节点的前提(Precondition),那我们就可以用行为树来搭建这样一个“动画选择树”。用行为树还有一个好处是,由于控制节点的存在,所以对于一个请求,我们可以用序列节点,作出序列动画的能力,举个例子来说,我们有一个摔倒(Falling Down)的动画,然后后续想接不同的起身(Getup)动画来丰富行为,那用行为树的话,就可以很轻松的做到这点,看下图,我们用了一个序列节点和一个选择节点的组合。
对于动画运行信息呢,就比较自由,可以放在行为树中,也可以单独的做一个模块来更新。如果选择放在行为树中的话,可以在根节点使用并行控制节点(而不是一般的选择控制节点),然后左子树是更新动画运行信息,右子树是动画选择树,这样在更新的时候,就会又执行左子树(更新运行时状态),又执行右子树(根据新的请求选择动画),将动画运行时信息放在前面更新的原因是,我们在选择动画时,可能需要参考当前的动画运行状态,就像我们前面所说的那个接下一个动画的问题那样。所以一般推荐先更新动画信息,再选择新的动画。
如果想用行为树来做动画的选择和控制,最需要考虑的就是“叶节点的粒度问题”,如果叶节点是单个动画的话,对于动画量不大的游戏,还可以接受,但像我前面说的类似FIFA的这种有几千个动画的游戏,会导致行为树过于庞大,不好维护,所以,有时我们需要控制叶节点的粒度,比如,将叶节点针对一组动画(相关性很大的一些动画)等。
—————————————————————————————
作者:Finney
Blog:AI分享站(http://www.aisharing.com/)
Email:finneytang@gmail.com
本文欢迎转载和引用,请保留本说明并注明出处
—————————————————————————————