在checkPathValidity(检查所有agent的corridor的m_path是否有效)

如果是无效的要进行重新设置并且设置replan

首先获得第一个polygon,m_path[0]

这里,因为addagent的时候,ag->corridor.reset(ref, nearest);

m_path[0] = ref;

所以就算是没有设定目标,const int npath = ag->corridor.getPathCount();也是1

然后根据FirstPoly的polyref进行检查,isValidPolyRef

检查的条件是,可以获得poly和tile,并且passfilter

如果不是有效的则:

通过findNearestPoly-> queryPolygons找到最近的poly

用其返回的距离poly的最近点覆盖agentPos

如果没有找到NearestPoly,设置agent的state 为 DT_CROWDAGENT_STATE_INVALID

然后ag->corridor.fixPathStart主要是给corridor的m_path[0]设置成找到的这个点

把当前agent的ag->npos设置成我们计算出来的最近点

因为初始点是被设置过了,所以要replan = true;

同样的,对目标点进行isValidPolyRef检查

如果是无效的,用上面的方法,找到一个有效的来

设置到ag->targetPos

如果最终还是找不到targetRef

ag->targetState = DT_CROWDAGENT_TARGET_NONE

然后检查ag->corridor.isValid,其实就是检查这个corridor里面的m_path的所有poly是不是isValidPolyRef,如果有invalid的,则replan = true;

最后 如果需要replan :r

equestMoveTargetReplan 就是设置agent的targetRef, targetPos,以及state设置成DT_CROWDAGENT_TARGET_REQUESTING

=========================

dtNavMeshQuery::queryPolygons(const float* center, const float* halfExtents,

const dtQueryFilter* filter, dtPolyQuery* query):

计算center为中心halfExtents为半径的包围盒所触及的tiles

在所有触及到的tiles中执行queryPolygonsInTile

这个函数的用途就是为了对所有多边形执行process,进而找到最近的poly

如果找到了,我们就覆盖nearestPt

==============

queryPolygonsInTile(const dtMeshTile* tile, const float* qmin, const float* qmax,

const dtQueryFilter* filter, dtPolyQuery* query):

如果使用了bvtree:

{

float minx = dtClamp(qmin[0], tbmin[0], tbmax[0]) - tbmin[0];……

把center为中心halfExtents为半径的包围盒转换为这个相对于这个tile原点的相对位置

Bmax确保比bmin大1

接下来遍历bvtree,从数组中的第一个node开始,计算是否覆盖,

node->i如果大于零说明是叶子,表示其在本tile中的poly序号,否则就表示跨过多少个找其右边的儿子

接下来:

1 如果是叶子并且相交了并且通过了passfilter,记录下来这个node,这个node是一个polygon

如果记录的总数已经到达了batchSize的上限了则process,主要就是找到最近的点和最近的多边形,batchSize是一个批次的量,也就是说是按照批次进行处理的。

2 如果是叶子但是没有相交或者不是叶子但是相交了,那就node++,走下一个树根或者走当前树根的第一个节点

3 如果既不是叶子也没有相交,那就可以跨过去当前这个树根了,直接跨过-node->i个节点。

}

如果没有使用bvtree:

For(这个tile里面的所有polygon)

{

不可以是offmeshconnection并且必须passFilter

求出多边形的AABB

然后跟使用bvtree的情况下一样找到最近的点和最近的多边形

}

最后把没有满一个批次的,调用process进行处理。

=====================

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里面存的是 http://blog.sina.com.cn/s/blog_5d5c80840101bnhw.html 这里面的r

因为且

所以可以用r来作插值计算closest的坐标。

posOverPoly记录是否在多边形内

接下来计算m_nearestDistanceSqr,存的是点与这些多边形的最短的直线距离。

有一个情况除外,就是在posOverPoly的情况下,计算的是y轴的距离,如果比walkableClimb小的话,直接就选它了,否则就是记录高度距离的平方存在nearestDistanceSqr

然后找到距离最小的点,存在nearestDistanceSqr

}

