Fishes are generally vigorous animals that move around constantly. If at some instant the sight of one fish is blocked by another fish passing by, the occlusion will most likely be cleared soon after--since both fish are in motion. The temporary blocking of sight should not result in abrupt changes in a fish's behavior. Therefore, occlusion tests against another fish tend to be unessential. To increase computational efficiency, the artificial fish performs occlusion tests only against large static environmental objects. In the current implementation, this includes cylindrical objects. Note that, for obstacles with more complex geometric shapes, cylinders can serve as their bounding boxes.
The algorithm for testing the intersection of a ray with a cylinder is simple, especially since the axis of each cylinder is parallel to the z-axis of the world coordinate system (see Fig. ). Let the coordinates of O and P in the world coordinate system be denoted by and , respectively. Then line can be represented by the parametric equation
where , , and . Let r denote the radius and h the height of the cylinder C under consideration. Its projection onto the XY-plane is a circle A which can be represented by the parametric equation
where (a,b,0) denotes the center of A. The occlusion-test algorithm we develop can be outlined as follows (all calculations are performed in the world coordinate system):
Substitute the x and y in Eq. () with those in Eq. () and solve for t. If the solutions and ( ) have real values and at least one of them is in [0,1], then do step 2; Otherwise, stop (P is not occluded by cylinder C).
Substitute the t in Eq. () with and to get the points of intersection. In fact, one only needs to calculate , i=1,2. If for i=1 or i=2, then point P is occluded. Otherwise, P is visible.
Xiaoyuan Tu | January 1996 |