dtFindNearestPolyQuery :: process(const dtMeshTile* tile, dtPoly** polys, dtPolyRef* refs, int count):找到最近的点和最近的多边形
For(每一个poly)
{
计算m_center跟这个poly的最近点,dtNavMeshQuery::closestPointOnPoly(dtPolyRef ref, const float* pos, float* closest, bool* posOverPoly):
通过dtDistancePtPolyEdgesSqr(pos, verts, nv, edged, edget)计算出,pos对于每条边的最近距离,并且存在edged里面,函数返回值表示点是否在多边形内部。
找到距离最小的那条边的两个顶点va,vb
dtVlerp(closest, va, vb, edget[imin]); 根据edget对va,vb进行插值,求得多边形上距离pos最近的点closest
edget里面存的是 这里面的r
因为且
所以可以用r来作插值计算closest的坐标。
posOverPoly记录是否在多边形内
接下来计算m_nearestDistanceSqr,存的是点与这些多边形的最短的直线距离。
有一个情况除外,就是在posOverPoly的情况下,计算的是y轴的距离,如果比walkableClimb小的话,直接就选它了,否则就是记录高度距离的平方存在nearestDistanceSqr
然后找到距离最小的点,存在nearestDistanceSqr
}
//process完毕