在行为控制中的所有的算法实现都是通过数学上的向量计算来实现的。由于这个控制会改变人物的速度和位置,所以同样的我们也可以使用向量来表示这些属性。
虽然向量拥有一个方向,但是当用向量来表示一个位置的时候,我们往往可以忽略它的方向:
上面的图中P向量表示的是一个点(x,y),V向量表示的是一个速度(a,b),我们可以通过欧拉积分的方法来计算人物新的位置:
position = position + velocity ;
速度向量的方向控制了一个人物将要向哪个方向移动,速度向量的大小控制了人物每一帧将会移动多少距离。这个长度越大,那么人物每一帧移动的距离就会越大。我们可以通过速度向量的长度来确保,速度的大小不会高于某个指定的值。
我们可以通过施加力来实现seek行为,也可以不施加力,仅仅施加一个改变速度,也能够模拟出来。比如如下的代码阐述了在不施加力的情况下如何进行seek行为:
velocity = normalize(target - position) * max_velocity ;
我们需要注意的是,如果不使用施加力的方式,那么一旦seek的目标发生了变化,人物的速度也运动方向将会在瞬间发生改变,所以就会变得不是那么的圆滑。
如果只有速度方向上的力参与改变的话,那么人物角色将会沿着一条直线进行运动。所以,我们可以通过增加一个力来改变人物的移动,不同的力将会导致物体移动向不同的方向上去。
对于seek行为来说,每一帧增加一点控制力将会很平滑的改变人物移动的速度和方向,避免出现瞬间改变方向的问题。当目标发生移动的时候,施加力的方案也能够很好的平滑的改变速度,使得人物到达目标点。
seek行为需要如下的两种向量:期望速度和控制力:
上图中的desired velocity就是最终人物要到达的速度方向。而steering就是需要增加到人物上面的行为控制力,通过这个控制力,就会将人物推向了目标地点。
这些力可以通过如下的算法求得:
desired_velocity = normalize(target - position) * max_velocity ;
steering = desired_velocity - velocity ;
当控制力计算出来之后,我们就需要将这个力添加到人物中去。每一帧我们都需要计算新的steering控制力,这样才能够保证每一帧物体都是朝着目标的方向前进的。下图中可以看出,我们的seek路径并不是一条直线,而是很平滑的一条曲线:
下面的代码表示了如何增加力:
steering = truncate(steering, max_force);
steering = steering / mass ;
velocity = truncate( velocity + steering, max_speed);
position = position + velocity ;
上面的计算方式保证了,我们添加的力在可允许的范围之内。我们还将这个力除以了人物的质量,这样就会产生不同质量的物体,他们改变的频率并不一致,所以这样就会看上去更加的丰富了。
行为控制能够产生很多不同的,比较真实的移动效果。我们很容易的就能够通过当前的信息计算出新的控制行为出来。即使计算的方法非常的简单,但是,我们依然能够创建出很多比较有趣和复杂的运动方法出来。
Understanding Steering Behaviors: Seek (行为控制-寻找),布布扣,bubuko.com
Understanding Steering Behaviors: Seek (行为控制-寻找)
原文地址:http://blog.csdn.net/i_dovelemon/article/details/36380409