首页 > 其他分享 >Unreal RecastNavigation 开源项目详解

Unreal RecastNavigation 开源项目详解

时间:2024-06-16 15:44:00浏览次数:25  
标签:const int cfg float RecastNavigation 开源 Unreal https heightfield

0 前言

Recastnavigation是一个游戏AI导航库,像Unity,UE引擎中都集成了这个开源项目, HALO中使用的也是这个开源库。导航最重要的就是为NPC寻路,以及其他的寻路需求。

需要注明的是,这个寻路库虽然厉害。但是他的核心是 平面寻路。也就是重力方向一直朝着 -Y 方向。如果是星球地形,既重力方向朝向球心,在任何一点重力方向都是不同的。那么这个开源库就不能使用了。

1 Recastnavigation 下载与编译

主页: https://github.com/recastnavigation/recastnavigation/tree/main?tab=readme-ov-file
编译: https://github.com/recastnavigation/recastnavigation/blob/main/Docs/_2_BuildingAndIntegrating.md

编译细节
这个项目 Recast and Detour 不依赖其他的一些库,但是 RecastDemo 即可视化的示例是需要SDL2库的,SDL2库可以理解为创建窗口应用程序所需要的库。所以我们需要下载SDL。

同时也需要 premake5 编译工具。

1.1 Windows

SDL2-devel-2.28.2-VC.zip 像这样的文件名的release才可以,不要直接下载 source code

// 成功后的文件夹应该是这个样子。
RecastDemo/Contrib
    fastlz
    readme-sdl.txt
    SDL
    stb_truetype.h

●Navigate to the RecastDemo folder and run premake5 vs2022
●Open Build/vs2022/recastnavigation.sln in Visual Studio 2022 or Jetbrains Rider.
●Set RecastDemo as the startup project, build, and run.

2. 代码详解

// Figure out how big the raster voxel grid will be based on the input geometry bounds.
rcCalcGridSize
 
// Voxelize the input geometry
rcAllocHeightfield
rcCreateHeightfield
rcMarkWalkableTriangles
rcRasterizeTriangles
 
// Clean up the voxel data and filter out non-walkable areas.
rcFilterLowHangingWalkableObstacles
rcFilterLedgeSpans
rcFilterWalkableLowHeightSpans
 
// Consolidate the voxel data into a more compact representation
rcAllocCompactHeightfield
rcBuildCompactHeightfield
 
// Further refine the voxel representation
rcErodeWalkableArea
rcBuildDistanceField
rcBuildRegions
 
// Triangulate the navmesh polygons from the voxel data
rcAllocContourSet
rcBuildContours
rcAllocPolyMesh
rcBuildPolyMesh
 
// Package the mesh with additional metadata that's useful at runtime.
rcAllocPolyMeshDetail
rcBuildPolyMeshDetail
 
// Cleanup
rcFreeHeightField
rcFreeCompactHeightfield
rcFreeContourSet

代码详解主要为2个部分。

  1. 数据载入
  2. 高度场建立

2.1 数据载入

首先Sample_SoloMesh::handleBuild()会调用InputGeom::getMesh()

那么Mesh数据从哪里来呢?

  1. InputGeom::loadMesh()
  2. InputGeom::load()
  3. rcMeshLoaderObj::addVertex(float x, float y, float z, int& cap) 其中cap是顶点的内存容量,以存8个顶点为开始,内存短缺后以2倍速度扩大。存储皆为1维数组,顶点与顶点之间的 stride==3
  4. void rcMeshLoaderObj::addTriangle(int a, int b, int c, int& cap)

有了Mesh之后,开始计算xz平面的栅格数量,设置为 *sizeX = &m_cfg.width, *sizeZ = &m_cfg.height。平面边缘,只要占到一半以上的cellSize,就认为是一个cell。

void rcCalcGridSize(const float* minBounds, const float* maxBounds, const float cellSize, int* sizeX, int* sizeZ)
{	// (0, 0.5) + 0.5  -> 0
	// [0.5, 0.999) + 0.5 -> 1
	*sizeX = (int)((maxBounds[0] - minBounds[0]) / cellSize + 0.5f);
	*sizeZ = (int)((maxBounds[2] - minBounds[2]) / cellSize + 0.5f);
}

rcCreateHeightfield(m_ctx, *m_solid, m_cfg.width, m_cfg.height, m_cfg.bmin, m_cfg.bmax, m_cfg.cs, m_cfg.ch)相当于构造函数,初始化高度场信息HeightField or HeightMap

m_triareas = new unsigned char[ntris];角色代理可以走的三角形。

rcMarkWalkableTriangles(m_ctx, m_cfg.walkableSlopeAngle, verts, nverts, tris, ntris, m_triareas);这个的关键就是三角形的法向量的 y 分量,等于三角形面与 x-z 平面的夹角 cos 值。运用相似三角形。

2.2 高度场建立

主要就是利用x-z平面的网格与映射到平面上的三角形的交点,通过相似三角形获得这个交点 (x-z)-> Y在三维三角形的高度。

这个切割方法是 Sutherland-Hodgman polygon-clipping algorithm 的变种。

Sutherland-Hodgman polygon-clipping algorithm

2.2.1 高度场建立的核心函数。

