Steering Behaviors: Flee and Arrival 逃逸和到达

Flee

之前描述的seek行为基于两个力,一个是目标速度,一个是朝目标位置的推力。

desired_velocity = normalize(target - position) * max_velocity
steering = desired_velocity - velocity

desired_velocity在这里就是离目标位置的最短路径,根据目标点的位置和个体的位置相减得出,代表了一个以个体位置为起点,朝向目标点的力。

Seek steering behavior

Flee行为也用到这两个力,区别是它们被调整为使游戏个体远离目标位置。

Forces involved in the flee behavior

Flee行为中 desired_velocity 根据个体的位置和目标点的位置相减得出,产生了一个以目标点为起点,朝向个体的力。

最终合力的计算几乎和Seek行为一样:

desired_velocity = normalize(position - target) * max_velocity
steering = desired_velocity - velocity

在Flee行为中,desired_velocity 代表了个体逃离目标的最短路径,转向力会将个体推向目标速度方向。

比较在Seek行为 和 Flee行为里 desired_velocity 的关系,会得出以下的关系:

flee_desired_velocity = -seek_desired_velocity

同样在计算完转向力之后,它也必须和个体的速度向量合成来作用于个体。因为这一次转向力始终将个体推离目标位置,这将会产生一条逃离路径。Flee path

目前,不管多远距离目标位置都会影响到个体,可以通过添加一个影响范围来只在个体靠近目标点时作用。

我们看到Seek行为使个体向目标位置移动,当个体移动到目标点后,算法仍旧作用在个体之上,对它施加转向力,这会导致个体在目标点周围来回移动。

Arrival行为会规避个体移动超过目标点的现象,当个体靠近目标点时,它会使个体减速,最终停在目标点上。

行为被分成两个阶段,第一阶段是个体还远离目标点时,它的工作方式和之前介绍的Seek行为一样,第二阶段是个体靠近目标点时,在减速范围内。

Arrival behavior

当个体进入到减速范围内,它会持续减速直到停在目标点上。

当个体进入到减速范围内,速度会线性的衰减到 0,通过加入一个新的转向力来达到这个效果,这个转向力最终会变成 0 ,意味着最终个体在目标点上,不会再有任何别的力施加了。

/ If (velocity + steering) equals zero, then there is no movement
velocity = truncate(velocity + steering, max_speed)
position = position + velocity

function truncate(vector:Vector3D, max:Number) :void {
    var i :Number;
    i = max / vector.length;
    i = i < 1.0 ? i : 1.0;
    vector.scaleBy(i);
}

为了确保个体在它完全停止前线性的减速,速度不能直接设为 0,减速计算将会根据 个体到目标点的距离,和减速区域,得出一个线性的结果。

// Calculate the desired velocity
desired_velocity = target - position
distance = length(desired_velocity)

// Check the distance to detect whether the character
// is inside the slowing area
if (distance < slowingRadius) {
    // Inside the slowing area
    desired_velocity = normalize(desired_velocity) * max_velocity * (distance / slowingRadius)
} else {
    // Outside the slowing area.
    desired_velocity = normalize(desired_velocity) * max_velocity
}

// Set the steering based on this
steering = desired_velocity - velocity

steering = desired_velocity – velocity 如果距离比slowingRadius大,这意味着个体离目标点还远,那它的速度将保持为max_velocity。

如果距离比slowingRadius小,这意味着个体已经进入到减速区域,那以为着它应该减速。

表达式 distance / slowingRadius 会从1变化到 0,这种线性的变化会使速度平滑的变到0。

Arrival slowing factor

按照之前的描述,角色移动表达为下:

steering = desired_velocity - velocity
velocity = truncate (velocity + steering , max_speed)
position = position + velocity

根据之前说的个体 Steering运动的表达形式,如果desired_velocity降为0,那么转向力会是 –velocity那么它和速度方向的合力为 0,个体就不会运动了。

发表评论

邮箱地址不会被公开。