【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保存二进制文件

- 通过recast navigation demo进行构建;构建完成后点击
- 使用
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(字符串) 特点:简单的值存储,支持二进制数据。应用场景: 缓存用户会话。缓存小的配置文件。缓存计数器。文章浏览量࿰…...
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) 原理:输入测试文本为herf的属性值和内容值,所以转换思路直接变为js代码OK了 三、xss之href输出 JavaScript:alert(假客套) 原理&#x…...
面向制造和装配的产品设计指南(二):面向装配的设计指南
参考引用 面向制造和装配的产品设计指南 1. 概述 1.1 装配的概念 装配是指把多个零件组装成产品,使得产品能够实现相应的功能并体现产品的质量,装配包含三层含义 把零件组装在一起实现相应的功能体现产品的质量 1.2 最好和最差的装配工序 1.3 面向装…...
Python中的PDF处理工具:PyPDF2和ReportLab使用指南
Python中的PDF处理工具:PyPDF2和ReportLab使用指南 在日常工作和项目中,PDF 文件处理是个常见需求,不论是合并报告、加密文档、填充表单,还是生成发票。Python 中有许多用于操作 PDF 文件的库,其中 PyPDF2 和 ReportL…...
【vxe-table】多选筛选项对列表的列进行动态的显示与隐藏
需求: 列表的组成部分由:一些固定的列,如:姓名,工号,以及 需要动态显示与隐藏的列,如:出勤、旷工、事假、病假等假勤类型 1、通过多选框多选,展示选中的列,未选中的不展示…...
微信小程序uniapp+vue飞机订票航空售票系统
文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 对于小程序飞机订票信息管理所牵扯的信息管理及数据保存都是非常多的,举例像所有的管理员;管理员…...
如何取消Outlook中的循环会议
如何取消Outlook中的循环会议 参考链接:https://iknow.lenovo.com.cn/detail/195430 1、打开Outlook,进入 日历 视图界面; 2、 选择并双击要取消的循环会议; 3、 在 打开定期项目 对话框中选择整个序列,然后单击 确…...
Docker-- cgroups资源控制实战
上一篇:容器化和虚拟化 什么是cgroups? cgroups是Linux内核中的一项功能,最初由Google的工程师提出,后来被整合进Linux内核; 它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内,从而为系统…...
使用Python和Vosk库实现语音识别
使用Python和Vosk库实现语音识别 在人工智能和机器学习领域,语音识别技术正变得越来越重要。Python作为一种强大的编程语言,拥有丰富的库和框架,可以方便地实现语音识别功能。今天,我们将介绍如何使用Python中的SpeechRecognitio…...
stm32使用串口的轮询模式,实现数据的收发
------内容以b站博主keysking为原型,整理而来,用作个人学习记录。 首先在STM32CubeMX中配置 前期工作省略,只讲重点设置。 这里我配置的是USART2的模式。 会发现,PA2和PA3分别是TX与RX,在连接串口时需要TX对RX&…...
105. UE5 GAS RPG 搭建主菜单
在这一篇,我们将实现对打开游戏显示的主菜单进行搭建,主菜单将显示游戏主角,游戏名称和进入游戏和退出游戏两个按钮。 搭建菜单场景 我们将主菜单设置为一个单独的场景,前面可以显示对应的UI控件,用于玩家操作&#…...
基于 JAVASSM(Java + Spring + Spring MVC + MyBatis)框架开发一个医院挂号系统
基于 JAVASSM(Java Spring Spring MVC MyBatis)框架开发一个医院挂号系统是一个实用的项目。 步骤一:需求分析 明确系统需要实现的功能,比如: 用户注册和登录查看医生列表预约挂号查看预约记录取消预约管理员管…...
Golang | Leetcode Golang题解之第540题有序数组中的单一元素
题目: 题解: 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的关系可以从以下几个方面来理解: 技术互补:影刀RPA是一种自动化工具,它允许用户通过图形化界面创建自动化流程,而Python是一种编程语言,常用于编写自动化脚本。影刀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 中类的三大特性是什么?请简要解释。 封装、继承、多态 封装:将事物的属性(成员变量)和行为(成员函数)封装在一起形成一个类。并且可以设置相应的访问权限(私有的 受保护的 公有的&#…...
stm32学习4
学习目录 一.流水灯1.创建文件2.编写相关代码 一.流水灯 1.创建文件 将方法进行分类保存在不同的 .c 文件中,方便复用和寻找; 创建Hardware\LED文件,其中有led.c和led.h文件,用于存放有关LED灯操作的方法; 在User文…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
