How to calculate where bullet hits

Posted by lkjoel on Stack Overflow See other posts from Stack Overflow or by lkjoel
Published on 2012-11-23T18:59:38Z Indexed on 2012/11/23 23:04 UTC
Read the original article Hit count: 160

Filed under:
|
|
|

I have been trying to write an FPS in C/X11/OpenGL, but the issue that I have encountered is with calculating where the bullet hits. I have used a horrible technique, and it only sometimes works:

pos size, p;
size.x = 0.1;
size.z = 0.1; // Since the game is technically top-down (but in a 3D perspective)
              // Positions are in X/Z, no Y
float f; // Counter
float d = FIRE_MAX + 1 /* Shortest Distance */, d1 /* Distance being calculated */;
x = 0; // Index of object to hit
for (f = 0.0; f < FIRE_MAX; f += .01) {
    // Go forwards
    p.x = player->pos.x + f * sin(toRadians(player->rot.x));
    p.z = player->pos.z - f * cos(toRadians(player->rot.x));
    // Get all objects that collide with the current position of the bullet
    short* objs = _colDetectGetObjects(p, size, objects);
    for (i = 0; i < MAX_OBJECTS; i++) {
        if (objs[i] == -1) {
            continue;
        }
        // Check the distance between the object and the player
        d1 = sqrt(
                pow((objects[i].pos.x - player->pos.x), 2)
                        + pow((objects[i].pos.z - player->pos.z),
                                2));
        // If it's closer, set it as the object to hit
        if (d1 < d) {
            x = i;
            d = d1;
        }
    }
    // If there was an object, hit it
    if (x > 0) {
        hit(&objects[x], FIRE_DAMAGE, explosions, currtime);
        break;
    }
}

It just works by making a for-loop and calculating any objects that might collide with where the bullet currently is. This, of course, is very slow, and sometimes doesn't even work.

What would be the preferred way to calculate where the bullet hits? I have thought of making a line and seeing if any objects collide with that line, but I have no idea how to do that kind of collision detection.


EDIT: I guess my question is this: How do I calculate the nearest object colliding in a line (that might not be a straight 45/90 degree angle)? Or are there any simpler methods of calculating where the bullet hits? The bullet is sort of like a laser, in the sense that gravity does not affect it (writing an old-school game, so I don't want it to be too realistic)

© Stack Overflow or respective owner

Related posts about c

    Related posts about opengl