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

在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

}

 

转载于:https://www.cnblogs.com/icebergliu/p/8869628.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

来谈谈JAVA面向对象 - 鲁班即将五杀,大乔送他回家??

开发IDE为Eclipse或者MyEclipse。 首先,如果我们使用面向过程的思维来解决这个问题,就是第一步做什么,第二步做什么? 鲁班即将五杀,大乔送他回家 这个现象可以简单地拆分为两步,代码大概是这个样子的: publ…

Vue 教程第一篇——基础概念

认识 Vue 关于 Vue 的描述有不少,不外乎都会拿来与 Angular 和 React 对比,同样头顶 MVVM 双向数据驱动设计模式光环的 Angular 自然被对比的最多,但到目前为止,Angular 在热度上已明显不及 Vue,性能已成为最大的诟病。…

Microsoft Teams的Outgoing Webhook开发入门

Microsoft Teams的应用程序有几种形式: TabsBotsConnectorsMessaging extensionsActivity feed integrationsOutgoing web hooks 这篇我们主要介绍如何使用 ASP.NET Core来开发最简单的Outgoing web hook。 什么是outgoing webhook Outgoing webhooks allow you t…

0418 jQuery笔记(添加事件、each、prop、$(this))

1.添加点击事件、each、prop、$(this) 1 //全选框的被动操作2 //定义一个标志保存最终状态3 var flag false;4 //为每一个选择框添加点击事件,数组.click()5 $(.chex).click(function(){6 //遍历数组,数组.each()7 …

[WC2008]游览计划(斯坦纳树)

[Luogu4294] 题解 : 斯坦纳树 \(dp[i][j]\) 表示以\(i\)号节点为根,当前状态为\(j\)(与\(i\)连通的点为\(1\)) 当根\(i\)不改变时状态转移方程是: \(dp[i][j] \min_{s \in j}\{dp[i][s] dp[i][\complement_js] - val[i]\}\) 当根…

使用dotnet template快速开发Microsoft Teams Outgoing Web Hook

在上一篇文章中,我们一步步从无到有在Microsoft Teams中开发了一个简单的Outgoing Webhook,并和我们本地的Web API应用程序产生交互,总结起来的步骤大概如下: 导航到“团队” Tab页, 选中需要建立的Channel, 选中“应…

[Swift]LeetCode1013. 将数组分成和相等的三个部分 | Partition Array Into Three Parts With Equal Sum...

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址&a…

京津冀产业协同升级 智慧城市等高端产业需求遇热

云计算、智慧交通、城市环保科技等高端智慧城市产业项目正成为京津冀产业协同的新关注点。 21日,在由北京市经信委、天津市工信委、河北省工信厅联合组织的京津冀产业协同发展招商推介专项行动上,超过200家与会企业共完成产业对接项目额达311.7亿元。与以…

Microsoft Teams:删除成员账户其历史聊天会发生什么?

介绍: 此博客文章的目的是演示从Office 365删除用户的账号后,此用户在Microsoft Teams群聊和私聊中的历史聊天记录会发生什么改变。 以下是Microsoft Teams聊天对话,其中Adele和其他团队成员正在参与对话: 此外, Adele和Mega还在…

PostgreSQL Huge Page 使用建议 - 大内存主机、实例注意

标签 PostgreSQL , Linux , huge page , shared buffer , page table , 虚拟地址 , 物理地址 , 内存地址转换表 背景 当内存很大时,除了刷脏页的调度可能需要优化,还有一方面是虚拟内存与物理内存映射表相关的部分需要优化。 1 脏页调度优化 1、主要包括…

Microsoft Teams:团队Owner离开公司后,我们该怎么做?

您是否曾在这么一个团队里,该团队唯一有Owner权限的人离开了公司?不幸的是,如果这个人不再在公司里,您可能觉得没有办法让其他团队成员再成为team的owner。我有一个简单易用的解决方案,但您需要成为Office 365租户的Admin或联系你…

python网络编程-socket编程

一、服务端和客户端 BS架构 (腾讯通软件:serverclient) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二、OSI七层模型 互联网协议按照功能不同分为osi七层或tcp/ip五…

使用PowerShell配置Microsoft Teams

作为 IT 专业人员, 我一直在寻找自动化任务的方法, 并使日常操作简单。当使用Microsoft Teams时, 是否能够在团队中自动创建团队,渠道和设置对于Microsoft Teams组建的成功与否至关重要。PowerShell对Microsoft Teams的支持使您可以做到这一点,它为我提供…

常见Kotlin高频问题解惑

在笔者的Kotlin交流群里,不少同学反复遇到了一些相似的问题。这些问题大都比较基础,但又容易产生误解。因此,我决定写一篇文章,整理群里同学遇到的一些问题 变量和常量的使用 在Kotlin语言中,我们使用var声明变量&…

关于神经网络训练的一些建议笔记

关于网络训练时的参考建议: 1.train loss不断下降,test loss不断下降,网络正在学习 2.train loss不断下降,test loss趋于不变,网络过拟合,需要增大数据;减小网络规模dropout;权重衰减…

Microsoft Teams的保留策略

Microsoft Teams保留策略现在可在Office 365安全性和合规性中心里进行配置 今天,我们很自豪地宣布,我们正在开始推出针对Microsoft Teams的保留策略。 推出预计将在未来几周内完成。 通过此次发布,Teams管理员可以使用Office 365安全性和合规…

八年溯源,如何巧搭区块链

虎嗅注:区块链正在逐步商业化,但最大的挑战是共识。 为什么这样说?因为商品的溯源防伪业务在过去正是因为缺乏信任感而没有得到普及,这是每个溯源从业者最大的感受。 在虎嗅虎跑团每两周一次线上分享会上,溯源链创始人…

数字签名过程及数字证书

数字签名是什么? 作者:David Youd 翻译:阮一峰 原文网址:http://www.youdzone.com/signature.html 1.鲍勃有两把钥匙,一把是公钥,另一把是私钥。 2.Bob把公钥送给他的朋友们-Pat、Doug、Susan-- 每人一把…

Teams与OneDrive for Business和SharePoint的关系

作为一个相对看重个人信息安全与隐私的人,个人附件等资料在Microsoft Teams中的存储方式、文件访问权限、可见范围问题引起了我的好奇。 众所周知,Teams包含3大主要的模块:单人聊天、团队、会议。那下面让我们一起来看一下,对这三…

hadoop学习笔记(二):centos7三节点安装hadoop2.7.0

环境win7vamvare10centos7 一、新建三台centos7 64位的虚拟机 master 192.168.137.100 root/123456 node1 192.168.137.101 root/123456 node2 192.168.137.102 root/123456 二、关闭三台虚拟机的防火墙,在每台虚拟机里面执行: systemctl sto…