修复Recast导航折返问题

原因分析:

最近在使用 recastnavigation 寻路时,遇到一个奇怪的问题

这里的agent使用的crowd移动工具,有时候移动的时候会出现,在一条直线上,没有其他阻碍的情况下,agent会出现中途减速,或者来回折返

这种情况在沿tile边界,或者拐角时容易出现。

在寻路的路径出现的折返的情况,如图

 

修复Recast导航折返问题
从路径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;
    }

 

上一篇:实验2:Open vSwitch虚拟交换机实践


下一篇:11月15日 课堂笔记