@web-engine-dev/pathfinding
Navigation and pathfinding systems including A*, JPS, HPA*, flow fields, NavMesh, and RVO.
Features
- A* Pathfinding: Classic grid-based pathfinding
- Jump Point Search: Optimized A* for uniform grids
- HPA*: Hierarchical pathfinding for large maps
- Flow Fields: Group movement for many agents
- NavMesh: 3D navigation mesh pathfinding
- RVO: Reciprocal Velocity Obstacles for avoidance
Installation
bash
npm install @web-engine-dev/pathfinding
# or
pnpm add @web-engine-dev/pathfindingQuick Start
typescript
import { Grid, AStar, NavMesh } from '@web-engine-dev/pathfinding';
// Grid-based pathfinding
const grid = new Grid(100, 100);
grid.setWalkable(5, 5, false); // Add obstacle
const astar = new AStar(grid);
const path = astar.findPath({ x: 0, y: 0 }, { x: 50, y: 50 });
// NavMesh pathfinding
const navmesh = NavMesh.fromGeometry(levelGeometry);
const path3d = navmesh.findPath(start, end);API Overview
Grid
typescript
const grid = new Grid(width, height, {
defaultWalkable: true,
diagonal: true,
diagonalCost: 1.414,
});
grid.setWalkable(x, y, walkable);
grid.setCost(x, y, cost);
grid.isWalkable(x, y);A* Algorithm
typescript
const astar = new AStar(grid, {
heuristic: 'manhattan', // 'manhattan', 'euclidean', 'octile'
diagonalMovement: true,
maxIterations: 10000,
});
const path = astar.findPath(start, end);Jump Point Search
typescript
const jps = new JumpPointSearch(grid);
const path = jps.findPath(start, end);
// Much faster than A* for uniform-cost gridsFlow Fields
typescript
const flowField = new FlowField(grid);
flowField.setGoal(goalX, goalY);
flowField.build();
// Get direction at any point
const direction = flowField.getDirection(x, y);NavMesh
typescript
const navmesh = NavMesh.fromGeometry(geometry);
const path = navmesh.findPath(start, end);
const smoothPath = navmesh.smooth(path);
// Check if point is on navmesh
const onMesh = navmesh.isPointOnMesh(point);
// Get nearest point on navmesh
const closest = navmesh.getClosestPoint(point);RVO (Collision Avoidance)
typescript
const rvo = new RVOSimulator({
timeHorizon: 2.0,
neighborDist: 5.0,
maxNeighbors: 10,
});
rvo.addAgent(position, velocity, radius);
rvo.setGoal(agentId, targetPosition);
rvo.update(deltaTime);
const newVelocity = rvo.getAgentVelocity(agentId);