add seeking multiple targets
This version still slows down even if not necessary.
This commit is contained in:
parent
6c01c80bfa
commit
d5574b6cfd
59
Boid.pde
59
Boid.pde
|
@ -24,6 +24,10 @@ class Boid
|
||||||
float rotational_acceleration;
|
float rotational_acceleration;
|
||||||
KinematicMovement kinematic;
|
KinematicMovement kinematic;
|
||||||
PVector target;
|
PVector target;
|
||||||
|
PVector direction;
|
||||||
|
ArrayList<PVector> waypoints;
|
||||||
|
boolean stillInRadius = true;
|
||||||
|
int currentTarget = 0;
|
||||||
|
|
||||||
Boid(PVector position, float heading, float max_speed, float max_rotational_speed, float acceleration, float rotational_acceleration)
|
Boid(PVector position, float heading, float max_speed, float max_rotational_speed, float acceleration, float rotational_acceleration)
|
||||||
{
|
{
|
||||||
|
@ -39,7 +43,6 @@ class Boid
|
||||||
{
|
{
|
||||||
// TODO: Implement seek here
|
// TODO: Implement seek here
|
||||||
|
|
||||||
|
|
||||||
//This makes a vector with the direction our boid needs to go to
|
//This makes a vector with the direction our boid needs to go to
|
||||||
PVector direction = PVector.sub(target, kinematic.position);
|
PVector direction = PVector.sub(target, kinematic.position);
|
||||||
|
|
||||||
|
@ -49,7 +52,8 @@ class Boid
|
||||||
//println(atan2(direction.y, direction.x) + " " + normalize_angle_left_right(kinematic.getHeading()));
|
//println(atan2(direction.y, direction.x) + " " + normalize_angle_left_right(kinematic.getHeading()));
|
||||||
|
|
||||||
float directionalThreshold = .1;
|
float directionalThreshold = .1;
|
||||||
float angleToTarget = atan2(direction.y, direction.x) - normalize_angle_left_right(kinematic.getHeading());
|
//You have to normalize this too or the boid goes the wrong way sometimes
|
||||||
|
float angleToTarget = normalize_angle_left_right(atan2(direction.y, direction.x) - normalize_angle_left_right(kinematic.getHeading()));
|
||||||
float arrivalThreshold = 60.0;
|
float arrivalThreshold = 60.0;
|
||||||
|
|
||||||
//This just draws a circle for visual debugging purposes
|
//This just draws a circle for visual debugging purposes
|
||||||
|
@ -59,29 +63,32 @@ class Boid
|
||||||
//println(angleToTarget);
|
//println(angleToTarget);
|
||||||
|
|
||||||
//if the angle is larger than the threshold in the positive direction, rotate counterclockwise
|
//if the angle is larger than the threshold in the positive direction, rotate counterclockwise
|
||||||
//Need to rotate slower when the boid is closer to the target
|
if (angleToTarget > directionalThreshold && direction.mag() > 30) {
|
||||||
|
|
||||||
if (angleToTarget > directionalThreshold && direction.mag() > arrivalThreshold) {
|
|
||||||
kinematic.increaseSpeed(0.0, +1);
|
kinematic.increaseSpeed(0.0, +1);
|
||||||
|
|
||||||
|
} else if (angleToTarget > directionalThreshold && direction.mag() > 15) {
|
||||||
|
kinematic.increaseSpeed(0.0, +.5);
|
||||||
|
|
||||||
//if the angle is smaller than the threshold in the negative direction, rotate clockwise
|
//if the angle is smaller than the threshold in the negative direction, rotate clockwise
|
||||||
} else if (angleToTarget < -directionalThreshold && direction.mag() > arrivalThreshold) {
|
} else if (angleToTarget < -directionalThreshold && direction.mag() > 30) {
|
||||||
kinematic.increaseSpeed(0.0, -1);
|
kinematic.increaseSpeed(0.0, -1);
|
||||||
|
|
||||||
|
} else if (angleToTarget < -directionalThreshold && direction.mag() > 15) {
|
||||||
|
kinematic.increaseSpeed(0.0, -.5);
|
||||||
|
|
||||||
//if the angle is within our threshold, stop our rotational velocity by rotating opposite
|
//if the angle is within our threshold, stop our rotational velocity by rotating opposite
|
||||||
} else if (directionalThreshold > angleToTarget) {
|
} else if (directionalThreshold > angleToTarget) {
|
||||||
|
|
||||||
if (kinematic.getRotationalVelocity() > 0) {
|
if (kinematic.getRotationalVelocity() > 0) {
|
||||||
kinematic.increaseSpeed(0.0, -1);
|
kinematic.increaseSpeed(0.0, -kinematic.getRotationalVelocity());
|
||||||
}
|
}
|
||||||
else if (kinematic.getRotationalVelocity() < 0) {
|
else if (kinematic.getRotationalVelocity() < 0) {
|
||||||
kinematic.increaseSpeed(0.0, 1);
|
kinematic.increaseSpeed(0.0, kinematic.getRotationalVelocity());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Sometimes our Boid just goes and does weird things and I don't know why
|
|
||||||
|
|
||||||
//if the target is outside its arrival threshold, accelerate.
|
//if the target is outside its arrival threshold, accelerate.
|
||||||
//if the target is inside its arrival threshold, accelerate backwards until the speed is 0.
|
//if the target is inside its arrival threshold, accelerate backwards until the speed is 0.
|
||||||
|
@ -111,6 +118,27 @@ class Boid
|
||||||
//drawing a line for testing purposes
|
//drawing a line for testing purposes
|
||||||
//line(kinematic.position.x, kinematic.position.y, kinematic.position.x + direction.x, kinematic.position.y + direction.y);
|
//line(kinematic.position.x, kinematic.position.y, kinematic.position.x + direction.x, kinematic.position.y + direction.y);
|
||||||
|
|
||||||
|
//handling going to multiple targets
|
||||||
|
|
||||||
|
//If within 5 units, move to next target
|
||||||
|
if (direction.mag() < 5) {
|
||||||
|
//This ensures that the same target can't trigger moving to the next target twice
|
||||||
|
if (stillInRadius == false) {
|
||||||
|
//this ensures that waypoints get cleared after finishing checking all targets
|
||||||
|
if (currentTarget < waypoints.size() - 1) {
|
||||||
|
currentTarget++;
|
||||||
|
} else {
|
||||||
|
currentTarget = 0;
|
||||||
|
waypoints = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stillInRadius = true;
|
||||||
|
if (waypoints != null) {
|
||||||
|
seek(waypoints.get(currentTarget));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
stillInRadius = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -166,13 +194,22 @@ class Boid
|
||||||
void seek(PVector target)
|
void seek(PVector target)
|
||||||
{
|
{
|
||||||
this.target = target;
|
this.target = target;
|
||||||
|
println("seeking");
|
||||||
}
|
}
|
||||||
|
|
||||||
void follow(ArrayList<PVector> waypoints)
|
void follow(ArrayList<PVector> waypoints)
|
||||||
{
|
{
|
||||||
// TODO: change to follow *all* waypoints
|
// TODO: change to follow *all* waypoints
|
||||||
this.target = waypoints.get(0);
|
|
||||||
|
this.waypoints = waypoints;
|
||||||
|
|
||||||
|
seek(waypoints.get(0));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue