for (intj= 0; j < ag->nneis;++j)
{
对于所有的neighbour
dtVsub(diff,ag->npos,nei->npos);
算出我到neighbour的向量,是二维平面的
如果其长度小于separationDist
说明进入了Separation的范围
算出weight= separationWeight * (1.0f - dtSqr(dist*invSeparationDist));
算是一个弹力
并且说明separationDist不能大于collisionQueryRange
然后dtVmad(disp,disp,diff,weight/dist);
与之前的neibour生成的弹力加到一起形成合力
w += 1.0f;
w相当于计数
}
if (w> 0.0001f)如果受到了力
{
dtVmad(dvel,dvel,disp,1.0f/w);
相当于在原来的速度上面,加上力*系数
系数是受到了多少个合力的数量的倒数
也就是说碰我的人越多收到的力的影响反倒越小(如果他们之间有抵消的话)
这样可以防止同时受到了多个同方向的力导致一下子力影响很大
如果经过上面的计算之后的速度的大小已经超过了ag->desiredSpeed
那就要Clampdesired velocity to desired speed.