NavMesh生成研究(一):体素化过程

从《我的世界》了解“体素”引擎的工作,----网格优化算法的比较 一. 写在之前 目前正在制作一个3D体素类的项目,大量的模型带有大量面数的模型在Unity中直接跑不动,FPS在15以下,考虑到一个场景中不仅有一个模型需要显示,想要提高游戏流畅度,必须对这些模型的网格面数进行深度优化,至少优化到5000面以下。先在网上调研了很多的资料,发现了一个确实很实用,但是不那么容易理解的优化算法----贪心网格规划算法(GreedyMesh,翻译过来的)。 ... 阅读详情

本文翻译自:http://critterai.org/projects/nmgen_study/voxelization.html

NMGen是一个开源项目,包括Java版的recast静态网格生成代码,以及详细介绍生成过程的文章。因为在阅读过程中觉得对理解recast原理非常有用,所以决定将其翻译在自己blog上。

原blog上完整的目录包括:

其中第一篇、第二篇已经由游蓝海做了翻译。这里从第四篇开始,分步骤详细讲述NavMesh的生成过程。翻译时力求忠实于原意,且尽量通俗易懂。译文如下:

概述

构造导航网格的第一步是使用体素化(voxelization)创建实心高度域(solid heightfield)。

构造类: SolidHeightfieldBuilder
数据类: SolidHeightfield

如果你需要回忆体素化的执行过程,请回到总体概述。

创建实心高度域

当我们创建了源网格(source mesh)的AABB包围盒和容纳体素信息的实心高度域后,为每个源网格中的多边形执行下列操作:

确定多边形在高度域格子上的投影(footprint)——也就是多边形的AABB包围盒在2D坐标系下的投影。因为求取多边形投影覆盖的格子需要交集测试,这样做的好处是可以降低交集测试的数量。

这里写图片描述

遍历投影覆盖的所有高度域格子列(grid column),并求出源多边形与列相交的比例。如果出现一次相交,那么得到一个新的“裁剪过的”(clipped)多边形。然后确定这个多边形的最低和最高的高度。这就代表着格子列被源多边形占据的比例。

这里写图片描述

我们基于以下信息来为高度域添加区间(span):

  • 与多边形有交集的格子列
  • 裁剪得到的多边形的最低和最高高度范围(格子列被占据的比例)
  • 裁剪多边形的表面是否可行走(traversable)

其中最后一条信息取决于源多边形在y轴的倾斜度(slope)和配置的maxTraversableSlope属性值。如果前者小于后者(例如45度),那么表面可行走。

当新的区间数据添加到高度域时,会做如下事情:

如果新的区间不与任何现存的区间相交,那么创建一个新的区间。否则合并两个区间。

当两个区间合并时,必须验证合并后的区间是否可经过。可行走标志(traversable flag)只应用在区间的上表面。如果设置了该标志,那么就意味着区间的顶端多边形有较低的倾斜度,因此可行走。

如果新区间的顶端高于要合并到的区间顶端,那么将新区间的可行走标志应用到合并后的区间上。

如果新区间的顶端低于要合并到的区间顶端,那么我们不用关心新区间的可行走标志,直接丢弃。

如果新区间的顶端与要合并到的区间高度一致,那么只要两者中任何一个可行走,那么合并后的区间也是可行走的。

这里写图片描述

更多的高度域区间标志

技术上来说,源网格的体素化已经完成,而且高度域已包含占据空间的实心体素区间。区间也有标志代表顶端表面是否可行走。但是这个标志的设置只考虑了与区间相交的多边形的倾斜度。现在是时候做更多的过滤了:从一些区间上移除可行走标志。

两种类型的过滤:

首先,当区间上方有非常近的障碍物时,它的顶端表面也不可行走。想象地板上的一张桌子。虽然桌子下面的地板是平坦的,但仍然不可行走(因为容纳的高度不够)。

这里写图片描述

一个可选择的过滤与凸起(ledge)检测有关。如果从区间的顶端到相邻的区间下降的距离超过了一定阈值,那么这个区间被认为是个凸起,也不可行走。

这里写图片描述

目前的进展

在这一步结尾,我们构造了一个代表源网格占据区域的高度域。执行初步的过滤后,占据区域的顶端表面被标记为是否可行走。

[源码解析] Voxelization具体步骤(Voxelnet) 该博文主要用于记录voxelization的具体实现(当前只用CPU版本,后续补充GPU CUDA加速版本),voxel是处理点云数据常用的预处理手段,当前主流的3D detection模型,基本都会考虑将点云网格化,方便后续高效抽feature在浏览voxelnet源码的过程中,发现当时的voxelization的过程还是基于CPU进行。 阅读详情

