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

【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
    在这里插入图片描述
  • 鼠标左键选择移动的目标点

在这里插入图片描述


http://www.kler.cn/a/374393.html

相关文章:

  • Elasticsearch-索引的批量操作
  • ES7+ React/Redux/GraphQL/React-Native snippets 使用指南
  • C++的内存四区
  • STM32-笔记17-PWM波型
  • 初始 ShellJS:一个 Node.js 命令行工具集合
  • MySQL 数据”丢失”事件之 binlog 解析应用
  • Node.js UDP通信 dgram 组播
  • canvas自定义文本排列方法 + 自定义花字应用案例
  • 使用Python和OCR技术实现自动化办公:图片转文字
  • Vue3入门--[vue/compiler-sfc] Unexpected token, expected “,“ (18:0)
  • 安装Docker到指定目录
  • 学习stm32
  • 免费送源码:Java+ssm++MVC+HTML+CSS+MySQL springboot 社区医院信息管理系统的设计与实现 计算机毕业设计原创定制
  • 校园社团信息管理平台:Spring Boot技术实战指南
  • 自修室预约系统|基于java和小程序的自修室预约系统设计与实现(源码+数据库+文档)
  • CentOS 9 Stream 上安装 IntelliJ IDEA
  • 什么是线程局部变量(ThreadLocal)?
  • 金融领域中的敏感性分析和期权价值计算相关的操作
  • 动态规划 01背包(算法)
  • OV代码签名证书
  • Leetcode 移除元素
  • 流畅!HTMLCSS打造网格方块加载动画
  • 使用 Elastic、OpenLLMetry 和 OpenTelemetry 跟踪 LangChain 应用程序
  • 如何基于Apache SeaTunnel 读取Oracle的数据
  • Metasploit(MSF)使用
  • elasticsearch7.x在k8s中的部署