引导行为旨在帮助机器人实现现实行为,它通过使用简单的作用力在人物周围产生逼真实时的引导。在这篇教程中,我将阐述追踪行为的基本理论和它的实现。
这些行为的想法由 Craig W. Reynolds提出来的,它们并不是一个基于涉及到路径规划或者全局计算的复杂算法策略,而是使用局部信息,比如邻近物体的作用力。这使得它们易于理解和实现,但也会产生很复杂的运动模式。
注意: Alt尽管本教程基于AS3和Flash,但是你可以把相同的技术和概念应用到任何游戏开发环境。前提是你对数学的矢量有基本的理解。
我们可以通过数学中的矢量得到引导行为的合作用力,因为所有分力都影响着角色的速度和位置,故而用矢量来表示作用力也是一种很好的方法。
尽管每一个矢量都有方向,但当我们提及到位置的时候,则把方向忽略掉。(我们假设位置矢量指向角色当前位置。
上面的图示表示角色在(x,y)处的速度为v(a,b),应用欧拉公式计算运动:
position = position + velocity
The 速度矢量的方向可以控制角色的运动趋势,矢量模长可以控制每一帧角色移动的步长。模长越大,角色移动越快。在保证速率不会超过确定值时,速率可以缩短,而这个确定值通常是最大值。下面就是一个展示上述方法的一个测试。
(移动鼠标来移动目标)
红色方块朝着目标(鼠标光标)移动。这种运动模式描述了没有施加任何引导作用力的追踪(seek)行为绿线表示速度矢量,计算如下:
velocity = normalize(target - position) * max_velocity
有一点要注意,在没有引导力的情况下,角色描绘笔直路线,当目标移动时,角色做出了即时变化。这种方法使得在当前路线和新路线之间的转换显得很唐突。
如果只有速度上的作用力,则角色将沿着速度矢量的方向直线行走。引导行为的想法就是通过施加作用力(称为引导力)来影响角色的运动。在这些力的基础上,角色就可以移动到不同的方向。
对于追踪行为,添加到角色上的引导力使得每一帧角色速度的变化平滑,从而避免了唐突的路线变化。当目标移动,角色会逐渐地改变其速度矢量,试图在新位置抵达目标。
追踪行为涉及到两个力:所需速度力和转向力
所需速度(desired velocity)是尽可能在最短路径上引导角色朝它目标运动的力(在两条直线之间,这是唯一施加在角色上的力),转向力(steering)是当前速度(current Velocity)减去所需速度(desired velocity)得出来的,它推动物体朝目标方向移动。
这些作用力计算如下:
desired_velocity = normalize(target - position) * max_velocity
steering = desired_velocity - velocity
转向力计算完之后,就要加到角色上(将被添加到速度力上)。每一帧给角色施加的转向力使得角色不会照旧的直线路线走,而是平滑地朝目标转向运动,描绘出了追踪路径(seek path)(下图橘黄色的曲线):
施加作用力后,速度/位置的计算式如下:
steering = truncate (steering, max_force) steering = steering / mass velocity = truncate (velocity + steering , max_speed) position = position + velocity
转向力会适量地截短以保证它不会超过角色所能把握的允许值。转向力也是由角色质量的不同而不同的,这使得不同质量的物体持有不同的运动速度。下面的flash是用来展示施加所有作用力后的追踪行为的一个测试:
每次目标移动,每个角色的所需速度矢量就会相应地改变。然而,速度矢量也会做几次改变来重新指向目标方向。最终的结果就是一个平滑的运动过度。
引导行为应用于逼真的运动模式。它主要思想是通过使用当前的信息计算并且施加作用力来创建各种行为。虽然其计算不难,但它也能制作出非常复杂的效果。
这篇教程描述了引导行为的基础,解释了追踪行为。在下一章中,我们将学习更多的行为。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务