NavigationMeshGenerator

继承: Object

对导航网格进行创建和清理的辅助类。

描述

该类负责创建和清除用作 NavigationRegion3D 内的 NavigationMesh 资源的 3D 导航网格。NavigationMeshGenerator 在 2D 中的用途非常有限,因为导航网格烘焙过程需要 3D 节点类型和 3D 源几何体来解析。

整个导航网格的烘焙最好在单独的线程中完成,因为所涉及的体素化、碰撞测试、和网格优化步骤是非常耗费性能和时间的操作。

导航网格的烘焙分成若干步进行,最终结果取决于 NavigationMesh 资源的 3D 源几何体和该资源的属性。第一步是从根节点开始,并根据 NavigationMesh 的属性从 SceneTree 收集所有有效的 3D 源几何体节点。第二步会对所有收集的节点进行解析,以获得其相关的 3D 几何体数据,合并构造成一个 3D 网格。由于可解析的对象类型众多,从普通的 MeshInstance3DCSGShape3D 再到各种 CollisionObject3D,其中某些收集几何数据的操作可能会触发 RenderingServerPhysicsServer3D 的同步。服务器同步通常涉及 Mutex 锁定以确保线程安全,这会对烘焙时间或帧率产生负面影响。可解析对象过多,以及与多线程服务器之间的连续同步,都会大幅影响烘焙时间。而如果对象数量较少,但都是非常大而且复杂的对象,那么就会在为服务器准备数据上花费时间,这可能会明显拖延下一帧渲染。一般而言,可解析对象的总数与它们各自的大小和复杂度之间应该达到平衡,防止出现帧率问题和超长的烘焙时间。合并后的网格后续会被交给 Recast 导航对象,通过在网格的包围区域周边创建体素世界,来测试适合 NavigationMesh 代理属性的可行走地形的源几何体。

最终的导航网格然后将被返回并被存储在 NavigationMesh 中,用作 NavigationRegion3D 节点内的资源。

注意:使用网格不仅定义可行走的表面的导航烘焙,而且定义障碍的导航烘焙,并不总会有效。在处理网格源几何体时,导航烘焙没有什么是几何体“位于内部”的概念,这是有意为之的。根据当前的烘焙参数,一旦障碍网格足够大,大到足以在内部容纳一个导航网格区域,则烘焙时将生成位于障碍源几何体网格内部的导航网格区域。

教程

方法

void

bake ( NavigationMesh navigation_mesh, Node root_node )

void

bake_from_source_geometry_data ( NavigationMesh navigation_mesh, NavigationMeshSourceGeometryData3D source_geometry_data, Callable callback=Callable() )

void

clear ( NavigationMesh navigation_mesh )

void

parse_source_geometry_data ( NavigationMesh navigation_mesh, NavigationMeshSourceGeometryData3D source_geometry_data, Node root_node, Callable callback=Callable() )


方法说明

void bake ( NavigationMesh navigation_mesh, Node root_node )

由于核心多线程方面的更改,烘焙功能已废弃。更新现有代码时,请先创建一个 NavigationMeshSourceGeometryData3D 资源。调用 parse_source_geometry_data 来解析 SceneTree 中影响导航网格烘焙的节点时请使用该资源。对 SceneTree 的解析需要在主线程进行。解析完成后,请在调用 bake_from_source_geometry_data 时使用该资源对导航网格进行烘焙。


void bake_from_source_geometry_data ( NavigationMesh navigation_mesh, NavigationMeshSourceGeometryData3D source_geometry_data, Callable callback=Callable() )

使用 source_geometry_data 中提供的数据对 navigation_mesh 进行烘焙。烘焙过程结束后,会调用可选的 callback


void clear ( NavigationMesh navigation_mesh )

从提供的 navigation_mesh 资源中移除所有多边形和顶点。


void parse_source_geometry_data ( NavigationMesh navigation_mesh, NavigationMeshSourceGeometryData3D source_geometry_data, Node root_node, Callable callback=Callable() )

根据 navigation_mesh 的属性解析 SceneTree 中的源几何体。会使用解析的结果对提供的 source_geometry_data 资源进行更新。后续可以在使用 bake_from_source_geometry_data 烘焙导航网格时使用该资源。解析过程完成后,会调用可选的 callback

注意:因为 SceneTree 并不是线程安全的,所以这个函数需要在主线程执行或使用延迟调用。

注意:Mesh 资源读取数据数组虽然很方便,但会对帧率造成负面影响。这些数据需要从 GPU 获取,卡住正在处理的 RenderingServer。出于性能考量,请优先使用碰撞形状或在代码中创建完整的数据数组等方法。

Previous Next


© 版权所有 2014-present Juan Linietsky, Ariel Manzur and the Godot community (CC BY 3.0). Revision b1c660f7.

Built with Sphinx using a theme provided by Read the Docs.