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");
float length_squared() const
Returns the square of the vector's length, cheap and easy.
This is the base class for all three-component vectors and points.
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...
This defines a bounding sphere, consisting of a center and a radius.
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...
void turn_off(string ai_type)
This function turns off any aiBehavior which is passed as a string.
LPoint3 get_pos() const
Retrieves the translation component of the transform.
void turn_on(string ai_type)
This function turns on any aiBehavior which is passed as a string.
void obstacle_avoidance_activate()
This function activates obstacle_avoidance if a obstacle is detected.
float length() const
Returns the length of the vector, by the Pythagorean theorem.
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...