This is an old revision of the document!


Pathfinding

Pathfinding is of course a very popular mechanism used in many games. Developers very often use it in controlling enemies or opponents. Gorilla3D provides an easy to use component based on AStar algorithm. The TGorillaPathfindingAStar component helps you manage those automated movements. It abstracts your 3D world and obstacles into a 2D-Plane to compute a path from a starting point to a destination.

You can update obstacles at runtime and recompute the map to simulate a dynamic environment.

Each Pathfinder is working on a single so called agent, which is the object to be moved on computed path.

Setup

FPathFinder := TGorillaPathfindingAStar.Create(nil);
 
// apply the agent used as source (any TControl3D)
FPathFinder.Agent := FAgent;

Obstacles

Obstacles are restricted areas on the pathfinding map, where an agent can't walk onto, so the algorithm will find a way around this obstacle. You can add static or dynamic obstacles to the system.

// add a dynamic obstacle - needs update
FPathFinder.AddObstacle(FObstacle1, false); 
 
// add a static obstacle
FPathFinder.AddObstacle(FObstacle2);

When adding an obstacle to the pathfinder you can define a margin. Those margins are useful if space between to obstacles is very tight. To prevent the agent to run into a narrow area, where it looks like he won't fit.

FPathFinder.ObstacleMargin := TPoint3D.Create(1, 1, 1);

Dimensions

var LGridSize : TPoint;
    LSize3D : TPointF;
 
[...]
 
// set dimensions of grid and used 3D space
LGridSize := TPoint.Create(PATHFINDING_GRID_X, PATHFINDING_GRID_Z);
FPathFinder.GridDimensions := LGridSize;
 
LSize3D := TPointF.Create(PATHFINDING_3DSIZE_X, PATHFINDING_3DSIZE_Z);
FPathFinder.Size3D := LSize3D;

Computation

The TGorillaPathfindingAStar component is just a logical instance. No movement will be performed by default.

FPath : TGorillaPath3D;
 
[...]
 
// compute a path around all obstacles in given area
FPathFinder.FindPath(Point3D(-10, 0, 10));
 
FPath := FPathFinder.ToNewPath3D(FGorilla);
FPath.Parent := FGorilla;

To move the agent we need a TGorillaPath3DAnimation component and connect both instances.

FPathAnim := TGorillaPath3DAnimation.Create(FAgent);
 
// the path animation need to manipulate position of the agent
FPathAnim.Parent := FAgent;
 
// it should take 5 seconds and move straight on the computed path
FPathAnim.Duration := 5;
FPathAnim.SplineType := TGorillaSpline3DType.Linear;
 
// here we need to apply the computed path data
FPathAnim.Path := FPath.Path;
 
// make sure the agent is at same position as the pathfinder computed from
FAgent.Position.Point := FPathFinder.StartPosition;
 
// start movemten on path
FPathAnim.Enabled := true;
FPathAnim.Start();