import { SteeringBehavior } from '../SteeringBehavior.js';
import { Vector3 } from '../../math/Vector3.js';
const desiredVelocity = new Vector3();
/**
* This steering behavior produces a force that directs an agent toward a target position.
*
* @author {@link https://github.com/Mugen87|Mugen87}
* @augments SteeringBehavior
*/
class SeekBehavior extends SteeringBehavior {
/**
* Constructs a new seek behavior.
*
* @param {Vector3} target - The target vector.
*/
constructor( target = new Vector3() ) {
super();
/**
* The target vector.
* @type {Vector3}
*/
this.target = target;
}
/**
* Calculates the steering force for a single simulation step.
*
* @param {Vehicle} vehicle - The game entity the force is produced for.
* @param {Vector3} force - The force/result vector.
* @param {Number} delta - The time delta.
* @return {Vector3} The force/result vector.
*/
calculate( vehicle, force /*, delta */ ) {
const target = this.target;
// First the desired velocity is calculated.
// This is the velocity the agent would need to reach the target position in an ideal world.
// It represents the vector from the agent to the target,
// scaled to be the length of the maximum possible speed of the agent.
desiredVelocity.subVectors( target, vehicle.position ).normalize();
desiredVelocity.multiplyScalar( vehicle.maxSpeed );
// The steering force returned by this method is the force required,
// which when added to the agent’s current velocity vector gives the desired velocity.
// To achieve this you simply subtract the agent’s current velocity from the desired velocity.
return force.subVectors( desiredVelocity, vehicle.velocity );
}
/**
* Transforms this instance into a JSON object.
*
* @return {Object} The JSON object.
*/
toJSON() {
const json = super.toJSON();
json.target = this.target.toArray( new Array() );
return json;
}
/**
* Restores this instance from the given JSON object.
*
* @param {Object} json - The JSON object.
* @return {SeekBehavior} A reference to this behavior.
*/
fromJSON( json ) {
super.fromJSON( json );
this.target.fromArray( json.target );
return this;
}
}
export { SeekBehavior };