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

目录

说在前面

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

安装

  • 使用go mod安装即可

    shell 复制代码
    go get github.com/o0olele/detour-go

使用

  • 使用场景模型构建navmesh

    • 通过recast navigation demo进行构建;构建完成后点击Save保存二进制文件
    • 通过在线工具构建;完成后点击Export as Recast NavMesh保存二进制文件
  • 使用detour-go加载二进制navmesh文件

    c 复制代码
    var mesh = loader.LoadTileMesh("./navmesh.bin")
    if mesh == nil {
    	panic("load mesh failed.")
    }
  • 进行寻路

    c 复制代码
    // 初始化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下的文件

    shell 复制代码
    go run main.go
  • 在浏览器中访问http://localhost:9001/public

  • 点击LoadTileMesh,选择刚刚保存的二进制navmesh文件

  • 点击Add Agent,添加一个agent

  • 鼠标左键选择移动的目标点

相关推荐
量化分析码农4 分钟前
【Python量化系统工程实战 #03】任务跑挂了没人知道?用 60 行代码搭一套「监控 + 邮件 + 桌面推送」告警系统
后端
柠檬味拥抱9 分钟前
基于YOLOv8的电梯内电瓶车检测识别(中英文双版) | 附完整源码与效果演示
后端
2601_9628857213 分钟前
如何用 Python 做均线粘合选股?(多头发散前的变盘候选)
开发语言·python
知守观16 分钟前
HTML 转 PDF 方案实战:iTextPDF 与 wkhtmltopdf 踩坑复盘,附 Flying Saucer / openhtmltopdf 选型对比
java·后端
2601_9620715718 分钟前
类变量和全局变量的隔离性有什么区别?
java·开发语言·jvm
程序边界20 分钟前
16个通道并行灌库是什么体验——KFS入库这点事儿(下)
后端
H.莓飛21 分钟前
【Linux】命令行参数、环境变量与程序地址空间
linux·c语言·chrome·后端·centos
粥里有勺糖23 分钟前
拿 Codex 协助清理磁盘,Nice!
前端·后端·github
海绵宝宝转agent25 分钟前
LeetCode100 LRU缓存思路讲解
java·开发语言·缓存
专业程序开发源26 分钟前
springboot高校学生社团管理系统74810-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计