原因分析:
最近在使用 recastnavigation 寻路时,遇到一个奇怪的问题
这里的agent使用的crowd移动工具,有时候移动的时候会出现,在一条直线上,没有其他阻碍的情况下,agent会出现中途减速,或者来回折返
这种情况在沿tile边界,或者拐角时容易出现。
在寻路的路径出现的折返的情况,如图
从路径A-C,理论上不应该出现 A-B-C因为没必要经过B,应该是tile数据有点问题导致这个情况
解决方案:先做一个简单处理,把findStraightPath的找到的路径,做一次校验,过滤掉折返点
int FixedPath(
int ncorners,
float* cornerVerts,
unsigned char* cornerFlags,
dtPolyRef* cornerPolys) {
if (ncorners < 2) {
return ncorners;
}
// 过滤共线折返路点
const float* p0 = cornerVerts;
const float* p1 = cornerVerts + 3;
const float* p2 = cornerVerts + 6;
// 起点不覆盖
for (int i = 1; i < ncorners - 1;)
{
if (cornerFlags[i] & DT_STRAIGHTPATH_OFFMESH_CONNECTION) {
break;
}
// 共线
if (dtAbs(dtTriArea2D(p0, p1, p2)) < dtSqr(0.1f)) {
// 反向
if ((p1[0] - p0[1])*(p2[0] - p1[0]) < 0
|| (p1[2] - p0[2])*(p2[2] - p1[2]) < 0) {
--ncorners;
memmove(cornerFlags + i, cornerFlags + i + 1, sizeof(unsigned char)*(ncorners - i));
memmove(cornerPolys + i, cornerPolys + i + 1, sizeof(dtPolyRef)*(ncorners - i));
memmove(cornerVerts + 3 * i, cornerVerts + 3 * (i + 1), sizeof(float) * 3 * (ncorners - i));
continue;
}
}
++i;
p0 = p1;
p1 = p2;
p2 += 3;
}
<span style="color:red">re</span>turn ncorne<span style="color:red">r</span>s;
}