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)
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)