# BABYLON-STEERING

![](https://img.shields.io/badge/type-JS_Library-brightgreen.svg "Project type")
![](https://img.shields.io/github/repo-size/LorenzoCorbella74/babylon-steering "Repository size")
![](https://img.shields.io/github/package-json/v/LorenzoCorbella74/babylon-steering)



## What is
A steering behaviors library for [Babylon.js](https://www.babylonjs.com/) for moving entities in the x/z plane. The library was born thanks to these [tutorials](https://gamedevelopment.tutsplus.com/series/understanding-steering-behaviors--gamedev-12732) and the library [three-steer](https://github.com/erosmarcon/three-steer).

The following behavious are supported:
* Seek, Seek with Arrive and Attract (Seek with intensity)
* Flee
* Arrive
* Pursue
* Evade
* Interpose
* Wander
* Collision Avoidance
* Follow Path
* Follow Leader
* Queue
* Cohesion, separation and alignment (Flocking)
* Hide
* Apply general force

Steering Entities can:
* look at a specific target with the .lookAt() method
* look where they are going with the .lookWhereGoing() method


## How to setup

Include `babylon-steering` library:
```javascript

import babylon-steering from 'babylon-steering';

```

Create a basic Babylon.js 3D scene with a mesh and simply instantiate a Steering Entity:

```javascript

const redSphere = new SteeringVehicle(my_mesh, engine, option);

```

Add the behavior/s to the steering entity and the update method inside main render/animation loop:

```javascript

scene.executeWhenReady(function () {
        engine.runRenderLoop(function () {

            my_mesh
                .seekWithArrive(greenTarget, 50)
                .hasInConeOfView(arrayOfEnemies)
                .avoid(obstacleIstances)
                .applyForce(new BABYLON.Vector3(1, 0, 0.75))    // For istance can be WIND...
                .lookWhereGoing(true);

            my_mesh.animate();  // Update the Steering Vehicle

            scene.render();
        });
});

```
# Combine behaviours

It is possible to combine many simultaneous steering forces by passing the following parameters to the `.animate()` function according to the four methods described in this [bog post](https://alastaira.wordpress.com/2013/03/13/methods-for-combining-autonomous-steering-behaviours/):
* `priority` for Priority Arbitration
* `weighted` for Weighted Blending, 
* `probability` for 'Prioritised Dithering'
* `truncated` for 'Weighted Prioritised Truncated Sum'

```javascript

blueSphere.animate('blend');  // 'blend' 'priority' 'probability'  'truncated' 

```

## Examples

To test some examples just:
```bash
# 1)istall dependencies
npm install
# 2)run development server serving static demo pages at localhost:4000
npm start

```

## Bugs
- Uhm...let me know!

## Built With

ES6 Javascript, [microbundle](https://github.com/developit/microbundle),

## License

This project is licensed under the ISC License.