Exemplo n.º 1
0
  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;
  }
Exemplo n.º 2
0
  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;
    }
  }