private void avoid(Interactive3DObject collisionObject, int collisionHandle) { float distance = position.dst(collisionObject.getPosition()); float minDistance = getCollisionRadius() + collisionObject.getCollisionRadius(); float urgency = (float) (1) / (distance - minDistance); if (urgency > 20 || urgency < 0) { urgency = 20; } boolean destinationsCollide = destination.dst(((MovableI3DO) collisionObject).destination) < (minDistance) && position.dst(destination) < minDistance; // System.out.println("Urgency: " + urgency); if (urgency >= 1 && collisionHandle != COLLISION_BACK) { pace = (float) (maxPace * (1 / Math.sqrt(urgency))); } else { pace = maxPace; } if (urgency > (float) 0.5 && urgency + (float) 0.2 > avoidUrgency && !destinationsCollide && collisionHandle != COLLISION_BACK) { // System.out.println("Urgency: " + urgency); center.set( (float) (position.x + collisionObject.position.x) / 2, (float) (position.z + collisionObject.position.z) / 2); delta.set(center.x - position.x, center.y - position.z); ortho.set(-delta.y, delta.x).scl((float) 1 / (ortho.len())); calcRotationAngle(ortho.x, ortho.y); } else if (destinationsCollide && distance - (float) 0.2 <= minDistance && destinationsCollide) { setDestination(this.position); } else if (urgency + (float) 0.2 < avoidUrgency && distance > minDistance) { System.out.println("back to orginal destination!"); this.calcRotationAngle(destination.x - this.position.x, destination.z - this.position.z); avoid = false; } avoidUrgency = urgency; }
public boolean collidesWith(Interactive3DObject collideObject) { float minDist = (collideObject.getCollisionRadius() + this.getCollisionRadius()); // the distance at which both circles overlap // float distObjects = position.dst(collideObject.getPosition()); // distance between both // objects; float keepDist = (float) 1.5 * minDist; // try to keep at least this distance float distLinePos = Intersector.distanceLinePoint( v2(position), v2(destination), v2( collideObject .getPosition())); // distance between line from pos to dest and collideObject // position if (distLinePos < keepDist) { return true; } else { return false; } }