development & media



OpenGL Reef Tank - Back to main page
2002-04-14 Collision Avoidance

One of the most challenging things to make a realistic looking fish tank is to keep things from swimming through other things. I haven't quite gotten it right yet in the OpenGL Reef Tank, but it works most of the time. At the beginning of the project, I just was trying to get my fish to swim around smoothly, and to do that, I ended up figuring out where each fish will be ahead of time, as describe in another column. Doing that really helped me out when it came time to keep the fish from colliding with things. Here's what each fish does now to avoid collisions:

  • First, a fish cycles though the other fish to see if it will collide with any of them. If it is going to, the action taken differs depending on the relative "rank" of the two fish. A higher rank fish will ignore a lower rank fish, while a lower rank fish will turn around if it's going to hit a higher rank one. Two equal rank fish will each move to avoid the other.
  • Second, a fish cycles through each rock to see if it will collide with it. If it will, it will turn and swim directly away from the rock.
  • Lastly, if a fish will end up going out of the tank on its next move, it will turn around and slow down a bit.

Each successive step in that process will override the previous ones, since each successive collision would be more serious if it occurred.

One problem with the above collision avoidance scheme is the cycling through of objects in the tank. If a fish figures it will have to change velocity to avoid the first fish (or rock) in its list, and then decides it must change again for another one, it possibly could go back to hitting the first one.




©2002 shrugsoft - got a problem with that? drop us a line