修复Recast导航折返问题

原因分析:

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

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

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

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

 

image.png
从路径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;
    }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值