目录
说在前面
- go version:1.20.2 linux/amd64
- 操作系统:wsl2
- detour-go版本:v0.2.0
- github:这里,求star!
安装
-
使用
go mod
安装即可shellgo get github.com/o0olele/detour-go
使用
-
使用场景模型构建
navmesh
- 通过recast navigation demo进行构建;构建完成后点击
Save
保存二进制文件
- 通过在线工具构建;完成后点击
Export as Recast NavMesh
保存二进制文件
- 通过recast navigation demo进行构建;构建完成后点击
-
使用
detour-go
加载二进制navmesh
文件cvar 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下的文件
shellgo run main.go
-
在浏览器中访问
http://localhost:9001/public
-
点击
LoadTileMesh
,选择刚刚保存的二进制navmesh文件
-
点击
Add Agent
,添加一个agent
-
鼠标左键选择移动的目标点