bool rcRasterizeTriangles(rcContext* context,
                          const float* verts, const int /*nv*/,
                          const int* tris, const unsigned char* triAreaIDs, const int numTris,
                          rcHeightfield& heightfield, const int flagMergeThreshold)
{
	rcAssert(context != NULL);

	rcScopedTimer timer(context, RC_TIMER_RASTERIZE_TRIANGLES);
	
	// Rasterize the triangles.
	const float inverseCellSize = 1.0f / heightfield.cs;
	const float inverseCellHeight = 1.0f / heightfield.ch;
	for (int triIndex = 0; triIndex < numTris; ++triIndex)
	{
		const float* v0 = &verts[tris[triIndex * 3 + 0] * 3];
		const float* v1 = &verts[tris[triIndex * 3 + 1] * 3];
		const float* v2 = &verts[tris[triIndex * 3 + 2] * 3];
		if (!rasterizeTri(v0, v1, v2, triAreaIDs[triIndex], heightfield, heightfield.bmin, heightfield.bmax, heightfield.cs, inverseCellSize, inverseCellHeight, flagMergeThreshold))
		{
			context->log(RC_LOG_ERROR, "rcRasterizeTriangles: Out of memory.");
			return false;
		}
	}

	return true;
}

2.2.2 图解

每个 cell 上面是一个 spanList。 他存储着所有在这个cell上面的 所有 三角形在这个cell上的高度信息。

image

X. Ref

  1. A* : https://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html#heuristics-for-grid-maps
  2. UE DOC: https://www.unrealdoc.com/p/navigation-mesh

标签:const,int,cfg,float,RecastNavigation,开源,Unreal,https,heightfield
From: https://www.cnblogs.com/asmurmur/p/18250668

相关文章

  • FDRS | 一个开源的智慧农场中继系统
    分享一个智慧农业开源项目:农场数据中继系统(FarmDataRelaySystem,FDRS)。这是一个利用现代信息技术,如物联网(IoT)、大数据和云计算等,为农业生产提供数据支持和管理优化的系统。该系统的核心功能是收集、处理和分析农场相关数据,帮助农民更精准地进行作物种植和管理。两年前的项目,......
  • Docker镜像下载慢/失败?Linux代理使用不便?想在无Docker环境下载镜像?试试我这款开源项目
    我要在这里放一段代码块//这是一段防爬代码块,我不介意被文章被爬取,但请注明出处console.log("作者官网:https://www.hanzhe.site");console.log("原文地址:https://www.cnblogs.com/hanzhe/p/18249602");说在前面你在工作中有没有遇到过这样几个问题:镜像下载速度慢,明明带宽......
  • farmOS | 一个免费开源的智慧农场管理系统
    farmOS简介farmOS是一个基于Web的应用程序,用于服务器场管理、规划和记录保存。它由农民、开发人员、研究人员和组织组成的社区开发,旨在为农业数据收集和管理提供标准平台。farmOS服务器建立在Drupal之上,这使得它模块化、可扩展和安全。farmOSFieldKit应用程序通过渐进式W......
  • unitycatalog datagrics 开源的data&ai 多模catalog
    unitycatalogdatagrics开源的data&ai多模catalog包含的特性支持任意格式、引擎、资产的多摸接口 支持包含了deltalake,iceberg,uniform,paquert,csv。。。等格式,超越表,支持非结构化数据以及ai资产,插件化的架构,可以支持hms以及icebergrestcatalog以及其他插件(比如ai),与delt......
  • SD3开源 | 一场技术与创意的盛宴,邀你共赴(附安装方法和下载链接)
    6月12日,AI生图领域的“源神”——StabilityAI终于正式将StableDiffusion3Medium开源!接下来我将介绍一下如何安装,以及模型和工作流的基本用法,也会附上下载链接,和我自己的测试效果。快点部署起来吧!01 模型安装Installing首先需要下载4个大模型,将其放在ComfyUI\mode......
  • 金融量化分析开源工具:TuShare
    TuShare:一站式金融数据解决方案,让量化分析触手可及-精选真开源,释放新价值。概览TuShare,是Github社区上一个专为金融量化分析师和数据爱好者设计的开源工具,提供了从数据采集、清洗加工到数据存储的全流程服务。它以其数据覆盖面广、接口调用简便、响应速度快而广受好评。......
  • 探索热门开源项目的奥秘:我的个人推荐
    在开源的世界里,每天都有无数的项目被创建、发展和完善。作为一名热衷于开源的开发者,我深知这些项目背后的辛勤付出和无限潜力。今天,我想和大家分享几个我个人特别推荐的热门开源项目,希望能为你的开发工作带来新的灵感和启发。1.ReactReact无疑是前端开发领域的翘楚。它......
  • FinGPT:12.3k 星星!金融领域的开源大模型来了!
    ✨点击这里✨:......
  • 开源模型应用落地-Qwen2-7B-Instruct与vllm实现推理加速的正确姿势(十)
    一、前言  目前,大语言模型已升级至Qwen2版本。无论是语言模型还是多模态模型,均在大规模多语言和多模态数据上进行预训练,并通过高质量数据进行后期微调以贴近人类偏好。在本篇学习中,将集成vllm实现模型推理加速,现在,我们赶紧跟上技术发展的脚步,去体验一下新版本模型的推理质......
  • 开源项目QAnything:全能型本地知识库问答系统
    在当今信息爆炸的时代,如何高效地管理和检索大量数据成为了一个重要课题。网易有道推出的开源项目QAnything,正是为了解决这一问题而生。QAnything是一个本地知识库问答系统,支持多种文件格式和数据库,允许用户在离线状态下进行安装和使用。用户只需将任何格式的本地存储文件放入系......