寻路库recastnavigation改造

news2024/9/25 21:24:01

本文是介绍对寻路库recastnavigation 改造,使得使用更加友好。
Git仓库:
https://github.com/jiangguilong2000/recastnavigation

首先,我们要做一些前置操作
SDL: 开放源代码的跨平台多媒体开发库
Premake:量跨平台构建系统

环境:
VS 2019以及完整的C++编译环境

Rider For Unreal Engine 2022.2.1(下面简称Rider)

Unity 2019.4.8 lts

.Net Core 2.2

1.首先把git库拉到本地,先将下载的SDL库放到ecastnavigation\RecastDemo\Contrib,需要改名为SDL,应该得到如下目录recastnavigation-master\RecastDemo\Contrib\SDL\lib\x64
2/然后将下载premake5.exe放入
recastnavigation\RecastDemo
3.然后通过命令行控制premake编译recastnavigation为sln工程

PS E:\recastnavigation\RecastDemo> .\premake5.exe vs2019
Building configurations...
Running action 'vs2019'...
Generated Build/vs2019/recastnavigation.sln...
Generated Build/vs2019/DebugUtils.vcxproj...
Generated Build/vs2019/DebugUtils.vcxproj.filters...
Generated Build/vs2019/Detour.vcxproj...
Generated Build/vs2019/Detour.vcxproj.filters...
Generated Build/vs2019/DetourCrowd.vcxproj...
Generated Build/vs2019/DetourCrowd.vcxproj.filters...
Generated Build/vs2019/DetourTileCache.vcxproj...
Generated Build/vs2019/DetourTileCache.vcxproj.filters...
Generated Build/vs2019/Recast.vcxproj...
Generated Build/vs2019/Recast.vcxproj.filters...
Generated Build/vs2019/RecastDemo.vcxproj...
Generated Build/vs2019/RecastDemo.vcxproj.user...
Generated Build/vs2019/RecastDemo.vcxproj.filters...
Generated Build/vs2019/Tests.vcxproj...
Generated Build/vs2019/Tests.vcxproj.user...
Generated Build/vs2019/Tests.vcxproj.filters...
Done (160ms).

然后目录中会生成一个Build文件夹,里面是我们编译出来的sln工程

recastnavigation\RecastDemo\Build\vs2019\recastnavigation.sln

用rider打开,直接运行,我们就能看到编辑器画面了
在这里插入图片描述

接下去我们要对源码进行一些改造:
原始的recast是没有开始点和结束点的坐标的,那如何能显示出来呢?

void NavMeshTesterTool::handleRenderOverlay(double* proj, double* model, int* view)
{
	GLdouble x, y, z;
	char buf[64];

	// Draw start and end point labels
	if (m_sposSet && gluProject((GLdouble)m_spos[0], (GLdouble)m_spos[1], (GLdouble)m_spos[2],
		model, proj, view, &x, &y, &z))
	{
		if (m_showCoord)
		{
			snprintf(buf, sizeof(buf), "Start (%.1f, %.1f, %.1f)", m_spos[0], m_spos[1], m_spos[2]);
			imguiDrawText((int)x, (int)(y - 25), IMGUI_ALIGN_CENTER, buf, imguiRGBA(0, 0, 0, 220));
		}
		else
			imguiDrawText((int)x, (int)(y - 25), IMGUI_ALIGN_CENTER, "Start", imguiRGBA(0, 0, 0, 220));
	}


	if (m_toolMode == TOOLMODE_RAYCAST && m_hitResult && m_showCoord &&
		gluProject((GLdouble)m_hitPos[0], (GLdouble)m_hitPos[1], (GLdouble)m_hitPos[2],
			model, proj, view, &x, &y, &z))
	{
		snprintf(buf, sizeof(buf), "HitPos (%.1f, %.1f, %.1f)", m_hitPos[0], m_hitPos[1], m_hitPos[2]);
		imguiDrawText((int)x, (int)(y - 25), IMGUI_ALIGN_CENTER, buf, imguiRGBA(0, 0, 0, 220));
	}
	if (m_eposSet && gluProject((GLdouble)m_epos[0], (GLdouble)m_epos[1], (GLdouble)m_epos[2],
		model, proj, view, &x, &y, &z))
	{
		if (m_showCoord)
		{
			float totalCost = 0.0f;
			for (int i = 0; i + 1 < m_nstraightPath; i++)
				totalCost += dtVdist(&m_straightPath[i * 3], &m_straightPath[(i + 1) * 3]);
			snprintf(buf, sizeof(buf), "End (%.1f, %.1f, %.1f), Cost %.1f", m_epos[0], m_epos[1], m_epos[2], totalCost);
			imguiDrawText((int)x, (int)(y - 25), IMGUI_ALIGN_CENTER, buf, imguiRGBA(0, 0, 0, 220));
		}
		else
			imguiDrawText((int)x, (int)(y - 25), IMGUI_ALIGN_CENTER, "End", imguiRGBA(0, 0, 0, 220));
	}
}

