Radar Displays

Started by
1 comment, last by flying starfish 20 years, 10 months ago
What''s the best way to go abou creating a radar display from a series of object points in my scene? I want to reject everything beyond 5000.0f units or so, and I want to differentiate between objects in front of the player and objects behind them. I''m working in D3D8 - can anyone give me some pointers or ideas? ---- flying starfish
----flying starfish
Advertisement

Hi
For checking if the object is within the radar range use a distance check. For checking if the object is infront or behind use the dot product.

Here is some psuedo code that should help you get started.

rad = the origin of the radar in world space. I.e usually it is the same position as the object being controlled by the player.

In the dotproduct part you may have to swap over the infront or behind results. oh and if it is 0 its on the x axis of the radar.

for each object;    radDistSQ = 5000*5000    dx = (obj.x-rad.x)    dy = (obj.y-rad.y)    dz = (obj.z-rad.z)    dist = dx*dx + dy*dy + dz*dz      if dist > radDistSQ then object is not within radar - move onto next object in loop      // object is within radar is if infront or behind.    radarfrontvector = (0,0,1) - pointing along the z axis (into screen)    objToRadarVector = (dx, dy, dz)      if dotproduct (radarfrontvector, objtoRadarVector ) < 0 then        object is behind player    else        object is infront of player.



[edited by - noisecrime on June 19, 2003 8:35:12 AM]
Project the player''s look-at vector into the horizontal plane. If your ground lies in y=0 for example, then the projected vector is |x, 0, z| where x and z are the x and z coordinates of the look-at vector. Be sure to normalize after the projection.

Next, for each object you want to plot on the radar, calculate the difference vector as such:

diff = object_location - player_location

If the dot product of diff with itself (dist_squared) is greater than (5000 * 5000) then the object is more than 5000 units away and you can reject it. Otherwise, project the diff vector into the horizontal plane as before, normalize the diff vector, and take the dot product of diff with the projected look-at vector. The angle theta between the player''s view direction and the object is given by the acos function: theta = acos(dotproduct(projected_diff, projected_lookat))

Now comes the fun part. cos(theta) = dotproduct(projected_diff, projected_lookat) which we already calculated, so we don''t need to find it again. sin(theta) can be figured easily given the theta we just calculated. Choose some scale factor S that will correspond to the "scale" of your radar, such as 100 world units per pixel. We have dist_squared from earlier, so we take the square root to obtain dist. Then the screen coordinates of the radar blip are given by x,y:

x = cos(theta) * dist * S + center_of_radar_x
y = sin(theta) * dist * S + center_of_radar_y

This will make "up" always be the direction the player is facing on the radar. You can easily tweak that if you want by rotating the above x,y coordinates about the center of the radar. You can also obtain a very interesting effect by not taking the square root of dist, so that radar blips farther away seem to move faster than ones close by.

Hope that helps some.

Wielder of the Sacred Wands
[Work - ArenaNet] [Epoch Language] [Scribblings]

This topic is closed to new replies.

Advertisement