Esempio n. 1
0
  def _steerForAvoidObstacles(self):
    """
    Return a steering force to avoid the nearest obstacle that is
    considered a collision threat, or None to indicate that no obstacle
    avoidance steering is required.

    """
    # Check for collisions with obstacles.
    collision = False
    obstacleHandler.sortEntries()
    for i in range(obstacleHandler.getNumEntries()):
      entry = obstacleHandler.getEntry(i)
      if entry.getInto() == self.tube:
        collision = True
        pos = entry.getSurfacePoint(render)
        nrml = entry.getSurfaceNormal(render)

    if collision is False: return None

    # Compute steering to avoid the collision.
    nrml = SteerVec(nrml.getX(),nrml.getY())
    forward = self._velocity
    forward.normalize()
    steeringdirection = nrml.perpendicularComponent(forward)
    steeringdirection.normalize()
    brakingdirection = -self._velocity
    brakingdirection.normalize()
    md = self._velocity.length() + self.radius
    mf = self.maxforce
    p = SteerVec(pos.getX(),pos.getY())
    d = (self._pos - p).length()
    if d < 0: d = 0
    steeringforce = mf - ((d/md)*mf)
    brakingforce = mf - ((sqrt(d)/md)*mf)
    return (brakingdirection*brakingforce)+(steeringdirection*steeringforce)
Esempio n. 2
0
    def _steerForAvoidObstacles(self):
        """
    Return a steering force to avoid the nearest obstacle that is
    considered a collision threat, or None to indicate that no obstacle
    avoidance steering is required.

    """
        # Check for collisions with obstacles.
        collision = False
        obstacleHandler.sortEntries()
        for i in range(obstacleHandler.getNumEntries()):
            entry = obstacleHandler.getEntry(i)
            if entry.getInto() == self.tube:
                collision = True
                pos = entry.getSurfacePoint(render)
                nrml = entry.getSurfaceNormal(render)

        if collision is False: return None

        # Compute steering to avoid the collision.
        nrml = SteerVec(nrml.getX(), nrml.getY())
        forward = self._velocity
        forward.normalize()
        steeringdirection = nrml.perpendicularComponent(forward)
        steeringdirection.normalize()
        brakingdirection = -self._velocity
        brakingdirection.normalize()
        md = self._velocity.length() + self.radius
        mf = self.maxforce
        p = SteerVec(pos.getX(), pos.getY())
        d = (self._pos - p).length()
        if d < 0: d = 0
        steeringforce = mf - ((d / md) * mf)
        brakingforce = mf - ((sqrt(d) / md) * mf)
        return (brakingdirection * brakingforce) + (steeringdirection *
                                                    steeringforce)