checkPathValidity 检查所有agent的corridor的m_path是否有效的更多相关文章

  1. EBS与FMW集成工作流管理器的检查

    工作流管理器的检查点(DB层面): --1:数据库job aq参数设置,建议设置job_queue_processes>=10 select p.NAME,p.DESCRIPTION,p.VAL ...

  2. Python3网络爬虫(四):使用User Agent和代理IP隐藏身份《转》

    https://blog.csdn.net/c406495762/article/details/60137956 运行平台:Windows Python版本:Python3.x IDE:Sublim ...

  3. 自学Zabbix3.5.3-监控项item-zabbix agent 类型所有key

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 1. 温习       Zabbix server是Zabbix软件的中心进程. Server执行 ...

  4. open-falcon之agent

    功能 采集数据,解析数据,上报数据至transfer 基本涵盖了系统层面监控指标,直接将数据转换为metricValue形式,上报至transfer 支持插件采集,代码插件放可受git管理,放置在pl ...

  5. 使用User Agent和代理IP隐藏身份

    一.为何要设置User Agent 有一些网站不喜欢被爬虫程序访问,所以会检测连接对象,如果是爬虫程序,也就是非人点击访问,它就会不让你继续访问,所以为了要让程序可以正常运行,需要隐藏自己的爬虫程序的 ...

  6. Zabbix Agent报“listener failed: zbx_tcp_listen() fatal error: unable to serve on any address”

    一台服务器的Zabbix Agent升级后,在Zabbix Server发现Zabbix Agent无法访问.检查Zabbix Agent发现服务停止了,启动Zabbix Agent后,发现服务马上又 ...

  7. Zabbix Agent升级

      最近对Zabbix Server进行了升级,所以陆陆续续对Zabbix Agent也做了升级,下面是这几天工作的一个小结,鉴于经验有限和认知有限等各方面因素,下文很难面面俱到,如有疏漏或不足之处, ...

  8. Nutch源码阅读进程3---fetch

    走了一遍Inject和Generate,基本了解了nutch在执行爬取前的一些前期预热工作,包括url的过滤.规则化.分值计算以及其与mapreduce的联系紧密性等,自我感觉nutch的整个流程是很 ...

  9. 数据挖掘_wget整站下载

    你应该了解的所有wget命令 翻译自All the Wget Commands You Should Know 如何下载整个网站用来离线浏览?怎样将一个网站上的所有MP3文件保存到本地的一个目录中?怎 ...

随机推荐

  1. tomcat7的安装与maven安装

    tomcat7的安装与配置: 下载tomcat7 :wget 地址 解压:tar -zxvf 文件名 编辑tomcat目录下的conf下的server.xml文件: <Connector por ...

  2. js、jq获取屏幕宽高

    参考资料 JS,Jquery获取各种屏幕的宽度和高度

  3. 「luogu2486」[SDOI2011] 染色

    https://www.luogu.org/problemnew/show/P2486 轻重链剖分后,问题转化为一个链上的问题: 线段树维护区间内的颜色段数量,左端点.右端点的颜色: 线段树注意事项 ...

  4. PHP 【四】

    数组 $string = array(x,y,z); <?php$cars=array("Volvo","BMW","Toyota") ...

  5. Lua中的类型与值

    [基础介绍] Lua是一种动态类型的语言.在语言中没有类型定义的语法,每个值都带有其自身的类型信息.在Lua中有8中基本类型,分别是: nil(空)类型 boolean(布尔)类型 number(数字 ...

  6. Lua中的迭代器与泛型for

    [前言] 迭代器就是一种可以遍历一种集合中所有元素的机制,在Lua中,通常将迭代器表示为函数.每调用一次函数,就返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之后保存一些状态,这样才能知道 ...

  7. Beta冲刺(6/7)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(6/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 ppt制作 视频拍摄 接下来的计划 准备答辩 ...

  8. 进入js

    JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECM ...

  9. Improved dual-mode compressive tracking integrating balanced colour and texture features

    <改进的集成平衡颜色和纹理特征的双模压缩跟踪> 摘要:将跟踪问题视为分析目标和背景信息的分类问题的判别跟踪方法可以实现最先进的性能.作为一个高性能判别器,压缩跟踪近来受到很多关注.然而,当 ...

  10. SSM(SpringMVC Spring Mybatis)框架整合搭建

    1.新建一个web工程. 2.首先看一下整体的框架结构: 3.将ssm框架搭建所需要的jar包复制到lib目录下 3.需要配置各个配置文件. 1)配置web.xml文件: <?xml versi ...