相关推荐

navmesh 生成网格信息 总 (更新中 )

The general process is as follows: Voxelization- Create a solidheightfieldfrom the source geometry. 体素化,根据几何体创建solid heightfield(recast里面的rcHeightField) Generate Regions - Detect the top surf...

icebergliu1234的博客 1513

3D模型体素化

体素化(Voxelization)是将物体的几何形式表示转换成最接近该物体的体素表示形式,产生体数据集,其不仅包含模型的表面信息,而且能描述模型的内部属性。表示模型的空间体素跟表示图像的二维像素比较相似,只不过从二维的点扩展到三维的立方体单元,而且基于体素的三维模型有诸多应用。 由于使用的需要,需对模型进行体素化操作,这里采用了一种简单但却有效的操作方法。首先设定模型体素化的分辨率,假设为 N

痞子龙3D编程 7549

UE5碰撞体与NavMesh偏移排查:从体素化到AI寻路的完整修复指南

在游戏开发中,AI寻路依赖导航网格(NavMesh)来规划路径,而碰撞体组件负责物理阻挡。当两者之间出现偏移时,角色往往表现为贴墙卡顿、绕路异常,甚至直接穿过障碍物。要理解这一现象,需要从导航生成原理说起:NavMesh并非直接描摹场景表面,而是将碰撞体经过体素化(Voxelization)处理,再按AI智能体半径(Agent Radius)收缩边界。因此,当碰撞体变换层级、碰撞预设、CanEverAffectNavigation属性或物理资产绑定发生细微偏差时,烘焙出的导航数据就可能与物理表现分道扬镳。本

weixin_31130435的博客 237

实时渲染 -- 体素化(Voxelization)

我们之前讨论的大部分问题都是关于面表示的。由于这些方法不需要显式地表示物体的内部空间,所以非常高效。体建模方法表示的是实体而不是表面。使用体模型可以产生更丰富的仿真效果,如物体的运动学行为和半透明光照效果。

gghhb12的博客 4644

Unity新NavMesh系统:体素化导航与性能优化实战

游戏开发中的路径导航系统是实现AI角色自主移动的核心技术,其本质是通过空间数据结构的预处理与实时计算来寻找可行走路径。Unity引擎的NavMesh系统采用体素化技术,将场景离散化为三维网格单元,结合Job System实现多线程路径计算,显著提升动态避障和大规模寻路性能。在开放世界、MMORPG等需要处理数百个移动单位的场景中,这种基于体素的高度场导航方案能实现400%的性能提升。通过合理配置Agent参数、分层导航和路径查询批处理等技巧,开发者可以构建支持实时战术决策的智能移动系统,特别适合RTS、FP

weixin_32175665的博客 301

手把手教你用UE4的DrawDebugMesh可视化动态NavMesh生成过程

本文详细介绍了如何在UE4中使用DrawDebugMesh函数可视化动态NavMesh生成过程,帮助开发者深入理解Recast算法的每个关键阶段。通过体素化、区域划分和轮廓生成的可视化调试,开发者可以直观掌握导航网格的创建逻辑,优化AI寻路性能,特别适合需要动态更新NavMesh的开放世界游戏开发。

weixin_30245867的博客 252

Navmesh研究(二)体素化过程

体素化过程 构建导航网格的第一步是使用体素化创建一个实体高度域 创建实体高度域 当检测到源网格的轴对齐包围盒并创建一个用于保存体素信息的实体高度域之后,我们对源网格中的每一个多边形(可以是三角形)执行以下过程: 确定多边形在高度域xz平面上的投影。用多边形的2d轴对齐高度域的边界,这样做减少了多边形与高度域作相交测试的次数 循环遍历投影覆盖的所有高度域列,并得出与该列相交的源多边形部分。如果发生相交,则导出一个新的“剪切”多边形。然后确定修剪的多边形的最小和最大高度。这代表这一列与源多边形相交部分在y轴上

白夜的博客 975

网格体素化:将三角形多边形网格体素化。-matlab开发

