当前位置: 首页 > news >正文

【golang/navmesh】使用recast navigation进行寻路

目录

  • 说在前面
  • 安装
  • 使用
  • 可视化

说在前面

  • go version:1.20.2 linux/amd64
  • 操作系统:wsl2
  • detour-go版本:v0.2.0
  • github:这里,求star!

安装

  • 使用go mod安装即可
    go get github.com/o0olele/detour-go
    

使用

  • 使用场景模型构建navmesh
    • 通过recast navigation demo进行构建;构建完成后点击Save保存二进制文件
      在这里插入图片描述
    • 通过在线工具构建;完成后点击Export as Recast NavMesh保存二进制文件
      在这里插入图片描述
  • 使用detour-go加载二进制navmesh文件
    var mesh = loader.LoadTileMesh("./navmesh.bin")
    if mesh == nil {panic("load mesh failed.")
    }
    
  • 进行寻路
    // 初始化nav mesh query
    var meshQuery = detour.DtAllocNavMeshQuery()
    var status = meshQuery.Init(mesh, 2048)
    if detour.DtStatusFailed(status) {panic("init mesh query failed.")
    }// 初始化 query filter
    var meshFilter = detour.DtAllocDtQueryFilter()// 确定寻路起点
    var agentPos [3]float32
    var agentHalfExtents = [3]float32{1, 0.75, 1}
    var agentNearestPoly detour.DtPolyRef
    status = meshQuery.FindNearestPoly(agentPos[:], agentHalfExtents[:], meshFilter, &agentNearestPoly, agentPos[:])
    if detour.DtStatusFailed(status) {panic("find closest point failed.")
    }// 确定寻路终点
    var agentTarget = [3]float32{1.1322085857391357, 10.197294235229492, -5.400757312774658}
    var agentTragetRef detour.DtPolyRef
    status = meshQuery.FindNearestPoly(agentTarget[:], agentHalfExtents[:], meshFilter, &agentTragetRef, agentTarget[:])
    if detour.DtStatusFailed(status) {panic("find agent target closest point failed.")
    }// 寻路
    var path [256]detour.DtPolyRef
    var pathCount int
    meshQuery.FindPath(agentNearestPoly, agentTragetRef, agentPos[:], agentTarget[:], meshFilter, path[:], &pathCount, 256)// 详细路径
    var straightPath [256 * 3]float32
    var straightPathFlags [256]detour.DtStraightPathFlags
    var straightPathRef [256]detour.DtPolyRef
    var straightPathCount int
    meshQuery.FindStraightPath(agentPos[:], agentTarget[:], path[:], pathCount, straightPath[:], straightPathFlags[:], straightPathRef[:], &straightPathCount, 256, 0)
    fmt.Println(straightPath[:straightPathCount*3])
    

可视化

  • 复制examples/web下的文件
    go run main.go
    
  • 在浏览器中访问http://localhost:9001/public
    在这里插入图片描述
  • 点击LoadTileMesh,选择刚刚保存的二进制navmesh文件
    在这里插入图片描述
  • 点击Add Agent,添加一个agent
    在这里插入图片描述
  • 鼠标左键选择移动的目标点

在这里插入图片描述

相关文章:

【golang/navmesh】使用recast navigation进行寻路

目录 说在前面安装使用可视化 说在前面 go version:1.20.2 linux/amd64操作系统:wsl2detour-go版本:v0.2.0github:这里,求star! 安装 使用go mod安装即可go get github.com/o0olele/detour-go使用 使用场景模型构建n…...

【软考】Redis不同的数据类型和应用场景。

Redis的不同数据类型和对应的应用场景: Redis 数据类型及其应用场景 String(字符串) 特点:简单的值存储,支持二进制数据。应用场景: 缓存用户会话。缓存小的配置文件。缓存计数器。文章浏览量&#xff0…...

java 对人名和电话 脱敏-replaceAll

学习了《正则匹配人名》和《正则匹配电话号码》,如果要一起进行脱敏处理,改怎么做? 脱敏的,考虑配置规则,进行匹配的方式进行处理: 脱敏规则: DesensitizationRules Data public class Desens…...

计算机网络:网络层 —— 网络地址转换 NAT

文章目录 网络地址转换 NAT 概述最基本的 NAT 方法NAT 转换表的作用 网络地址与端口号转换 NAPTNAT 和 NAPT 的缺陷 网络地址转换 NAT 概述 尽管因特网采用了无分类编址方法来减缓 IPv4 地址空间耗尽的速度,但由于因特网用户数量的急剧增长,特别是大量小…...

【Pikachu靶场:XSS系列】xss之过滤,xss之htmlspecialchars,xss之herf输出,xss之js输出通关啦

一、xss之过滤 <svg onloadalert("过关啦")> 二、xss之htmlspecialchars javascript:alert(123) 原理&#xff1a;输入测试文本为herf的属性值和内容值&#xff0c;所以转换思路直接变为js代码OK了 三、xss之href输出 JavaScript:alert(假客套) 原理&#x…...

面向制造和装配的产品设计指南(二):面向装配的设计指南

