A* path finding made lightning-fast by pre-compiling
by Bjarne Grönnevik · 08/23/2005 (3:21 pm) · 127 comments
Pre-compiled A* path-finding
This resource contains an AI path finder implemented in C++ for Torque.
It is capable of calculating the best path from one node to another by using the A* algorithm.
DOWNLOAD THE SCOURCE AND EXAMPLE CODE HERE
Its interface suggests that it can work in both pre-compiled and "live" mode, but this is not true as it does nothing if the navigation net has not been pre-compiled. It does however have all the stuff needed to run in a "live" mode, you just have to add some code to call the pathmanager in this case ( I never completed that part of the code as we only use pre-compiled paths ).
The plus side
- If the navigation nodes are pre-compiled, the "live" work is reduced to fetching an entry from a table.
- If using "live" pathfinding: it is still a lot faster than in having the pathfinder implemented in script ( A navigation net that took 15 minutes to calculate with the A* implementation in the "CTF Bots" resource took about 10 seconds to compile with this path manager ).
The minus side
- When using the precompiled pathfinding, you will have trouble with a dynamic navigation net ( Like supporting un-locking a door, or blowing up a bridge ).
- The pre-compiled data may get big in huge navigation nets ( But I tried to save a minimal amount of data ).
How it works
1) Place a bunch of navigation nodes in your map.
2) Feed the AIPathNodeGraph all the nodes in your map ( a 3D locaion & a movement modifier ).
3) Tell it what nodes are connected to each other.
4) Tell the AIPathNodeGraph to compile all the nodes to find out where you can go from where.
5) Start using it.
Heads up!
When using the pre compiled pathfinder( the only thing that works ), you do not get a complete path when asking how to get from point A to point B as you would expect then using the A* algorithm... you will only get the next node to go to from point A.
This is because this is the only data that is saved when compiling.
If you really need all of the path you can ask again from the next node or re-write the as you see fit.
When you go to work ( shool, shop, visit your hamster ) do you plan how to get past that signpost on the other side of town before you get out of bed? ;)
Using the system - Nodes
In the file Navigation.cs there is a declaration of the NavNode. This is the nodes that the system uses to create the navigation graph. They should now be found as editor objects under the shapes/NavigationNode category in the mission editor.
These nodes MUST be placed in a group named "MissionGroup/NavigationNet". So create this group and add a bunch of NavNode objects to it.
The default move modifier for a node is 0. So if you don't set the moveMod to something higher than that, the node will be easy to walk to. The maximum value of moveMod is 1. Setting it to 1 or higher will make the node impossible to reach. Setting it to something like 0.9 will make the node lava-filled, that is: sure, you can go there, but you won't unless the barrel of a loaded shotgun tells you so.
Some tips on node placement:
1) Visibility: Nodes are linked together if they "can see" each other ( using a raycast ) and are close enough to each other ( see tip 2 ). So make sure you have a clear line of sight between nodes that you want to become a walkable path. And remember, the collision boxes of objects may not nessesarily be even remotely close to what its visible geometry suggests. And place the nodes a bit above ground to avoid "blinding" them, at eye-level is a good rule of thumb ( eye? ).
2) Distance: Using the variable $NAV_NODE_RADIUS in "Navigation.cs" ( default value = 80 ), you can control the maximum distance that two nodes can have and still be linked. So if you hava a corridor that is 100 units long, it would probably be enough with a node just outside each end and one in the middle. More nodes than that would only increase the compile time. But let me disagree with myself at once here: Say you would expect BOTs to hang around in this corridor, there would be only one node to hang around. And if two (friendly?) BOTs meet in this corridor, they would likely collide and head-butt each other ( See my example map, lots of stubborn BOTs there ).
So in conclusion: Keep your nodes sparse, unless you need more of them for any reason.
3) Separete node nets: After placing some nodes and realising they seem to link up and compile nicely ( all the ugly pink blobs are gone ): You may find that a BOT can't reach all the areas you expect it to. Indeed, the system detects nodes that aren't linked to other nodes, but there is still no guarantee that all nav-nodes have been linked into a single nav-net. Several nav-net may have been created that has no links to each other. This can be both a problem and a feature.
If it is a problem for you: go back to 1 and 2 adn make sure the nodes are close enough and can see each other.
If it is a feature for you: Use it to place BOTs in separate areas of your map and make sure they stay there.
4) The A* algorithm outsmarting you: Say you put your nodes in a fine round arc. You think the BOT will use it? Not bloody likely! Not unless the nodes are just inside the $NAV_NODE_RADIUS from each other. The A* algorithm works by finding the shortest ( if all nodes have the same move-modifiers ) or the most efficient ( if some nodes have the altered move-modifiers ) route to its destination. This may not be the route you would want it to take, and the bot may take corners with questionable grace, as an example. To reduce this: Make sure that the nodes are sparse enough to force the BOT using the nodes you placed, or work with the visibility. Or just accept that your computer is smarter than you.
5) Use the editor: The path drawing code supplied by Stephane Conde makes the paths show up in red when in the editor. Use this to find out what the system is actually doing.
Using the system - Compiling
If everything goes according to plan ( it never does ), you should be able to compile the path nodes by calling the "buildNodeGraph()" method. It will then be saved to the file:
Two warnings here:
1) If the directory "data/missions/paths" does not exist ( only "data/missions" usually exist ) you will have to create it manually, else all the hard compiling will be done and still it will not be able to save it for a rainy day.
2) The system will not detect if you move the nodes around, change their values or make any chnges to them at all: so after you edit the navigation nodes, you will have to remove the path file manually. If you don't the system will use the old node data that has been saved to the path file.
Finding out where to go next
If the systen is started up correctly, you should now have an object named NodeGraph that can do magic for you.
Righty: Say you have a BOT that has just spawned and he/she/it wants to haul ass to some place other than where it is right now.
First it needs to know its closest node, so do this ( %somethingInTheWrongPlace would typically be the BOT or anything that can have getPosition() called upon it ):
...this call will reply with an index of the closest node ( Not the ID of the node or anything like that, the ID is a number used internally in the NodeGraph ).
Second thing to do is the same with a location that you want the BOT to go to:
Third you ask the system of the ID of the next node to go to:
Fourth you ask for the actual location of the node:
Fifth you just tell your BOT to go there. This should be something like this:
The files and where to put them
OK, enough teasing, you want the code don't you.
The C++ source are new objects, so you should only need to add these two files to your project(included in the Zip file):
engine/game/AIPathManager.h
engine/game/AIPathManager.cc
...also: Remember actually adding the files to your project. :)
Files to edit
If you want the node net to be drawn with red lines when in editor mode ( trust me, you want this, at least while developing ) edit this file:
engine/editor/worldEditor.cc
Add:
...as the last #include statement.
And in WorldEditor::renderScene(), just after glDepthFunc(GL_LEQUAL); (should be the 2nd line in the function...) put this:
...that should be all you need for the C++ code.
OK: now we move over to the scripting part of this beast(included in the Zip file):
server/scripts/Navigation.cs
...remeber to actually execute the file above with something like:
...someplace like in function onServerCreated() in server/scripts/game.cs.
Now to perform the actual compiling-saving-loading of the nodes, you would typically call:
...from inside the "startGame()" method in the file "server/scrits/game.cs".
To get the NavNode selectable in the editor, copy all the files in the "data/shapes/markers" directory of the Zip file to, yep ypu guessed it, "data/shapes/markers" ( There is no absolute need to use these, you can use any entity that has a location. But I'd recommend using these nav markers as it will be easier to pinpoint errors if you have the same files as everyone else ).
Installing the example
In the Zip file for this resource there is also a very simple example map.
It is the classic "Stronghold" with 72 nodes and 100 Torque Orcs added.
They collide and block each other and act really stupid as they blindly follow their paths and dont give a rats ass about their surroundigs.
Install instructions can be found in the Zip file.
The screenshot is from this map in action.
DOWNLOAD THE SCOURCE AND EXAMPLE CODE HERE
That's it, my work here is done
Using this system, you should be able to have 200 BOT:s running around your map and having the poly count be a bigger problem than the pathfinding :D
/Bjarne
Thanx to:
- Mark Holocomb, author of the AI Pathfinding with CTF Demo ( This resource started there and grew to its current state because the specific needs of our project. )
- Stephane Conde, that supplied the code to visualize the node-net in the editor.
This resource contains an AI path finder implemented in C++ for Torque.
It is capable of calculating the best path from one node to another by using the A* algorithm.
DOWNLOAD THE SCOURCE AND EXAMPLE CODE HERE
Its interface suggests that it can work in both pre-compiled and "live" mode, but this is not true as it does nothing if the navigation net has not been pre-compiled. It does however have all the stuff needed to run in a "live" mode, you just have to add some code to call the pathmanager in this case ( I never completed that part of the code as we only use pre-compiled paths ).
The plus side
- If the navigation nodes are pre-compiled, the "live" work is reduced to fetching an entry from a table.
- If using "live" pathfinding: it is still a lot faster than in having the pathfinder implemented in script ( A navigation net that took 15 minutes to calculate with the A* implementation in the "CTF Bots" resource took about 10 seconds to compile with this path manager ).
The minus side
- When using the precompiled pathfinding, you will have trouble with a dynamic navigation net ( Like supporting un-locking a door, or blowing up a bridge ).
- The pre-compiled data may get big in huge navigation nets ( But I tried to save a minimal amount of data ).
How it works
1) Place a bunch of navigation nodes in your map.
2) Feed the AIPathNodeGraph all the nodes in your map ( a 3D locaion & a movement modifier ).
3) Tell it what nodes are connected to each other.
4) Tell the AIPathNodeGraph to compile all the nodes to find out where you can go from where.
5) Start using it.
Heads up!
When using the pre compiled pathfinder( the only thing that works ), you do not get a complete path when asking how to get from point A to point B as you would expect then using the A* algorithm... you will only get the next node to go to from point A.
This is because this is the only data that is saved when compiling.
If you really need all of the path you can ask again from the next node or re-write the as you see fit.
When you go to work ( shool, shop, visit your hamster ) do you plan how to get past that signpost on the other side of town before you get out of bed? ;)
Using the system - Nodes
In the file Navigation.cs there is a declaration of the NavNode. This is the nodes that the system uses to create the navigation graph. They should now be found as editor objects under the shapes/NavigationNode category in the mission editor.
These nodes MUST be placed in a group named "MissionGroup/NavigationNet". So create this group and add a bunch of NavNode objects to it.
The default move modifier for a node is 0. So if you don't set the moveMod to something higher than that, the node will be easy to walk to. The maximum value of moveMod is 1. Setting it to 1 or higher will make the node impossible to reach. Setting it to something like 0.9 will make the node lava-filled, that is: sure, you can go there, but you won't unless the barrel of a loaded shotgun tells you so.
Some tips on node placement:
1) Visibility: Nodes are linked together if they "can see" each other ( using a raycast ) and are close enough to each other ( see tip 2 ). So make sure you have a clear line of sight between nodes that you want to become a walkable path. And remember, the collision boxes of objects may not nessesarily be even remotely close to what its visible geometry suggests. And place the nodes a bit above ground to avoid "blinding" them, at eye-level is a good rule of thumb ( eye? ).
2) Distance: Using the variable $NAV_NODE_RADIUS in "Navigation.cs" ( default value = 80 ), you can control the maximum distance that two nodes can have and still be linked. So if you hava a corridor that is 100 units long, it would probably be enough with a node just outside each end and one in the middle. More nodes than that would only increase the compile time. But let me disagree with myself at once here: Say you would expect BOTs to hang around in this corridor, there would be only one node to hang around. And if two (friendly?) BOTs meet in this corridor, they would likely collide and head-butt each other ( See my example map, lots of stubborn BOTs there ).
So in conclusion: Keep your nodes sparse, unless you need more of them for any reason.
3) Separete node nets: After placing some nodes and realising they seem to link up and compile nicely ( all the ugly pink blobs are gone ): You may find that a BOT can't reach all the areas you expect it to. Indeed, the system detects nodes that aren't linked to other nodes, but there is still no guarantee that all nav-nodes have been linked into a single nav-net. Several nav-net may have been created that has no links to each other. This can be both a problem and a feature.
If it is a problem for you: go back to 1 and 2 adn make sure the nodes are close enough and can see each other.
If it is a feature for you: Use it to place BOTs in separate areas of your map and make sure they stay there.
4) The A* algorithm outsmarting you: Say you put your nodes in a fine round arc. You think the BOT will use it? Not bloody likely! Not unless the nodes are just inside the $NAV_NODE_RADIUS from each other. The A* algorithm works by finding the shortest ( if all nodes have the same move-modifiers ) or the most efficient ( if some nodes have the altered move-modifiers ) route to its destination. This may not be the route you would want it to take, and the bot may take corners with questionable grace, as an example. To reduce this: Make sure that the nodes are sparse enough to force the BOT using the nodes you placed, or work with the visibility. Or just accept that your computer is smarter than you.
5) Use the editor: The path drawing code supplied by Stephane Conde makes the paths show up in red when in the editor. Use this to find out what the system is actually doing.
Using the system - Compiling
If everything goes according to plan ( it never does ), you should be able to compile the path nodes by calling the "buildNodeGraph()" method. It will then be saved to the file:
data/missions/paths/<name_of_your_mission_file>.path
Two warnings here:
1) If the directory "data/missions/paths" does not exist ( only "data/missions" usually exist ) you will have to create it manually, else all the hard compiling will be done and still it will not be able to save it for a rainy day.
2) The system will not detect if you move the nodes around, change their values or make any chnges to them at all: so after you edit the navigation nodes, you will have to remove the path file manually. If you don't the system will use the old node data that has been saved to the path file.
Finding out where to go next
If the systen is started up correctly, you should now have an object named NodeGraph that can do magic for you.
Righty: Say you have a BOT that has just spawned and he/she/it wants to haul ass to some place other than where it is right now.
First it needs to know its closest node, so do this ( %somethingInTheWrongPlace would typically be the BOT or anything that can have getPosition() called upon it ):
%iWantToGoFromHere = NodeGraph.getClosestNodeIndex(%somethingInTheWrongPlace.getPosition());
...this call will reply with an index of the closest node ( Not the ID of the node or anything like that, the ID is a number used internally in the NodeGraph ).
Second thing to do is the same with a location that you want the BOT to go to:
%iWantToGoToHere = NodeGraph.getClosestNodeIndex(%someNicerTarget.getPosition());..or just:
// The location "1.0 2.5 666.0" is the nicest place I know :)
%iWantToGoToHere = NodeGraph.getClosestNodeIndex("1.0 2.5 666.0");Third you ask the system of the ID of the next node to go to:
%idOfNextPlaceToGoTo = NodeGraph.getNextNodeIndexOnPath(%iWantToGoFromHere, %iWantToGoToHere );
Fourth you ask for the actual location of the node:
if(%idOfNextPlaceToGoTo != -1) {
%nextCoordinateToGoToReachBliss = NodeGraph.getNode(%idOfNextPlaceToGoTo);
}Fifth you just tell your BOT to go there. This should be something like this:
%somethingInTheWrongPlace.setMoveDestination(%nextCoordinateToGoToReachBliss, true);
The files and where to put them
OK, enough teasing, you want the code don't you.
The C++ source are new objects, so you should only need to add these two files to your project(included in the Zip file):
engine/game/AIPathManager.h
engine/game/AIPathManager.cc
...also: Remember actually adding the files to your project. :)
Files to edit
If you want the node net to be drawn with red lines when in editor mode ( trust me, you want this, at least while developing ) edit this file:
engine/editor/worldEditor.cc
Add:
#include "game/AIPathManager.h"
...as the last #include statement.
And in WorldEditor::renderScene(), just after glDepthFunc(GL_LEQUAL); (should be the 2nd line in the function...) put this:
// Render the new paths
for(SimSetIterator itr(Sim::getRootGroup()); *itr; ++itr)
{
AIPathNodeGraph* obj = dynamic_cast<AIPathNodeGraph*>(*itr);
if (obj)
obj->renderPaths();
}...that should be all you need for the C++ code.
OK: now we move over to the scripting part of this beast(included in the Zip file):
server/scripts/Navigation.cs
...remeber to actually execute the file above with something like:
exec("./Navigation.cs");...someplace like in function onServerCreated() in server/scripts/game.cs.
exec("./Navigation.cs");Now to perform the actual compiling-saving-loading of the nodes, you would typically call:
buildNodeGraph();
...from inside the "startGame()" method in the file "server/scrits/game.cs".
To get the NavNode selectable in the editor, copy all the files in the "data/shapes/markers" directory of the Zip file to, yep ypu guessed it, "data/shapes/markers" ( There is no absolute need to use these, you can use any entity that has a location. But I'd recommend using these nav markers as it will be easier to pinpoint errors if you have the same files as everyone else ).
Installing the example
In the Zip file for this resource there is also a very simple example map.
It is the classic "Stronghold" with 72 nodes and 100 Torque Orcs added.
They collide and block each other and act really stupid as they blindly follow their paths and dont give a rats ass about their surroundigs.
Install instructions can be found in the Zip file.
The screenshot is from this map in action.
DOWNLOAD THE SCOURCE AND EXAMPLE CODE HERE
That's it, my work here is done
Using this system, you should be able to have 200 BOT:s running around your map and having the poly count be a bigger problem than the pathfinding :D
/Bjarne
Thanx to:
- Mark Holocomb, author of the AI Pathfinding with CTF Demo ( This resource started there and grew to its current state because the specific needs of our project. )
- Stephane Conde, that supplied the code to visualize the node-net in the editor.
About the author
#2
Anthony Bertolo
BBiGames
08/23/2005 (11:35 am)
Awesome resource. Our project will require large amounts of Bots in the level at any given time, and the fix to the CTFBot's lag is a major help. Thank you for your time in creating such a resource.Anthony Bertolo
BBiGames
#3
08/23/2005 (12:05 pm)
How long does it take to compile the .path info, in comparison to the time it takes to light a scene?
#4
08/23/2005 (12:24 pm)
Quote: How long does it take to compile the .path info, in comparison to the time it takes to light a scene?Depends on the amount of nodes, but a map I have with about 120 nodes takes no more than 10 seconds. And remember, thats a one-time compile.
#5
Thanks a billion Bjarne for this release, I'm soo adding your name to the page of credits in my little "for-fun" project. :)
[edit]
Oohh BTW, great instructions on howto use this thing, very well written
[/edit]
08/23/2005 (4:52 pm)
holy crap, this is exactly what I need right now.Thanks a billion Bjarne for this release, I'm soo adding your name to the page of credits in my little "for-fun" project. :)
[edit]
Oohh BTW, great instructions on howto use this thing, very well written
[/edit]
#6
08/23/2005 (5:49 pm)
Awesome work and great explaination
#7
08/23/2005 (6:38 pm)
This sounds like it could save me some time when I revisit AI. Has anyone tried this resource out? How is it?
#8
but no paths are being generated when the mission loads. When I run buildGraphNode() from the
console I get disk activity and the game freezes for quite a while. (I've waited 10 minutes before
killing it)
Also, the navNodes are visible in the mission when not in the editor, and are collideable.
This would rate a 5 if I could ascertain for certain that it works =)
08/23/2005 (9:27 pm)
Well I have it all compiled into the engine and I'm able to put the NavNodes in with the mission editor,but no paths are being generated when the mission loads. When I run buildGraphNode() from the
console I get disk activity and the game freezes for quite a while. (I've waited 10 minutes before
killing it)
Also, the navNodes are visible in the mission when not in the editor, and are collideable.
This would rate a 5 if I could ascertain for certain that it works =)
#9
I've updated the resource text to say this
Also: If you put
in the buildNodeGraph() method, right after the path name is generated, what does it say?
And also, set $NAV_DEBUG_LEVEL = 10 ( instead of 0 ), that would give you some more info on what the system does.
How many nodes are there in your map?
And yes, until the node graph has been ( successfully ) compiled, the nodes will be visible and solid. But you can actually use anything as nodes, so if you have some nice thing that only shows in the editor ( like the standard torque navigation nodes ) you can use those instead and rip out that call to "hideActiveNavNodes()" ( The downside to this is that you will not get the feedback of bad nodes that has not been linked into the navigation net ).
08/24/2005 (1:35 am)
OK Midhir: lets bet this baby on the road:I've updated the resource text to say this
Quote:If the directory "data/missions/paths" does not exist ( only "data/missions" usually exist ) you will have to create it manually, else all the hard compiling will be done and still it will not be able to save it for a rainy day.
Also: If you put
echo(%fileName);
in the buildNodeGraph() method, right after the path name is generated, what does it say?
And also, set $NAV_DEBUG_LEVEL = 10 ( instead of 0 ), that would give you some more info on what the system does.
How many nodes are there in your map?
And yes, until the node graph has been ( successfully ) compiled, the nodes will be visible and solid. But you can actually use anything as nodes, so if you have some nice thing that only shows in the editor ( like the standard torque navigation nodes ) you can use those instead and rip out that call to "hideActiveNavNodes()" ( The downside to this is that you will not get the feedback of bad nodes that has not been linked into the navigation net ).
#10
The engine crashed in Navigation.cs at line 196 when it tried to hide active nodes:
"if (NodeGraph.getNodeConnectionCount(%index) > 0) {"
After commenting the "if" block of code, it created the paths.
I just added 9 nodes for testing. Was I supposed to do anything else after adding them?
Nick
08/24/2005 (4:43 am)
Bjarne, extremely useful resource! I have implemented and successfully created the path file for my mission it but I had a problem.The engine crashed in Navigation.cs at line 196 when it tried to hide active nodes:
"if (NodeGraph.getNodeConnectionCount(%index) > 0) {"
After commenting the "if" block of code, it created the paths.
I just added 9 nodes for testing. Was I supposed to do anything else after adding them?
Nick
#11
This couldn't have come at a more perfect time in fact, literally today I was going to have a couple members of my final project team do generic path noding and I was going to have to create some sort of hack pathfinding system in a day or so... We have somwhere between 4-7 weeks to finish a game for our college final (we're the first game design course at our school ever so they figured it out a bit late lol) and this is the 4th week! So this resource was a lifesaver! Its very much appreciated :)
08/24/2005 (9:52 am)
Just did a quick test with this resource and it works like a charm! I haven't tested Nicks problem with hiding the nodes though (so can't say either way yet).This couldn't have come at a more perfect time in fact, literally today I was going to have a couple members of my final project team do generic path noding and I was going to have to create some sort of hack pathfinding system in a day or so... We have somwhere between 4-7 weeks to finish a game for our college final (we're the first game design course at our school ever so they figured it out a bit late lol) and this is the 4th week! So this resource was a lifesaver! Its very much appreciated :)
#12
I've added 100 Torque-Orcs and 72 nodes to the "Stronghold". It lags when you look at it, but not when you look away :)
Should be up in an hour or so.
08/24/2005 (9:59 am)
This resource seems to be well liked, so I decided to put some time into creating a "full" example map.I've added 100 Torque-Orcs and 72 nodes to the "Stronghold". It lags when you look at it, but not when you look away :)
Should be up in an hour or so.
#13
08/24/2005 (10:36 am)
@Bjarne, I just noticed that the second part of the second step is the same as the third step. Is that intentional? If so, it makes the instructions a little confusing to read. I like the idea and I'm going to try this with the AIPatrol/AIGuard resource as soon as I get a chance. Thanks for the resource.
#14
@Ryan Mick, yes that was a bit confusing. Gone now, thanx. :)
08/24/2005 (10:48 am)
OK, I added an example map with some simple usage code. It is in the download link ( had to put it on another server because I hit the 200K limit ).@Ryan Mick, yes that was a bit confusing. Gone now, thanx. :)
#15
Martin
08/24/2005 (12:41 pm)
@Bjarne: I could host the file if you want. I have a very fast server and don't need to worry about traffic. Drop me a mail if you want.Martin
#16
08/24/2005 (1:26 pm)
Seems to not work inside buildings though
#17
But I havent tried with interiors. Perhaps some of the ObjectType definitions in "linkNodeGraphFromMission()" are not suitable for interiors?
Can you explain in more detail the conditions where the nav-net fails? Is it during compilation, or run-time and so on?
@Muerte, thax but I've got it covered.
08/24/2005 (3:59 pm)
Quote: Seems to not work inside buildings though@King Tut, U sure Matthew? Can't see why it should not... They walk into the towers in the example map, had to tweak the nodes a bit to make sure they were visible from the outside node, but it works.
But I havent tried with interiors. Perhaps some of the ObjectType definitions in "linkNodeGraphFromMission()" are not suitable for interiors?
Can you explain in more detail the conditions where the nav-net fails? Is it during compilation, or run-time and so on?
@Muerte, thax but I've got it covered.
#18
08/24/2005 (4:07 pm)
Don't have that crashing problem any more.Quote:had to tweak the nodes a bit to make sure they were visible from the outside nodeBjarne, can you give us some tips on how or where to correctly place the nodes on the map? Thanks.
#19
Added some tips on node net design under the section Using the system - Nodes. Hope that helps.
08/24/2005 (5:24 pm)
Node tweaking, yummy! :)Added some tips on node net design under the section Using the system - Nodes. Hope that helps.
#20
08/24/2005 (7:34 pm)
I did another test and it seemed to have a problem when the closest node was on the other side of a .dif wall, I may be mistaken (happens plenty of times :) but it might not be pathfinding around interiors ? 
Torque Owner Bjarne Grönnevik