多边形网格体素化========================== 亚当 H.艾特肯黑德adam.aitkenhead@christie.nhs.uk 克里斯蒂 NHS 基金会信托 对封闭的(即防水的)三角形多边形网格进行体素化。 网格可以是以下几种格式之一:在 STL 文件中; 在包含面和顶点数据的结构中; 在包含 x,y,z 坐标的三个 3xN 数组中; 或者在单个 Nx3x3 数组中定义 N 个面中的每个面的顶点坐标。 用法: ====== [gridOUTPUT,gridCOx,gridCOy,gridCOz] = VOXELISE(gridX,gridY,gridZ,STlin,raydirection) ...或者... [gridOUTPUT,gridCOx,gridCOy,gridCOz] = VOXELISE(gridX,gridY,gridZ,meshFV,ra

Unity-NavMesh详解-其一

注意:Region 虽然是不重叠且没有洞的区域,但仍然有可能是凹多边形,无法保证 Region 内任意两点在二维平面一定可以直线到达。后续需要进行轮廓生成和凸多边形生成,为寻路做准备。在这个阶段结束时,我们有形成简化多边形的轮廓。顶点仍然在体素空间中,但是我们正在回到向量空间的路上。许多算法只能用于凸多边形。因此,这一步将构成轮廓的简单多边形细分为凸多边形网格。这是通过使用一个适用于简单多边形的三角形划分(triangulation),然后再将三角形合并为最大可能的凸多边形来实现的。

lastXuanGod的博客 2231

AutoCAD Plant 3D自定义零件库实战:手把手教你用Python创建参数化槽式三通

本文详细介绍了如何利用Python脚本在AutoCAD Plant 3D中创建参数化槽式三通组件,从API原理到实战开发,帮助用户构建高效的自定义零件库。通过Python装饰器系统控制零件属性和行为,实现几何建模、参数管理和规格编辑器集成,提升工业管道设计的标准化和效率。

weixin_28267011的博客 331

C#菜鸟教程学习笔记

C#菜鸟教程学习笔记 C#简介 C# 是一种编程语言,它是由微软开发的。 C# 编程是基于 C 和 C++ 编程语言的,它与 Java 也非常相似。 C# 是 .Net 框架的一部分,且用于编写 .Net 应用程序。 .Net 框架(.Net Framework)能编写出下面类型的应用程序: ①Windows 应用程序 ②Web 应用程序 ③Web 服务 常用的C# 编程的开发工具:Visual Studio(VS:可视化工作室) C#程序结构 一个 C# 程序(C# 文件的后缀为 .cs)主要包括以下部分

mlc_WTMOTW的博客 4978

在Unity中实现体素化

类似与用网格存储二维平面,将三维空间划分成大量尺寸相同的小方块的过程就称之为体素化。

F_CILF_CIL的博客 4302

uniapp实战:5分钟搞定PDA激光扫码功能(附完整代码)

本文详细介绍了在Uniapp应用中快速集成工业PDA激光扫码功能的实战方案。通过解析PDA硬件扫码与手机摄像头扫码的核心机制差异,提供了完整的广播监听封装类代码,并演示了在Vue页面中的集成使用方法,帮助开发者高效解决仓储、零售等行业的条码扫描需求。

weixin_29239661的博客 456

recast 生成navmesh主要流程

参考: critterai http://www.critterai.org recast & Detourhttps://github.com/recastnavigation/recastnavigation 关于理解 NavMesh 生成:  体素http://critterai.org/projects/cainav/doc/html/6fb304...

640

C语言——利用矩阵LU分解法求逆、行列式

本章介绍了LU分解法,以及如何利用LU分解法求逆、行列式,针对每个公式、原理、代码进行了详细介绍,希望可以给大家带来帮助。

王元笙 1万+

uniapp(全端兼容) - 超详细接入百度统计功能,给uniapp全平台各端项目引入添加百度统计的插件统计流量详细的步骤教程(提供最新的百度统计源代码,详细的示例代码复制粘贴即可快速搞定!)

uniapp h5 app 使用加入接入百度统计,uniapp百度统计,uniapp详细引入百度统计的教程,uniapp接入百度统计,uniapp如何实现加入百度的统计代码,uniapp怎么植入百度统计详细教程,uniapp如何对接百度统计,uniapp百度统计不生效怎么办,uniapp使用百度统计不生效常见问题,uniapp引入百度统计后没有生效,uniapp h5网页接入百度统计代码后没有统计无效,uniapp最新接入使用百度统计功能,uniapp增加百度统计代码,uniapp app如何接入百度统计,

✅ 精选推荐文章 1万+

基于体素化的游戏寻路导航网格自动生成算法

多边形分割成若干凸多边形(NavMesh的初步形成)在Unity中实现体素化当时我正开始做毕设,因为从小对游戏感兴趣,所以找老师开了这么一个题目,不过后来因为事情繁忙(偷懒太久),文章一直没有更新,到如今我都从清纯校招生变成工作一年半的老油条了。最近整理了一下当时的资料,开源了项目代码,并且将毕设论文中的“干货”部分,发表出来。一方面希望能够给对这个方面感兴趣的同学一点学习的参考,另一方面,如果我的内容存在错误,也希望能够被指出,我也能在不断改正的过程中成长。

F_CILF_CIL的博客 2800

**Coffin-Manson 模型**在半导体功率循环测试中的理论背景、数学形式、应用场景,以及如何使用 **C#** 编程语言进行具体实现

Coffin-Manson 模型最初用于描述金属材料在低周疲劳(Low-Cycle Fatigue, LCF)下的寿命,后来被广泛应用于半导体功率器件(如 IGBT、MOSFET)的可靠性分析,特别是在功率循环测试中。如果你有具体数据(如 CSV 文件)、更复杂的模型要求(如 Bayerer 模型)或特定可视化需求,请提供,我可以进一步优化代码或添加功能!以下代码实现基本模型 ( N_f = A \cdot (\Delta T_j)^{-n} ) 的拟合,生成拟合曲线并预测寿命。我会结合你之前提到的。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 481

Recast源码解析(二):NavMesh导航网格生成原理(上)

上文说到recast的寻路分为两部分:recast(建网格)和detour(寻路),这里就前面一步谈谈自己结合代码的理解。这里的navmesh指的是solo mesh,也就是静态网格,与能动态添加障碍的tile cache加以区别。后者另外单独撰文介绍。 这里推荐一个网站critterAI(网站地址),里面有两个很好的学习项目:CAINav是一个基于recast开发的可以在Unity运行的导航系...

长三月的游戏开发 2万+

LeRobot 入门教程(十四)Meta-World 机器人多任务与元强化学习操作仿真基准平台

Meta-World是一个开源机器人操作模拟基准平台,专注于多任务与元强化学习研究。该平台提供50项多样化任务(MT50套件),采用标准化评估协议测试算法泛化能力。LeRobot平台支持Meta-World任务评估,提供预处理数据集和训练工具。用户可通过命令行快速训练SmolVLA策略,并评估模型在简单、中等、困难等不同难度任务上的表现。文章还提供了兼容性问题和实用技巧建议,如使用完整MT50任务集测试泛化能力、采用one-hot任务条件化等。这些资源为研究人员开展机器人多任务学习提供了标准化实验环境。

2506_90492529的博客 1020

TBOX电源方案的详细讲解与分析

输入保护电路是确保车载电子系统稳定性的关键。通过合理选择TVS二极管、保险丝和浪涌抑制器等元器件,能够有效防止来自电源系统的瞬态过电压、浪涌和过流问题,保护后续电路免受损害。针对不同的电源环境和应用场景,可以通过提升功率、优化热管理以及选择高效元器件来进一步提高系统的保护能力和可靠性。

weixin_43199439的博客 1075

【游戏】Navmesh 知识炼化

Recast Navmesh是一个开源3D导航工具集

无尽星空--帝王铠 408

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

UE4的导航系统:场景体素化

UE4的导航使用的是RecastDetour组件,这是一个开源组件,主要支持3D场景的导航网格导出和寻路,或者有一个更流行的名字叫做NavMesh。不管是Unity还是UE都使用了这一套组件。不过UE4对其算法做了不小的修改。Github上有更为详细的源码、Demo和说明:https://github.com/recastnavigation/recastnavigation本文使用的UE4源码版本为4.24.3,2020年2月25日的版本。Recast采用了体素化的方式,来生成导航网格。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1824

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

RecastNavigation-NavMesh生成原理

概述 本篇文章介绍了NMGen的核心处理流程。NMGen用于生成多边形数据,代表了导航网格的表面。有很多种网格生成方式,但是他们都包含了下面的一些步骤。  大体流程如下: 1. 体素化。将源几何体转换成实心的高度场,用来表示不可行走的空间。 对于源几何体上的每个三角形,对应生成体素,并加入到高度场中。 2. 生成区域。将实心的高度场,转换成一个开放的紧缩高度场,用来表示实体表面上那些可以行走的部...

qq826364410的专栏 1232

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: Recast源码解析(一):射线实现原理
下一篇: Recast源码解析(二):NavMesh导航网格生成原理(上)
长三月
博客等级 码龄9年 228粉丝 80原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值