参考引用 面向制造和装配的产品设计指南 1. 概述 1.1 装配的概念 装配是指把多个零件组装成产品&#xff0c;使得产品能够实现相应的功能并体现产品的质量&#xff0c;装配包含三层含义 把零件组装在一起实现相应的功能体现产品的质量 1.2 最好和最差的装配工序 1.3 面向装…...

Python中的PDF处理工具:PyPDF2和ReportLab使用指南

Python中的PDF处理工具&#xff1a;PyPDF2和ReportLab使用指南 在日常工作和项目中&#xff0c;PDF 文件处理是个常见需求&#xff0c;不论是合并报告、加密文档、填充表单&#xff0c;还是生成发票。Python 中有许多用于操作 PDF 文件的库&#xff0c;其中 PyPDF2 和 ReportL…...

【vxe-table】多选筛选项对列表的列进行动态的显示与隐藏

需求&#xff1a; 列表的组成部分由&#xff1a;一些固定的列&#xff0c;如:姓名&#xff0c;工号&#xff0c;以及 需要动态显示与隐藏的列&#xff0c;如&#xff1a;出勤、旷工、事假、病假等假勤类型 1、通过多选框多选&#xff0c;展示选中的列&#xff0c;未选中的不展示…...

微信小程序uniapp+vue飞机订票航空售票系统

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 对于小程序飞机订票信息管理所牵扯的信息管理及数据保存都是非常多的&#xff0c;举例像所有的管理员&#xff1b;管理员…...

如何取消Outlook中的循环会议

如何取消Outlook中的循环会议 参考链接&#xff1a;https://iknow.lenovo.com.cn/detail/195430 1、打开Outlook&#xff0c;进入 日历 视图界面&#xff1b; 2、 选择并双击要取消的循环会议&#xff1b; 3、 在 打开定期项目 对话框中选择整个序列&#xff0c;然后单击 确…...

Docker-- cgroups资源控制实战

上一篇&#xff1a;容器化和虚拟化 什么是cgroups&#xff1f; cgroups是Linux内核中的一项功能&#xff0c;最初由Google的工程师提出&#xff0c;后来被整合进Linux内核; 它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内&#xff0c;从而为系统…...

使用Python和Vosk库实现语音识别

使用Python和Vosk库实现语音识别 在人工智能和机器学习领域&#xff0c;语音识别技术正变得越来越重要。Python作为一种强大的编程语言&#xff0c;拥有丰富的库和框架&#xff0c;可以方便地实现语音识别功能。今天&#xff0c;我们将介绍如何使用Python中的SpeechRecognitio…...

stm32使用串口的轮询模式,实现数据的收发

------内容以b站博主keysking为原型&#xff0c;整理而来&#xff0c;用作个人学习记录。 首先在STM32CubeMX中配置 前期工作省略&#xff0c;只讲重点设置。 这里我配置的是USART2的模式。 会发现&#xff0c;PA2和PA3分别是TX与RX&#xff0c;在连接串口时需要TX对RX&…...

105. UE5 GAS RPG 搭建主菜单

在这一篇&#xff0c;我们将实现对打开游戏显示的主菜单进行搭建&#xff0c;主菜单将显示游戏主角&#xff0c;游戏名称和进入游戏和退出游戏两个按钮。 搭建菜单场景 我们将主菜单设置为一个单独的场景&#xff0c;前面可以显示对应的UI控件&#xff0c;用于玩家操作&#…...

基于 JAVASSM(Java + Spring + Spring MVC + MyBatis)框架开发一个医院挂号系统

基于 JAVASSM&#xff08;Java Spring Spring MVC MyBatis&#xff09;框架开发一个医院挂号系统是一个实用的项目。 步骤一&#xff1a;需求分析 明确系统需要实现的功能&#xff0c;比如&#xff1a; 用户注册和登录查看医生列表预约挂号查看预约记录取消预约管理员管…...

Golang | Leetcode Golang题解之第540题有序数组中的单一元素

题目&#xff1a; 题解&#xff1a; func singleNonDuplicate(nums []int) int {low, high : 0, len(nums)-1for low < high {mid : low (high-low)/2mid - mid & 1if nums[mid] nums[mid1] {low mid 2} else {high mid}}return nums[low] }...

影刀RPA实战:嵌入python,如虎添翼

1. 影刀RPA与Python的关系 影刀RPA与Python的关系可以从以下几个方面来理解&#xff1a; 技术互补&#xff1a;影刀RPA是一种自动化工具&#xff0c;它允许用户通过图形化界面创建自动化流程&#xff0c;而Python是一种编程语言&#xff0c;常用于编写自动化脚本。影刀RPA可以…...

es 数据清理delete_by_query

POST /索引名/_delete_by_query?conflictsproceed&scroll_size2000&wait_for_completionfalse&slices36 {"size": 2000, "query": {"bool": { "must": [{"terms": {"rule_id": [800007]}}]}} }slice…...

【每日 C/C++ 问题】

