I learned how to implement the Obstacle Avoidance steering behavior from this tutorial. The approach depicted in this tutorial (simplified) is this (note that I'm using rectangular OBBs for obstacles, not circles):
The entity that avoids obstacles will have a 'ahead' vector, representing the entity's 'sight'. It will be equal to the velocity vector, but scaled to some length (the "sight distance").
For each entity in the "sight distance" radius from the entity, we check if it contains the the 'edge' of the ahead vector, marked with a red dot (actually the vector itself treated as a point):
For an entity that contains the red dot, we calculate the vector from the center of the entity to the red dot:
This vector (scaled by a scalar MAX_AVOIDANCE_FORCE
) is the avoidance force. We apply it on our entity, and it should avoid the obstacle.
However, what happens in practice after applying the force is this:
As you can see, the entity is about to get stuck on the obstacle. That's because it doesn't sense it's about to collide, because the obstacle doesn't contain the edge of the 'ahead' vector.
So: what would be a good solution to this problem? How should I implement the algorithm?