那么,如何能显示出关键点point list?,首先,路径搜索的模式要改成TOOLMODE_PATHFIND_STRAIGHT模式,代码需要增加如下的打印,
在NavMeshTesterTool.cpp中增加,

void NavMeshTesterTool::recalc(){
....
....
	if (m_toolMode == TOOLMODE_PATHFIND_STRAIGHT&& m_nstraightPath>0) 
    	{
    		stringstream os;
    		os << "total point size=" << m_nstraightPath<< ",";
    		//m_sample->getContext()->log(RC_LOG_PROGRESS, "total point size=%d", m_nstraightPath);
    		for (int i = 0; i < m_nstraightPath; ++i)
    		{
    			if (i > 0&&i%10==0) {
    				m_sample->getContext()->log(RC_LOG_PROGRESS, "%s", os.str().c_str());
    				os.str("");
    			}
    			os << "[" << m_straightPath[i * 3] << "," << m_straightPath[i * 3 + 1] << "," << m_straightPath[i * 3 + 2] << "] ";
    		}
    		m_sample->getContext()->log(RC_LOG_PROGRESS, "%s", os.str().c_str());
    	}
}

在Sample.h中增加

public:
	Sample();
	virtual ~Sample();
	
	void setContext(BuildContext* ctx) { m_ctx = ctx; }
	BuildContext* getContext() {
		return m_ctx;
	}

在这里插入图片描述
最后一个问题,如何把显示日志的地方的文本能鼠标选中?目前还没搞定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国内知名插画培训机构有哪些,学习插画怎么选培训班

国内知名插画培训机构有哪些&#xff1f;给大家梳理了国内5家专业的插画师培训班&#xff0c;最新无大插画班排行榜&#xff0c;各有优势和特色&#xff01; 一&#xff1a;国内知名插画培训机构排名 1、轻微课&#xff08;五颗星&#xff09; 主打课程有日系插画、游戏原画…

Linux 计划任务讲解

目录 计划任务 一次性计划任务 长期性计划任务 计划任务 管理员可以编辑自己的和普通用户的计划任务 普通用户只可以编辑自己的计划任务 计划任务根据执行方式分为一次性计划任务、长期性计划任务 一次性计划任务 此计划只执行一次&#xff0c;执行后或就不会再执行了 通…

项目管理之三点估算(正态分布)

三点估算法主要来自于项目的计划评审技术 PERT&#xff0c;能评估时间与概率的关系。 三点估算法不仅可以用于定量风险分析&#xff0c;也可用于进度管理中活动历时估算。先记住几个概念&#xff1a;最乐观时间TO&#xff1a;完成该工作最少需要的时间&#xff1b;最悲观时间TP…

R统计绘图-PCA详解1(princomp/principal/prcomp/rda等)

此文为《精通机器学习&#xff1a;基于R》的学习笔记&#xff0c;书中第九章详细介绍了无监督学习-主成分分析(PCA)的分析过程和结果解读。 PCA可以对相关变量进行归类&#xff0c;从而降低数据维度&#xff0c;提高对数据的理解。分析的主要目的一般是&#xff1a;1)识别数据…

CVPR2022 | ABINet+: 似人阅读: 场景文本识别的自主、双向和迭代语言建模

论文标题&#xff1a;ABINet&#xff1a;Read Like Humans: Autonomous, Bidirectional and Iterative Language Modeling for Scene Text Recognition代码&#xff1a;https://github.com/FangShancheng/ABINet链接&#xff1a;https://arxiv.org/abs/2103.06495一、AbstractH…

Linux 安装php环境

1.下载php wget http://am1.php.net/distributions/php-7.3.2.tar.gz 2.解压 tar -zxvf php-7.3.2.tar.gz 3.安装扩展 接下来进行参数配置&#xff0c;配置前如果没有libxml2和libxml2-devel会报错&#xff0c;所以应该更新libxml2并安装libxml2-devel&#xff0c;使用在线…

C++回顾(一)——从C到C++

前言 在学习了C语言的基础上&#xff0c;C到底和C有什么区别呢&#xff1f; 1.1 第一个C程序 #include <iostream>// 使用名为std的命名空间 using namespace std;int main() {// printf ("hello world\n");// cout 标准输出 往屏幕打印内容 相当于C语言的…

ELK日志分析--Kibana

Kibana 概述 部署安装浏览页面并使用 1.Kibana 概述 Kibana-是进入Elastic的窗口使用Kibana&#xff0c;可以 1 搜索&#xff0c;观察和保护。 从发现文档到分析日志再到发现安全漏洞&#xff0c;Kibana是您访问这些功能及其他功能的门户。 2 可视化和分析您的数据。 搜索隐藏的…

github ssh密钥配置,克隆远程仓库

