16 #include "obstacleAvoidance.h"
18 ObstacleAvoidance::ObstacleAvoidance(
AICharacter *ai_char,
float feeler_length) {
20 _feeler = feeler_length;
23 ObstacleAvoidance::~ObstacleAvoidance() {
36 PT(
BoundingVolume) np_bounds = _ai_char->get_node_path().get_bounds();
39 double distance = 0x7fff ;
40 double expanded_radius;
43 for(
unsigned int i = 0; i < _ai_char->_world->_obstacles.size(); ++i) {
44 PT(
BoundingVolume) bounds = _ai_char->_world->_obstacles[i].get_bounds();
46 LVecBase3 near_obstacle = _ai_char->_world->_obstacles[i].get_pos() - _ai_char->get_node_path().
get_pos();
48 if((near_obstacle.
length() < distance) && (_ai_char->_world->_obstacles[i].get_pos() != _ai_char->get_node_path().
get_pos())) {
49 _nearest_obstacle = _ai_char->_world->_obstacles[i];
50 distance = near_obstacle.
length();
51 expanded_radius = bsphere->get_radius() + np_sphere->get_radius();
56 feeler *= (expanded_radius + np_sphere->get_radius()) ;
57 to_obstacle = _nearest_obstacle.
get_pos() - _ai_char->get_node_path().
get_pos();
62 if((_nearest_obstacle) && (perp.
length() < expanded_radius - np_sphere->get_radius()) && (project.
length() < feeler.
length())) {
78 _ai_char->_steering->
turn_off(
"obstacle_avoidance_activate");
79 _ai_char->_steering->
turn_on(
"obstacle_avoidance");
97 PT(
BoundingVolume) np_bounds = _ai_char->get_node_path().get_bounds();
99 double distance_needed = offset.
length() - bsphere->get_radius() - np_sphere->get_radius();
103 float forward_component = offset.dot(direction);
104 LVecBase3 projection = forward_component * direction;
105 LVecBase3 perpendicular_component = offset - projection;
106 double p = perpendicular_component.
length();
108 LVecBase3 avoidance = perpendicular_component;
110 avoidance = (avoidance * _ai_char->get_max_force() * _ai_char->_movt_force) / (p + 0.01);
113 _ai_char->_steering->
turn_on(
"obstacle_avoidance_activate");
114 _ai_char->_steering->
turn_off(
"obstacle_avoidance");
This is the base class for all three-component vectors and points.
This defines a bounding sphere, consisting of a center and a radius.
float length_squared() const
Returns the square of the vector's length, cheap and easy.
This is a three-component vector distance (as opposed to a three-component point, which represents a ...
static LVector3f forward(CoordinateSystem cs=CS_default)
Returns the forward vector for the given coordinate system.
bool obstacle_detection()
This function checks if an obstacle is near to the AICharacter and if an obstacle is detected returns...
This is an abstract class for any volume in any sense which can be said to define the locality of ref...
float length() const
Returns the length of the vector, by the Pythagorean theorem.
LPoint3 get_pos() const
Retrieves the translation component of the transform.
void turn_off(string ai_type)
This function turns off any aiBehavior which is passed as a string.
void turn_on(string ai_type)
This function turns on any aiBehavior which is passed as a string.
LVector3 get_relative_vector(const NodePath &other, const LVecBase3 &vec) const
Given that the indicated vector is in the coordinate system of the other node, returns the same vecto...
void obstacle_avoidance_activate()
This function activates obstacle_avoidance if a obstacle is detected.
bool normalize()
Normalizes the vector in place.
LVecBase3 do_obstacle_avoidance()
This function returns the force necessary by the AICharacter to avoid the nearest obstacle detected b...