- 1 Introduction
- 2 Automatic Navigation Mesh Generation
- 3 Editing the Navigation Mesh
- 3.1 The Navigation Mesh Editor
- 3.2 Using Mesh Editing Commands
- 3.3 Basic Mesh Editing Commands
- 3.4 Adding Place Names
- 3.5 Common Mesh Problems and Solutions
- 3.6 Advanced Editing Techniques
- 4 Navigation Mesh Console Command Reference
A Navigation Mesh represents the "walkable areas" of a map. This data is required by Bots and Hostages in Counter-Strike:Source, allowing them to "know" how to move around in the environment.
Navigation Mesh data is stored in a .nav file corresponding to the map file (.bsp) for which it is used. For example, the nav mesh for
cstrike\maps\de_dust.bsp is stored in
To support the many community-created maps, Counter-Strike:Source includes an automatic mesh generation system. The first time you attempt to play a custom map with bots, the generation system will build a .nav file for that map. Depending on the size and complexity of the map, this may take a few minutes to a few hours. Most maps take about 5 minutes to auto-generate a .nav file. Once the generation is complete, a .nav file is saved to your hard drive for future use.
What is Computed During Generation
The following steps occur during Navigation Mesh generation:
- Starting at a player spawn point, walkable space is sampled by "flood-filling" outwards from that spot, searching for adjacent walkable points
- Rectangular Navigation Areas are constructed from the sampled data
- Hiding and Sniper spots are computed
- Encounter Spots and Approach Points are computed (this can take awhile)
- Initial Encounter areas are computed
Manually Starting the Generation Process
To start the generation process manually, type
nav_generate from the console.
To see the resulting Navigation Mesh, type
nav_edit 1. To turn the mesh editor off, type
Explicity Marking Walkable Areas (ie: "There's no mesh upstairs")
Some maps that have very steep stairs, ramps, or hills may confuse the generation system, resulting in the Navigation Mesh not covering the entire map. To solve this, you can manually place additional walkable markers that tell the generator to search outwards from that point during its sampling phase.
To add one or more walkable markers, first aim your view towards a known walkable spot in your map, then type
nav_mark_walkable in the console. When you are finished placing markers, type
nav_generate to re-generate the mesh.
Quickly Generating Meshes for Testing
The analysis phase of the generator can be quite time consuming. To skip it, type
nav_quicksave 1 in the console.
NOTE: "Quicksaving" skips the analysis phase, and the resultant nav mesh will be missing important data required by the CS Bots and Hostages higher-level planning and attention systems. While useful for testing, editing, and tuning a nav mesh, be sure to do a full analyze (ie: with
nav_quicksave 0) before publishing your nav file to others.
The automated Navigation Mesh generator does a reasonable job of constructing a mesh, allowing you to start using Bots and Hostages on custom maps easily.
However, careful hand-tuning of the Navigation Mesh can markedly improve the performance of Bots. In addition, manually decorating the mesh with Place Names allows the Bots to tell others where events occur, enhances the Counter-Strike radar and includes Place Names in all radio messages.
To enable the editor, type
nav_edit 1 in the console (type
nav_edit 0 to disable it).
- The white cross in the center of your view is the cursor.
- The Navigation Area you are pointing at is the selected area and is shown with a yellow outline.
- Navigation Areas that can be reached from the selected area are shown in red.
- The white line in the selected area denotes where the area will be split if the
nav_splitcommand is executed.
Areas marked with a green "X" are Jump Areas. Jump Areas tell bots that they must jump to reach the higher connected area, and that this area is not usable as a hiding/sniping spot.
Areas marked with a blue diagonal slash are Crouch Areas. Bots are forced to crouch when moving through this area.
Two-Way (Bidirectional) Connections
Most areas are connected to adjacent areas via two-way, or bidirectional connections. This allows bots to freely move between the two areas. Bi-directional connections are shown as light blue lines at the edges of areas.
One-way connections are usually used for "jump-down" links from a high ledge to the ground. This tells the bots that they can jump down, but they can't jump back up. One-way links can also be useful for forcing bots to travel a specific direction, perhaps to set up for a tricky jump. One-way links are dark blue.
Using Mesh Editing Commands
Although all of the mesh editing commands can be typed in the console, in practise it is far easier to bind these commands to keys. For example,
bind del nav_delete binds the delete key to the command nav_delete. After this binding, pressing the delete key will delete the nav area under your cursor (if you are nav editing mode).
Basic Mesh Editing Commands
Currently, there is no "undo" command in the Navigation Mesh editing system. Therefore, it is very important to save your work often via the
To merge two adjacent areas:
- Aim your cursor at the first area and execute
- Aim your cursor at the second area and execute
Note that both areas must be the same size along the edge to be merged.
The resulting area will retain all of the connections of the original two areas, and inherit properties (ie: Place Names, etc) from the marked area.
Splicing creates a new area between two existing areas. Splicing is a powerful tool, and can be used to easily create sloped areas, as shown in the example below.
To delete an area, aim your cursor at it and execute
Creating a New Area
To manually create a new area:
- Place your cursor at where a corner of the new area should be
- Move your cursor to drag out the area's extent
Adding and Removing Connections Between Areas
The connections between areas define whether an agent can move from one area to another. Usually these connections are bidirectional, meaning agents can move back and forth between two areas at will. However, sometimes the connection is one way, as in the case of high ledges that can be jumped down, but not back up.
To make a one-way connection from area A to area B (meaning you can move from A to B):
- Place your cursor on area A
- Mark area A with
- Aim your cursor at area B
To make a bidirectional connection, repeat the above steps reversing the roles of A and B.
To remove all connections from areas A and B:
- Aim at area A
- Mark area A with
- Aim at area B
Adding Place Names
Place Names can be assigned to areas to label that region of the map. For instance, if there is a prominent house in the map, all of the nav areas in the house can be tagged with the "House" Place Name.
Place Names are used by the CS Bot chatter system to announce where they are, as well as by the radar to show the current location of the player, and is appended to the player's name when they use text chat or radio commands.
To enter and leave "Place Painting Mode", execute
nav_edit is set to "1").
For a list of all available Place Names, execute
Select a Place by typing
nav_use_place (name). Then aim your cursor at an area you want to label with that Place Name and execute
nav_toggle_place_painting. While "place painting" is active, each area you point at will be tagged with the current Place Name. To stop place painting, execute
There are several additional commands that provide tools for picking, flood-filling, replacing, and so on. For a complete reference, see Place Name Commands.
Common Mesh Problems and Solutions
Extraneous Areas on Stairs and Ramps
The automatic generation system tends to build areas that hang off the side of stairs and ramps. These should be removed to force the bots to take the stairs or ramp straight-on.
Railings can be a problem for the current bot navigation system. Including jump-down links that must pass over railings should be avoided unless necessary. The bots will eventually make these jumps, but they are not terribly elegant while doing so.
Preventing Excessive Jumping
When to use the
Dealing with Rotating Doors
Carving out empty space in the nav mesh to allow for the rotating door.
Advanced Editing Techniques
Ladders can be manually built against climbable surfaces. Your editing cursor will turn green when pointing at a climbable surface.
The easy way to build a ladder is to simply point at a climbable surface, and execute
nav_build_ladder isn't what you need, you can manually create a ladder:
- Place your cursor at where a corner of the new ladder should be
- Move your cursor to drag out the ladder's extent
This can be useful to get bots to start going up the ladder, and jump off halfway up, onto the crate:
Sometimes a ladder will be created facing the wrong way. If a ladder is drawn in red, you are looking at it from the back. The ladder is drawn in green if it is facing you. To change the orientation of a ladder, simply point at the ladder and use
Obstacle Avoidance and Precision Movement
nav_stop to disable local obstacle avoidance behaviors and control bot movement.
Marking Areas to Avoid
nav_avoid to tell bots to avoid the area unless the normal route has become too dangerous.
Controlling Where Bots Can Hide
nav_no_hide to prevent bots from hiding in that area.
How to force the creation of hiding spots during the analysis phase.
Lining up Tricky Jumps and Narrow Doorways
Arranging nav areas to force specific paths.
- Generate a Navigation Mesh for the current map and save it to disk.
- Run the generation process again without altering the existing mesh. If there are additional walkable areas and/or walkable_marks, new areas will be generated and added to the mesh. Note that these new areas will have to be manually connected to the existing mesh.
- Analyze the current Navigation Mesh and save it to disk. The analysis phase computes the second-order data needed by the bots for their planning and attention systems.
- Mark the current location as a walkable position. These positions are used as seed locations when sampling the map to generate a Navigation Mesh.
- Erase any previously placed walkable positions.
- Saves the current Navigation Mesh to disk.
- Loads the Navigation Mesh for the current map.
- Deletes the currently highlighted Area.
- To split an Area into two, align the split line using your cursor and invoke the split command.
- Chops the marked area into disconnected sub-areas suitable for sniper spots.
- To merge two Areas into one, mark the first Area, highlight the second by pointing your cursor at it, and invoke the merge command.
- Marks the Area or Ladder under the cursor for manipulation by subsequent editing commands.
- Clears the marked Area or Ladder.
- Defines a corner of a new Area or Ladder. To complete the Area or Ladder, drag the opposite corner to the desired location and issue a 'nav_end_area' command.
- Defines the second corner of a new Area or Ladder and creates it.
- To connect two Areas, mark the first Area, highlight the second Area, then invoke the connect command. Note that this creates a one-way connection from the first to the second Area. To make a two-way connection, also connect the second area to the first.
- To disconnect two Areas, mark an Area, highlight a second Area, then invoke the disconnect command. This will remove all connections between the two Areas.
- To splice, mark an area, highlight a second area, then invoke the splice command to create a new, connected area between them.
- Select a corner of the currently marked Area. Use multiple times to access all four corners.
- Raise the selected corner of the currently marked Area.
- Lower the selected corner of the currently marked Area.
- Places the selected corner of the currently marked Area on the ground.
- Toggles the 'must crouch in this area' flag used by the AI system.
- Toggles the 'dont avoid obstacles' flag used by the AI system.
- Toggles the 'traverse this area by jumping' flag used by the AI system.
- Toggles the 'dont jump in this area' flag used by the AI system.
- Toggles the 'must stop when entering this area' flag used by the AI system.
- Toggles the 'traverse this area by walking' flag used by the AI system.
- Toggles the 'traverse this area by running' flag used by the AI system.
- Toggles the 'avoid this area when possible' flag used by the AI system.
- Toggles the 'area is transient and may become blocked' flag used by the AI system.
- Toggles the 'area is not suitable for hiding spots' flag used by the AI system.
- Toggles the 'stand while hiding' flag used by the AI system.
- Toggles the 'hostages cannot use this area' flag used by the AI system.
Place Name Commands
- If used without arguments, all available Places will be listed. If a Place argument is given, the current Place is set.
- Replaces all instances of the first place with the second place.
- Lists all place names used in the map.
- Toggle the editor into and out of Place mode. Place mode allows labelling of Area with Place names.
- Sets the editor into or out of Place mode. Place mode allows labelling of Area with Place names.
- Sets the Place of the Area under the cursor to the curent Place, and 'flood-fills' the Place to all adjacent Areas. Flood-filling stops when it hits an Area with the same Place, or a different Place than that of the initial Area.
- Sets the current Place to the Place of the Area under the cursor.
- Toggles Place Painting mode. When Place Painting, pointing at an Area will 'paint' it with the current Place.
- Scans the maps directory and reports any missing/out-of-date navigation files.
- Updates the blocked/unblocked status for every nav area.
- Updates the blocked/unblocked status for every nav area.
- Removes jump areas with at most 1 connection to a ladder or non-jump area.
- Strips all Hiding Spots, Approach Points, and Encounter Spots from all Areas in the mesh.
- Mark an Area with no Place name. Useful for finding stray areas missed when Place Painting.
- Warps the player to the marked area.
- Flips the selected ladder's direction.
- Re-orders area and ladder ID's so they are continuous.
- Draws the bounding boxes of all func_ladders in the map.
- Attempts to build a nav ladder on the climbable surface under the cursor.
- nav_area_bgcolor R G B A
- RGBA color to draw as the background color for nav areas while editing.
- nav_create_place_on_ground (0 or 1)
- If set to 1, nav areas will be placed flush with the ground when created by hand.
- nav_coplanar_slope_limit value
- Metric to determine whether adjacent walkable samples are planar and can be used to create a single planar nav area. If the dot product of two adjacent candidate's unit normals is equal to or greater than value, they are considered co-planar and can be merged. Therefore, value can range from 0 to 1.
- nav_draw_limit count
- The maximum number of areas to draw in edit mode
- nav_edit (0 or 1)
- Set to one to interactively edit the Navigation Mesh. Set to zero to leave edit mode.
- nav_restart_after_analysis (0 or 1)
- If set to 1, when nav nav_restart_after_analysis finishes, restart the server. Turning this off can cause crashes, but is useful for incremental generation.
- nav_show_approach_points (0 or 1)
- Show Approach Points in the Navigation Mesh.
- nav_show_area_info duration
- Duration in seconds to show nav area ID and attributes while editing
- nav_show_danger (0 or 1)
- Show current 'danger' levels.
- nav_show_player_counts (0 or 1)
- Show current player counts in each area.
- nav_slope_limit Z
- The ground unit normal's Z component must be greater than this for nav areas to be generated.
- nav_snap_to_grid (0 or 1)
- If set to 1, snap to the nav generation grid when creating new nav areas
- nav_split_place_on_ground (0 or 1)
- If set to 1, nav areas will be placed flush with the ground when split.
- nav_quicksave (0 or 1)
- Set to one to skip the time consuming phases of the analysis. Useful for data collection and testing.
Addition information can be found here.