API

Navigation Debugger

The Navigation Debugger

It provides an overlay for developers to better understand why agents behave the way they do, and makes tuning navmesh parameters much easier.

You can use Navigation Debugger to inspect:

  • The generated navmesh (tiles & layers)
  • Off-mesh connections (teleports / jump links)
  • Intermediate build data (if keepIntermediates: true)

Note: Keeping intermediates uses more memory. For production builds, it’s recommended to leave this set to false.

Debug overlay to display intermediate build data

You have to set keepIntermediates: true in the navmesh parameters to retain the intermediate build data after the navmesh is built.

First, you need to create a NavigationDebugger instance and pass a Babylon.js scene and optional parameters to the NavigationDebugger.constructor:

constructor(
scene: Scene,
options?: {
parent?: {
node?: TransformNode | string;
};
primitiveTypes?: DebugDrawerPrimitiveType[];
materials?: {
triMaterial?: StandardMaterial;
pointMaterial?: StandardMaterial;
lineMaterialOptions: {
greasedLineMaterialOptions: Partial<GreasedLineMaterialOptions>;
greasedLineMeshOptions: Partial<GreasedLineMeshOptions>;
};
};
}
)

Parameters

ParameterTypeDescription
scene
Scene
The Babylon.js scene where the debug drawer will be created.
options
object (optional)
Additional configuration options for customizing parent node, primitive types, and materials.

Options parameter

PropertyType
parent.node
TransformNode | string
primitiveTypes
DebugDrawerPrimitiveType[]
materials.triMaterial
StandardMaterial
materials.pointMaterial
StandardMaterial
materials.lineMaterialOptions
  .greasedLineMaterialOptions
Partial<GreasedLineMaterialOptions>
materials.lineMaterialOptions
  .greasedLineMeshOptions
Partial<GreasedLineMeshOptions>
type DebugDrawerPrimitiveType = "lines" | "tris" | "quads" | "points";
  • parent.node — Optional parent node (or its name) to which the debug drawer should be attached.
  • primitiveTypes — List of primitive types (triangles, lines, points) to enable for debugging visualization.
  • materials.triMaterial — Custom material for drawing triangle primitives.
  • materials.pointMaterial — Custom material for drawing point primitives.
  • materials.lineMaterialOptions.greasedLineMaterialOptions — Configuration for the GreasedLineMaterial used when rendering debug lines.
  • materials.lineMaterialOptions.greasedLineMeshOptions — Configuration for the GreasedLineMesh geometry options.

You can then call the draw function to visualize the required layers:

const debugLayerOptions = DebugLayerOption.COMPACT_HEIGHTFIELD_DISTANCE;
debug.draw(navigationPlugin.navMesh, navigationPlugin.intermediates, scene, debugLayerOptions);

Available DebugLayerOptions

ConstantDescription
HEIGHTFIELD_SOLID
Shows the raw solid voxel heightfield generated from geometry.
HEIGHTFIELD_WALKABLE
Shows the walkable areas in the heightfield after slope and clearance tests.
COMPACT_HEIGHTFIELD_SOLID
Shows the compact heightfield, a memory-efficient representation of voxels.
COMPACT_HEIGHTFIELD_REGIONS
Displays distinct connected regions extracted from the compact heightfield.
COMPACT_HEIGHTFIELD_DISTANCE
Shows the distance field used for region partitioning and contour tracing.
RAW_CONTOURS
Displays raw, un-simplified contours extracted from regions.
CONTOURS
Shows simplified and optimized contours, ready for polygonization.
POLY_MESH
Displays the polygon mesh generated from contours.
POLY_MESH_DETAIL
Shows the detailed mesh (with height detail) built on top of the polygon mesh.
NAVMESH
Displays the final navigation mesh used for pathfinding.
NAVMESH_BV_TREE
Shows the bounding volume tree (BVTree) used for fast spatial queries.

Note: You can also use the specific draw functions from the NavigationDebugger. Refer to the NavigationDebugger API.

Drawing a debug nav mesh where polyFlags are set to 1 (default value) with blue color:

debug.drawNavMeshPolysWithFlags(navigationPlugin.navMesh, 1, 0x0000ff);

This function visualizes the off-mesh connections, as seen in the image:

Examples

Example of creating a line debugger and setting the GreasedLine properties in the options parameter:

import { Color3 } from "@babylonjs/core/Maths/math.color";
const debug = new ADDONS.NavigationDebugger(scene, {
primitiveTypes: ["lines"],
materials: {
lineMaterialOptions: {
greasedLineMaterialOptions: {
width: 8,
sizeAttenuation: true,
color: Color3.Yellow(),
},
},
},
});

You can then visualize the intermediate data as follows:

debug.draw(navigationPlugin.navMesh, navigationPlugin.intermediates, scene, ADDONS.DebugLayerOption.COMPACT_HEIGHTFIELD_DISTANCE);

Polymesh detail

BV tree

The createDebugNavMesh function

The function navigationPlugin.createDebugNavMesh is available in V2 to maintain backwards compatibility.