GitHub的SSH配置 在往github上push项目的时候&#xff0c;如果走https的方式&#xff0c;每次都需要输入账号密码&#xff0c;非常麻烦。而采用ssh的方式&#xff0c;就不再需要输入&#xff0c;只需要在github自己账号下配置一个ssh key即可&#xff01; 很多朋友在用github管…

kkfileview在预览word文档中文乱码

因为liunx服务器没有相关中文字体 1.下载中文字体包 http://kkfileview.keking.cn/fonts.zip 2.上传服务器至目录/usr/share/fonts 解压 unzip fonts.zip 3.执行命令 mkfontscale mkfontdir fc-cache 如果报错命令没有找到&#xff0c;则安装对应命令&#xff0c;例如 yum in…

Mikrotik Ros安全加固

基本概述 Mikrotik系列路由器也成RouterOS软路由&#xff0c;RouterOS是基于Linux内核的网络操作系统&#xff0c;其预装在MikroTik生产的路由器、无线设备以及RouterBOARD上。同时&#xff0c;它也可以安装在x86平台的个人电脑上&#xff0c;用于将电脑转化为路由器&#xff…

【01】从零开始学Python—数据分析与挖掘概述

马云曾说“中国正迎来从IT时代到DT时代的变革”&#xff0c;DT就是大数据时代。数据已成为企业的核心资产和宝贵资源&#xff0c;企业愈加重视和善加利用数据分析与挖掘技术。 1.1什么是数据分析与挖掘 数据分析和挖掘都是基于搜集来的数据&#xff0c;应用数学、统计、计算机…

6个思维矩阵,90%的项目经理都收藏了

早上好&#xff0c;我是老原。我们都是知道&#xff0c;项目经理的管理能力如何&#xff0c;往往也决定项目的走向如何&#xff1f;今天老原给大家分享这6个管理矩阵&#xff0c;是每一位项目经理需要修炼的能力。01、项目领导力矩阵项目领导力矩阵还是蛮有意思的&#xff0c;四…

记忆化搜索

一.记忆化搜索概述 1.概念 搜索是一种简单有效但是效率又很低下的算法结构&#xff0c;其低效的原因主要在于存在很多重叠子问题。而记忆化搜索则是在搜索的基础上&#xff0c;利用数组来记录已经计算出来的重叠子问题状态&#xff0c;进行合理化的剪枝&#xff0c;从而降低时…

程序员如何发展第二职业?这几种副业方式超赚钱

很多程序员曾表示&#xff0c;虽然月薪一两万&#xff0c;但有时候还是会焦虑。 尤其是遇上了年初裁员年底裁员这样的就业环境&#xff0c;焦虑就会逐步放大&#xff0c;这时候副业赚钱的重要性就体现出来了。 发展第二职业&#xff0c;可以让程序员们增加抗风险能力&#xf…

扩展学习之时间戳趣谈

目录 一、介绍 二、转换工具 三、获取Unix时间戳的指令 四、普通时间转Unix时间戳 五、扩展 一、介绍 时间戳&#xff1a;一份数据在特定时间点存在的可验证的数据。 Unix时间戳&#xff08;英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp&#xff09;&…

(二十七)大白话在Buffer Pool执行完增删改之后,写入日志文件的redo log长什么样?

昨天我们简单给大家回顾了一下在数据库里执行增删改操作的时候&#xff0c;redo log是用来干什么的&#xff0c;为什么需要这个东西&#xff0c;如果没有他会怎么样&#xff0c;有了他之后又能有什么样的效果&#xff0c;想必大家现在都对redo log这个东西有一定的理解了。 那…

高性能低功耗4口高速USB2.0 HUB 完美替代FE1.1S和FE8.1

该NS1.1s是一个高度集成的&#xff0c;高品质&#xff0c;高性能&#xff0c;低功耗&#xff0c;为USB 2.0高速4端口集线器又低成本的解决方案。 &#xff08;点击即可咨询芯片详细信息&#xff09; NS1.1s的特点 1.通用串行总线规范修订版2.0&#xff08;USB 2.0&#xff09;完…

LeetCodeHOT100热题01

写在前面 主要分类一下刷题遇到的一些题型。有很多思路的图都来源于力扣的题解&#xff0c;如侵权会及时删除。不过代码都是个人实现的&#xff0c;所以有一些值得记录的理解。之前的算法系列参看&#xff1a; 剑指offer算法题01剑指offer算法题02 一、哈希表 1. 两数之和 …

自然语言处理(NLP)之近似训练法:负采样与层序Softmax

我们在前面介绍的跳字模型与连续词袋模型有个缺陷就是在计算梯度时的开销随着词典增大会变得很大&#xff0c;因为每一步的梯度计算都包含词典大小数目的项的累加。为了降低这种带来的高计算复杂度&#xff0c;介绍两种近似的处理方案&#xff1a;负采样和层序softmax负采样(Ne…