在开发《 Planet Coaster》期间,我非常有才华的同事Owen Mc Carthy开发了一个人群系统,使我们的公园充满了成千上万的智能代理,这些智能代理从目标到目标都在导航,并播放各种有趣的动画和交互方式。 在本文中,我将重点关注这些动画和交互,更准确地说,是系统的某些技术方面如何洒到动画团队的膝盖上。
人群中的每个成员实际上都是一个粒子,它根据AI决定要去的地方从A点流向B点。 如果客人想要停下来坐在长椅上,则客人需要离开该粒子流,完成其相互作用,然后无缝地回到人群中,而不会出现任何小故障或交叉。
当人群成员处于主要人群系统中时,其位置完全由其所附着的粒子控制。 速度或位置的任何变化均由系统驱动,其动画在现场编写,并采取一些预防措施以确保动画中的移动速度不会与粒子的速度不同步(这会导致很多滑动)。
当客人走近长凳时,他们将需要播放“坐下”动画,这将使客人离开长凳一定距离后一直坐着。 您无法以一个线性运动来对此进行动画处理,因为速度变化非常细微,客人的方向发生了转折,并且当他们停下来时需要一段时间才能坐在板凳上。 当来宾仍像流动的粒子一样行进时,无法实现这种控制水平。
简化了人群动画系统以提高性能,因此对于这种精确的运动水平,我们需要能够将交互的控制权交给动画师。 要花些时间来解决代码与艺术之间的鸿沟。
我们无法将来宾与其粒子分离,因为其所有物理信息和边界框等都绑定到该位置,因此我们需要编写相对于粒子运动而移动的动画, 以便在应用粒子运动时在动画中,最终的运动与我们创作时的运动相同。
我完全知道这可能没有任何意义,但我会尽力解释。
在客人决定要坐在长椅上的那一点上,客人将把目标设定为公园中距所说长椅正好X米的位置。 一旦达到此目标,在“运动”期间,客体的粒子将停止“流动”并开始以直线,线性插值的方式从其在人群中的位置平移到将要到达长凳上的位置。过渡到“坐下”动画。
为了确保动画保持我们创作时的外观,我们需要将来宾的粒子行为表示为Maya中的一个对象,并相对于动画的运动在每个帧上对“过渡到坐下”动画进行动画处理。客人的粒子位置。