一、C 中类的三大特性是什么&#xff1f;请简要解释。 封装、继承、多态 封装&#xff1a;将事物的属性&#xff08;成员变量&#xff09;和行为&#xff08;成员函数&#xff09;封装在一起形成一个类。并且可以设置相应的访问权限&#xff08;私有的 受保护的 公有的&#…...

stm32学习4

学习目录 一.流水灯1.创建文件2.编写相关代码 一.流水灯 1.创建文件 将方法进行分类保存在不同的 .c 文件中&#xff0c;方便复用和寻找&#xff1b; 创建Hardware\LED文件&#xff0c;其中有led.c和led.h文件&#xff0c;用于存放有关LED灯操作的方法&#xff1b; 在User文…...

CentOS 7上解决soffice转换doc到docx报错‘no export filter‘的完整指南(附字体安装)

CentOS 7服务器深度修复&#xff1a;soffice文档转换no export filter全链路解决方案当你在CentOS 7服务器上执行soffice --convert-to docx命令时&#xff0c;终端突然抛出Error: no export filter的红色警告——这不是简单的命令错误&#xff0c;而是典型的环境依赖链断裂。作…...

从零读懂RDMA流控机制:为什么RC需要“信用”

我们在之前的文章里讲过,RDMA RC(可靠连接)模式像一条点对点的专用通道:发送端发数据,接收端确认,丢了包硬件重传。一切看起来很简单,但有一个关键问题没解决: 发送端怎么知道接收端“吃得下”自己发过去的数据? 如果发送端不管不顾地疯狂发,而接收端处理不过来,数据…...

Unity Play Mode状态保存原理与实战配置指南

1. 为什么“Play Mode Save”不是个噱头&#xff0c;而是Unity开发者每天都在默默忍受的痛点你有没有过这样的经历&#xff1a;在Unity编辑器里调试一个带状态的敌人AI&#xff0c;刚给它加了血量、仇恨目标、技能冷却计时器&#xff0c;正准备按Play键验证行为逻辑——结果一按…...

深度学习优化器原理与图像分类实战指南

1. 项目概述&#xff1a;为什么优化器不是“调参配菜”&#xff0c;而是图像分类器的“神经节律控制器”你训练一个ResNet-50做CIFAR-10分类&#xff0c;学习率设成0.1&#xff0c;用SGD跑50轮&#xff0c;测试准确率卡在87.3%&#xff1b;换Adam&#xff0c;同样0.1学习率&…...

05-系统技术架构师必备——软件工程方法与UML建模体系

关键词&#xff1a;UML建模、Scrum、敏捷开发、软件测试、白盒测试、McCabe复杂度、瀑布模型、RUPUML 软件工程 敏捷开发 软件测试 Scrum RUP 系统架构 建模系统技术架构师必备——软件工程方法与UML建模体系 摘要 UML建模和软件工程方法是系统技术架构师与开发团队沟通的"…...

2026年,探寻靠谱体育器材的终极指南

在追求健康与活力的时代&#xff0c;体育器材成为了我们运动生活中的重要伙伴。但面对市场上琳琅满目的品牌和产品&#xff0c;如何选择靠谱的体育器材成为了许多人的难题。今天&#xff0c;让我们一同探寻 2026 年靠谱体育器材的终极指南。一、品质与口碑沧州九牌体育用品制造…...

CANN-Profiler-昇腾NPU上推理慢到底慢在哪

推理服务上线前最重要的一步是性能 Profiling。ATB 的推理速度不达标&#xff0c;可能有十几个原因——不拿数据说话就是瞎猜。CANN Profiler 给你精确到每个 kernel 的执行时间。 开启 Profiling import torch_npu# 方法 1&#xff1a;Python API with torch_npu.profiler.pro…...

AI赋能百业,从城市治理到智能家居,这些应用场景让你大开眼界!

文章深入探讨了人工智能在各个领域的创新应用&#xff0c;包括城市治理、医疗、金融、教育、交通出行、零售电商、制造、能源、农业、智能家居、娱乐传媒、文化旅游等。通过具体的案例和技术手段&#xff0c;展示了AI如何提升效率、优化决策、改善生活质量。例如&#xff0c;成…...

顶伯 + 微软 TTS 对比 Edge 浏览器自带 TTS,差距有多大?

付费 vs 免费&#xff1a;顶伯 微软 TTS 对比 Edge 浏览器自带 TTS&#xff0c;差距有多大&#xff1f;在文字转语音领域&#xff0c;微软 TTS 技术一直备受好评&#xff0c;但不同平台的实现方式却带来截然不同的体验。顶伯文字转语音工具深度整合了微软 TTS 引擎&#xff0c…...

告别弃用参数:Kubelet连接containerd的正确姿势(附config.toml避坑指南)

告别弃用参数&#xff1a;Kubelet连接containerd的正确姿势&#xff08;附config.toml避坑指南&#xff09; 在Kubernetes集群的日常运维中&#xff0c;kubelet与容器运行时的连接配置是一个看似简单却暗藏玄机的环节。许多管理员习惯性地沿用旧版本参数&#xff0c;殊不知Kube…...