-
Notifications
You must be signed in to change notification settings - Fork 52
Open
Description
in function distanceSquared().
If two Vehicles completely overlap in same position, distanceSquared will be 0, causing a division - by - zero error (NAN).
template<class Super>
OpenSteer::Vec3
OpenSteer::SteerLibraryMixin<Super>::
steerForSeparation (const float maxDistance,
const float cosMaxAngle,
const AVGroup& flock)
{
// steering accumulator and count of neighbors, both initially zero
Vec3 steering;
int neighbors = 0;
// for each of the other vehicles...
AVIterator flockEndIter = flock.end();
for (AVIterator otherVehicle = flock.begin(); otherVehicle != flockEndIter; ++otherVehicle )
{
if (inBoidNeighborhood (**otherVehicle, radius()*3, maxDistance, cosMaxAngle))
{
// add in steering contribution
// (opposite of the offset direction, divided once by distance
// to normalize, divided another time to get 1/d falloff)
const Vec3 offset = (**otherVehicle).position() - position();
const float distanceSquared = offset.dot(offset);
steering += (offset / -distanceSquared);
// count neighbors
++neighbors;
}
}
// divide by neighbors, then normalize to pure direction
// bk: Why dividing if you normalize afterwards?
// As long as normilization tests for @c 0 we can just call normalize
// and safe the branching if.
/*
if (neighbors > 0) {
steering /= neighbors;
steering = steering.normalize();
}
*/
steering = steering.normalize();
return steering;
}Metadata
Metadata
Assignees
Labels
No labels